最近在搭一个RAG问答系统,用的是一些开源模型。发现一个问题:检索到的文档明明是对的,但大模型经常忽略文档里的关键信息,自己编答案。比如用户问某个产品参数,文档里写的是A,模型却输出B,感觉像没读文档一样。我现在的prompt大概就是“基于以下文档回答”,但效果不稳定。是不是需要加一些强制约束,比如“如果文档中没有相关信息,请直接说不知道”?或者把文档分段加个标签再引用?有没有大佬分享下实际项目中写RAG prompt的经验?多谢!
RAG系统里,Prompt怎么写才能让大模型不“跑偏”?
全部回复
共 168 条我之前也踩过这个坑,光靠一句“基于文档回答”确实不够。后来我把prompt改成强制要求模型先引用原文片段再给结论,并且明确告诉它“如果文档里没有,就说不知道,别编”,效果稳多了。另外把文档分段加个编号,让模型回答时带上引用编号(比如[1]),也能减少它自由发挥,你可以试试这种带格式约束的写法。
这个问题挺典型的,我也踩过差不多的坑。光靠“基于以下文档回答”基本等于没约束,模型很容易顺着自己的先验知识往下编。我后来是在prompt里明确要求它每个结论后面标注来自哪一段,比如让文档带上编号,回答时引用编号,这样它“跑偏”的概率会低不少。另外“文档里没有就说不知道”这句确实得加,但别只写一句,最好再补一句“不要用你的常识补充”,不然它还是会偷偷加料。还有个挺管用的做法是把文档按段落切好,每段前面加个简短标题或摘要,模型定位关键信息会准很多。温度也建议调低一点,RAG场景下不需要它发挥创造力。不过我也好奇,你用的是哪类开源模型,有些模型对长上下文里的中间信息本身就容易忽略,可能不全是prompt的锅。
这个坑我也踩过,光写“基于以下文档回答”确实不够,模型很容易自由发挥。我后来改成让它在每句话后面标注引用来源,比如“根据文档X”,幻觉明显少了。你说的“没相关信息就说不知道”也很有用,但得配合更具体的指令,比如“只允许使用文档中的原文表述”。另外文档分段加编号确实有帮助,方便模型定位,也方便你排查它到底读没读进去。
加一句“只依据文档内容回答,不确定就直说不知道”,亲测能压住不少幻觉。
加一句“只依据文档内容回答,没有就直说不知道”确实管用,我试过能压住不少幻觉。
我踩过这个坑,光靠“基于以下文档回答”确实太弱了,模型很容易放飞。后来我在prompt里明确要求“只允许引用文档原文,禁止自行推理或补充”,还加了引用编号,让它每句话都标来源,效果好很多。你说的“没有就说不知道”也很有用,能压住一部分幻觉。另外文档分块别太大,关键参数最好单独成段,不然模型容易看漏。
我之前也踩过这个坑,后来发现光加“不知道”还不够,得把指令写得更具体点,比如“只允许根据下面文档中的原文回答,不要自己推理”。另外文档分段加编号确实有用,让模型引用的时候能对应上。还有个野路子是把温度调到0.1以下,跑偏概率会低不少。你可以先试试把“基于以下文档”改成“严格依据以下文档,逐条核对后再回答”。
有没有更详细的教程推荐?