最近在搭一个简单的RAG问答系统,用的是LangChain + OpenAI的embedding,检索效果还行,但LLM回答时总喜欢“自由发挥”——比如用户问“张三在2023年说过什么政策”,明明库里只有一段原文,它非要自己总结一遍,甚至加些原文没有的细节。我试过在system prompt里写“请严格引用原文回答”,但效果不稳定,有时候还是乱编。想请教下大家,有没有什么prompt技巧或者模板能让模型更“死板”一点?另外,如果原文很长,是不是应该把检索到的片段分段塞进prompt,还是直接整段放进去比较好?感谢!
楼主
2026-07-27
RAG系统里prompt怎么写才能让LLM更准确引用原文?
请 登录 后发表回复
全部回复
共 141 条
2楼
2天前
这个问题我也踩过坑,说点实际经验。“严格引用原文”这种指令太软了,模型该编还是编,得把约束落到格式上才管用。我现在的做法是要求它每句话后面必须跟一个引用标记,比如直接标注来自哪个chunk,然后prompt里明确写“如果检索内容里没有相关信息,就回答不知道,禁止自行补充”。这招比单纯说“别乱编”有用得多,因为模型一旦被逼着给出来源,它瞎编的成本就高了,很多情况下它会老老实实照抄。
另外你提到的分段还是整段,我倾向于按语义切分后放top 3到5个片段,别一股脑全塞进去。塞太多反而稀释注意力,模型容易抓错重点,而且长上下文里它更倾向于“总结”而不是“引用”。可以在每个片段前加个编号或者来源标识,prompt里让它引用编号,这样追溯起来也方便。
还有个小技巧是few-shot,给它一两个“用户问—正确引用回答”的示例,比干巴巴的规则管用。温度也可以调低点,0或者0.1,别让它有太多发挥空间。不过话说回来,检索本身如果召回不准,prompt再怎么写也救不回来,可以先看看是不是chunk切分或者embedding的问题。