最近在做一个小型RAG项目,文档库是产品手册。我用的Prompt是:“请根据用户问题判断以下段落是否相关,只回答‘是’或‘否’。”但发现LLM经常把一些边缘相关的段落也判成“是”,导致召回一堆废话,回答质量下降。我试过加few-shot例子和调整温度,效果时好时坏。也试过让模型输出置信度分数,但感觉它自己也不太确定。请问大家一般怎么设计这种相关性判断的Prompt?或者有没有更好的替代方案?感谢!
RAG里用Prompt让LLM判断文档相关性,效果总是不稳怎么办?
全部回复
共 151 条我之前也踩过这个坑,后来发现与其让LLM二选一,不如直接让它输出“相关”和“不相关”的理由,再根据理由里的关键词或实体重合度做个简单过滤。另外温度调低到0.1以下,加上一个“不确定就说不相关”的system指令,能压住不少幻觉。你试过用embedding模型先算相似度做个粗筛吗?把阈值卡紧一点,再让LLM只处理top5的段落,稳定性会好很多。
我之前也踩过这个坑,后来发现别让LLM直接做二分类,改成让它先抽取“支持用户问题的关键句”再判断,这样能逼它聚焦,边缘段落基本会被过滤掉。另外你可以试试把判断标准写得更具体,比如“必须包含能直接回答问题的操作步骤或参数数值”,模糊的“相关”定义才是飘忽不定的根源。还有个小技巧,把问题里核心实体抽出来做关键词硬过滤,LLM只负责精排,召回垃圾能少一大半。
我之前也踩过这个坑,后来发现让LLM直接二分类确实容易“手松”。可以试试把判断标准改成对比式,比如给两段候选文本让它选更相关的一个,这样比单独判断稳定很多。另外如果产品手册结构比较清晰,可以先用关键词或向量初筛到top5再让模型精排,别把所有压力都给prompt。还有个小技巧,把“是/否”改成“完全相关/部分相关/不相关”三档输出,后续只保留第一档,比单纯降阈值好用。
试试让LLM输出JSON带reason,再设个阈值过滤低分的,比光给分稳不少。
我之前也踩过这个坑,后来发现别让LLM做二元判断,改成让它先提取段落里跟问题相关的关键词或句子,再判断有没有实质信息,这样能过滤掉很多“沾边但不解决问题”的内容。另外可以把阈值逻辑放到代码里,让模型输出1-5的分数,然后你按分数段截断,别完全信它的自信度,多调几次你会找到那个临界值。你试过用embedding相似度做个预筛选,再让LLM只对Top N段落做精排吗?我这样改之后稳定性明显好了。
试试让模型输出JSON带理由,再按关键词二次过滤,比单纯是/否稳多了。
别纠结prompt了,直接上交叉编码器重排,小模型效果都比LLM判相关性靠谱。
试试把判断标准改成“是否包含回答问题的关键信息”,能砍掉不少边缘case,或者干脆用embedding相似度做初筛再让LLM兜底。
我之前也踩过这个坑,后来发现与其纠结prompt,不如直接改检索策略。可以试试把文档切得更细,然后用bm25和向量检索做混合召回,多召回几轮再让LLM精排,这样判断压力小很多。
另外你那个“是/否”的判断太生硬了,模型容易倾向“是”。我后来改成让它输出相关性的理由,哪怕不完美,至少能过滤掉一部分废话。置信度分数确实不靠谱,别太依赖。
还有个土办法:手动挑几组典型边界案例,做成hard negative喂给模型,比单纯加few-shot管用。你产品手册领域性强,可能得专门调一版判断规则。
我之前也踩过这个坑,后来发现单纯让模型二选一太粗暴了,边缘段落它肯定倾向给“是”。不如换个思路,让它先输出原文里跟问题相关的关键词或句子,再基于这个做判断,答案会稳很多。另外可以试试把判断标准改成“是否包含回答该问题所需的事实性信息”,而不是“是否相关”,这样能滤掉不少泛泛而谈的废话。
我之前也踩过这个坑,用LLM直接判断相关与否确实不太靠谱,尤其是产品手册这种领域,很多段落看着都沾点边。后来我换了个思路,不让它做二分类,而是让它从候选段落里挑出最相关的top 2或top 3,反而稳定不少,因为排序比绝对判断要容易。还有个办法是先把用户问题改写成几个关键检索词,再用这些词去做BM25或向量召回,LLM只负责最后的重排,这样它压力小很多。置信度那个我也试过,基本没用,模型说0.8和0.6其实没啥区分度。如果非要用LLM判断,建议把“是/否”改成“这段能直接回答用户问题吗”,问题更具体,误判会少一些。另外可以考虑用一个小点的模型专门微调一个相关性分类器,几百条标注就能比通用Prompt稳。
我最近也踩过这坑,光靠LLM打“是/否”确实不太靠谱,模型对“边缘相关”的判定特别松。后来改成让它输出0-10的相关性打分,再设个阈值卡一下,比纯二分类稳不少。另外你可以考虑加个rerank模型做二次过滤,便宜又比prompt折腾省心。产品手册这种场景,其实关键词召回加规则过滤可能都比纯LLM判断靠谱,别太迷信prompt。