最近在搭一个基于企业知识库的RAG问答,用的bge-m3召回,top5相关文档其实都命中了,但LLM生成答案时总感觉“差点意思”——要么把不相关的背景知识也编进去,要么回答太啰嗦没重点。我现在的system prompt就写了“基于以下文档回答”,user prompt把检索结果+问题拼一起。是不是应该把文档按相关度排序后明确告诉模型“只参考1、2条”或者加个“如果文档冲突以最新为准”之类的约束?还有,需不需要在prompt里强调“不知道就说不知道”?求有经验的大佬指点一下,最好能举个具体可用的prompt模板,谢谢!
RAG的prompt写不好,召回质量还行但生成总不对味,咋调?
全部回复
共 6 条试试在user prompt里把文档标成[1][2]再让模型只引编号,加句“无依据就直说不知道”,会清爽很多。
你这问题我太有同感了,bge-m3召回准但生成跑偏,八成是prompt没把“边界感”立住。我试过最管用的一招是,在system里直接写“你只能使用用户提供的文档内容,禁止引入任何外部知识或推测”,比单纯说“基于文档”管用得多。然后user prompt里别把5条文档一股脑全丢进去,按分数排序后加一句“优先级从高到低,低分文档仅作参考,冲突时以高分文档为准”,模型就会老实很多。至于“不知道就说不知道”这个必须加,而且要具体点,比如“如果文档中没有明确答案,请直接回答‘知识库中未找到相关信息’,不要编造”。给你个我目前在用的模板:system写“你是企业知识库助手,回答必须严格基于给定文档,禁止臆测;若信息不足,明确说明”;user里先放“【问题】”,再放“【文档1-5】按相关度排序”,然后加一句“请结合文档1和2优先作答,文档3-5仅作补充”。这样调完,至少啰嗦和瞎编的问题能解决大半,剩下的就是靠few-shot example把“简洁有重点”的风格定下来,你可以试试。
我之前也踩过这个坑,bge-m3召回准但生成乱,后来发现问题不在检索,而在你给模型划的“答题范围”太模糊了。你可以试试把检索结果按分数排序后,在prompt里直接标序号,比如“文档1(相关度最高)...文档5(相关度最低)”,然后明确说“优先依据文档1和2,其余仅作参考”,这样模型会明显收敛很多。关于“不知道就说不知道”这个一定要加,不然它真的会硬编,我见过最离谱的是把完全无关的旧版本制度当背景写进去。另外你提到的“文档冲突以最新为准”也很关键,但建议别只写这一句,最好在每条文档后面标注日期或版本号,让模型自己判断。我现在的模板大概是:system里写“你是企业知识助手,回答必须严格基于给定文档,若文档无答案请直接回复‘知识库中未找到’,禁止推测”,user里把文档按“【文档1】标题+内容”列完,最后加一句“请结合文档1-5,优先采用与问题最相关的信息,不要展开无关背景”。这样调完,至少啰嗦和编造的问题能解决大半。
试试在prompt里按相关度编号,强制只参考前两条,加一句“不确定就直说”,效果立竿见影。
我之前也踩过这坑,后来发现光靠排序不够,得在prompt里明确给文档编号,然后告诉模型“优先用编号靠前的,且只允许引用其中事实,别自己发挥”。你那个“只说不知道”的约束很关键,不然模型真会硬编,我加了一句“若文档无答案,直接回复‘未找到相关信息’”之后效果好多了。还有个小技巧,把用户问题拆成几个子问题塞进prompt,让模型按步骤答,啰嗦感会少很多。你可以试试这个结构:先给文档列表,再给问题,最后加一句“请基于文档内容,用三点以内简短回答”。
加个“严格按文档1-3回答,别自己发挥”试试,再补一句“没依据就说不知道”,效果立竿见影。