最近在做一个企业知识库问答的RAG项目,检索部分用的是向量库+BM25混合召回,TopK设的5。但发现一个问题:检索出来的文档片段其实是对的,但LLM生成的回答经常自己加戏,要么把几个不相关的片段强行缝合,要么直接忽略检索内容按自己的知识回答。我试过在Prompt里加“请严格根据以下上下文回答”,也加了few-shot示例,但效果不稳定。想请教一下有实战经验的朋友,这种检索对了但生成跑偏的情况,一般从哪些方向去优化Prompt?需不需要在Prompt里做上下文压缩或者让模型先判断相关性再回答?
做RAG项目时Prompt到底该怎么调才能让回答不跑偏?
全部回复
共 4 条这个问题挺典型的,检索没毛病但生成乱来,其实很多时候不是Prompt措辞的问题,而是模型压根没被逼到只能看上下文。我一般会在Prompt里加一句要求它先判断每个片段和问题的相关性,不相关的直接说“无法从上下文得知”,这样能砍掉不少强行缝合的情况。另外你TopK=5可能有点多,尤其片段之间主题跨度大的时候,模型容易自己脑补关联,试试压到3或者加个rerank。上下文压缩确实有用,但别用LLM压,容易丢关键信息,用规则或者小模型抽句子更稳。还有一个坑是few-shot示例如果太完美,模型反而会模仿那种“流畅编造”的风格,示例里最好故意留一个“上下文不足就拒答”的样本。最后可以试试在生成后再加一步校验,让另一个模型判断回答是否完全被检索内容支持,不支持就重写或者直接返回原文片段。
我踩过一样的坑,检索没问题但模型爱自由发挥。后来在Prompt里加了一步让它先判断每个片段跟问题是否相关,不相关的直接说“无关”,再基于剩下的回答,跑偏少了很多。另外TopK=5有时候反而塞了噪音,试试降到3或者加个重排序再喂给模型。上下文压缩也有用,但别压太狠,容易丢关键细节。
我也遇到过类似情况,检索没问题但模型硬要自己发挥。后来在Prompt里加了一步“先判断每个片段和问题的相关性,不相关的直接说无关”,效果好了不少。另外上下文压缩挺关键的,TopK=5里经常有两三条是噪音,可以试试用rerank后再截断。还有个偏方是把temperature调到0.1以下,能减少缝合怪现象。
我遇到过类似情况,后来在Prompt里加了一步“先判断每个片段和问题的相关性,不相关的直接剔除再回答”,效果好了不少。另外TopK=5可能有点多,噪声片段多了模型就容易缝合,可以试试降到3或者加个重排序。还有个小技巧是把指令放在上下文后面而不是前面,模型对最近的内容注意力更强。