最近在搭一个基于企业知识库的RAG问答,用的bge-m3召回,top5相关文档其实都命中了,但LLM生成答案时总感觉“差点意思”——要么把不相关的背景知识也编进去,要么回答太啰嗦没重点。我现在的system prompt就写了“基于以下文档回答”,user prompt把检索结果+问题拼一起。是不是应该把文档按相关度排序后明确告诉模型“只参考1、2条”或者加个“如果文档冲突以最新为准”之类的约束?还有,需不需要在prompt里强调“不知道就说不知道”?求有经验的大佬指点一下,最好能举个具体可用的prompt模板,谢谢!
楼主
17天前
RAG的prompt写不好,召回质量还行但生成总不对味,咋调?
请 登录 后发表回复
全部回复
共 21 条
2楼
4小时前
你这个情况太典型了,top5都命中但生成跑偏,八成是prompt没把模型的“注意力”框住。我自己踩过的坑是,光说“基于以下文档回答”基本等于没约束,模型会忍不住把预训练里的通用知识掺进来,尤其是问一些它本来就“懂”的话题时。后来我改成明确分块标注,每篇文档前加个序号和来源,然后在system里写“只能使用下方提供的资料,不允许引入外部知识”,效果立竿见影。关于按相关度排序这点我赞同,但不用特意说“只参考1、2条”,那样反而容易让模型忽略后面可能有用的补充信息,更稳妥的是让它自己判断哪些片段跟问题直接相关。文档冲突那个约束挺有必要,我一般会加一句“若资料间存在矛盾,优先采用日期更新或来源更权威的内容”,不过前提是你的元数据里得有日期或来源字段。至于“不知道就说不知道”,强烈建议加上,而且要说清楚触发条件,比如“若提供的资料无法支撑回答,直接回复‘根据现有资料无法确定’,不要猜测”。给你个我常用的骨架:system里写角色+约束+拒答规则,user里用【资料1】【资料2】分隔检索结果,最后单独一行写“问题:xxx,请仅依据上述资料作答”。这样调完,啰嗦和编造的问题基本能压下去大半。