最近在搭一个文档问答的RAG系统,检索部分用的Chunk+Embedding,召回了相关片段。然后我在Prompt里明确写了“请只基于以下检索内容回答,不要使用内部知识”,但LLM(用的GPT-4)还是会自己脑补,比如用户问“XX产品价格”,检索内容里只有功能介绍,它却硬编出一个价格。
RAG里用Prompt让LLM“只基于检索内容回答”,但总是失效怎么办?
全部回复
共 165 条这问题太真实了,我试过好几轮也是这德行。后来发现光靠prompt压不住,得从检索源头下手,比如把召回阈值调高,或者直接在后处理时把无关字段过滤掉。另外可以试试few-shot,给一两个“宁可说不知道”的示例,比单纯下指令管用。你用的是纯向量检索吗?感觉混合检索加个关键词匹配能稍微缓解点。
这问题太真实了,我试过把“只基于检索内容”加粗甚至重复三遍,GPT-4照样脑补。后来发现光靠提示词压不住,得从源头卡:检索没召回到价格信息时,干脆让LLM输出“未找到相关数据”,比让它自由发挥靠谱。另外可以试试把检索内容里没有的部分单独拎出来,在prompt里明确说“如果用户问的字段不在下列列表中,直接拒绝回答”,比笼统的“别用内部知识”有效得多。你现在的chunk粒度是不是太大了?有时候片段里混着不相关的句子,模型就容易被带跑。
这问题太真实了,我试过把prompt写成“你是复读机,只允许转述”都没用。后来发现根子不在prompt,是模型对“置信度”的感知——它检索到的内容如果跟用户问题差太远,它就会用自己的知识去补洞,哪怕你写了“禁止”。你那个价格例子,本质上就是检索片段里压根没有“价格”这个实体,LLM觉得不回答显得自己没用,于是强行生成一个最可能的。我现在的做法是两步走,第一步先让LLM判断检索内容是否覆盖了问题,输出“相关”或“不充分”,不充分就直接回复“抱歉,文档里没提”,绝不进入生成环节。第二步才是生成,而且prompt里会加一句“如果检索内容中缺少任何具体数值、时间、价格,必须明确说‘原文未提及’”。另外可以试试把temperature调低到0.1,甚至0,能减少幻觉概率,但不能根治。还有个坑是chunk大小,如果分段太细,价格信息可能散落在另一个chunk里没被召回,那你怎么写prompt都没用——建议干脆把检索top-k从3提到5,然后对候选片段做个简单的“问题实体+答案实体”共现检查,缺了就触发上面的“不充分”分支。
这个问题我也踩过,光靠prompt确实很难完全管住模型,尤其是GPT-4这种知识量大的,它天生就爱“补全”。我后来是在检索后加了一步相关性判断,如果召回的片段跟问题不匹配,就直接走兜底话术,不让模型自由发挥。另外你也可以试试把temperature调低,再让它回答时带上引用来源,编造的概率会小一些。
这问题太常见了,光靠Prompt确实拦不住,GPT-4在信息缺失时特别爱“补全”。我一般会在检索后加一步相关性校验,如果召回片段跟问题不匹配就直接返回“没找到”,别给模型硬答的机会。另外可以试试让它输出前先引用原文片段,再基于引用作答,脑补空间会小很多。还有个偏方是把temperature调低,虽然治标不治本,但能少编点。