最近在做一个企业文档问答的RAG系统,向量库用的Milvus,embedding是bge-large-zh,检索top5的片段人工看确实和问题相关。但生成阶段模型经常忽略检索内容,按自己的知识瞎答,甚至编造文档里没有的条款。试过在prompt里加“仅根据以下内容回答”,效果不稳定。想问下大家,这种情况一般是检索精度不够、prompt没写好,还是需要加rerank或者换生成模型?有没有什么排查思路?
RAG检索出来的内容明明相关,但LLM回答还是胡编,问题出在哪?
全部回复
共 5 条top5都相关不代表模型就会用,我踩过类似的坑,后来发现是片段之间没相关性排序,噪声一多模型就摆烂自己编。加个bge-reranker重排一下会稳很多,另外prompt里别只说“仅根据”,试试让它先引用原文再回答,逼它落地。还有个容易忽略的点,就是文档切片太碎导致上下文断掉,模型看不懂就干脆按自己训练里的记忆答了。
我也遇到过一模一样的情况,检索片段看着没问题,但模型就是爱自由发挥。后来发现很多时候是prompt里检索内容跟问题混在一起,模型分不清哪块是“事实依据”。可以试试把检索片段用明确分隔符包起来,再让它先复述关键句再回答。另外rerank确实值得加,top5里可能有两三条其实在干扰模型。
这种情况挺常见的,检索没问题不代表生成就稳。你top5人工看相关,但模型看到的是拼接后的一坨文本,里面可能有好几个相似条款互相干扰,它分不清该信哪个,干脆就按自己训练时的记忆编了。我建议先做个最小验证:把检索到的原文直接粘进prompt,手动删掉无关段落,只留最核心那一段,看模型还胡不胡编。如果这样它就老实了,那问题基本在上下文组织和噪声上,不是检索精度。加rerank确实能帮忙,它能把真正最相关的排到最前面,减少模型被边缘内容带偏的概率。另外prompt里光说“仅根据以下内容”太弱了,可以试试让它先引用原文再回答,或者明确说“如果文中没有就回答不知道”,给个逃生出口它反而不容易瞎编。生成模型本身也有关系,有些模型指令遵循就是差,换个对长上下文更敏感的可能立竿见影。
你描述的情况我也踩过,检索没问题但模型爱自由发挥,大概率是上下文里干扰信息太多,top5里可能混了几段看似相关其实没用的。建议先加个rerank卡一下,再在prompt里明确让它引用原文句子,答不出来就说不知道。另外bge-large-zh对长文档切片敏感,chunk切太碎或太大都会让模型抓不住重点,可以调调再试。生成模型本身也有关系,qwen或者deepseek这类中文强的会比通用模型听话不少。
先看看检索片段里是不是混了相似但不对的条款,rerank能救不少,另外生成模型别用太小的。