常见问题
把检索做好了,召回的文档确实是对的,但大模型生成的回答还是有问题,它会往里面掺自己编的东西,怎么办?
检索到的文档是对的,但模型生成的回答里出现了文档中根本不存在的内容,你遇到过这种情况吗?怎么解决的?
用户第一轮问了车险保障范围,第二轮追问'这个怎么申请',你的系统能理解'这个'指的是什么吗?
找到了之后,能不能说对。检索做得再好,生成阶段翻车了,用户看到的还是一坨垃圾
幻觉问题
RAG 生成阶段最致命的问题
明明检索到了正确的文档片段,喂给了大模型,但模型生成的回答里居然出现了文档中根本不存在的信息
为什么
大模型的本质是"续写"
它会基于自己在预训练阶段学到的知识来补全内容
当检索到的上下文不够明确、或者模型对某个话题有"先入为主"的知识时
它就可能混入自己编造的内容,而不是老老实实只用你提供的资料
幻觉不是小概率事件,而是 LLM 的天性,
Prompt 层面的硬约束
在 Prompt 中明确指示模型"仅依据提供的资料回答,<br>如果资料中没有相关信息,请坦诚说明无法回答"
关键词是"仅依据"和"坦诚说明"
让模型知道"不知道"是一个被允许的回答
不是逼着它必须给出一个答案
模板
请根据以下提供的资料回答用户问题。如资料不足,请坦诚说明。<br>资料:<br>[1] {文档1标题} {文本片段...}<br>[2] {文档2标题} {文本片段...}<br>问题: {用户问题}<br>回答:
每个片段前面加了编号标记 [1]、[2]
不仅方便后续做引用标注
也在暗示模型"你的信息来源就是这几条,别从别处找
Few-shot 示例引导
在 Prompt 中加入 1-2 个示例问答对,<br>示范"如何根据给定资料回答并引用来源"
模型看到示例中有根据资料回答且标注了 [1]、[2] 这样的引用,就更可能模仿这个模式,而不是自由发挥
后处理过滤
Prompt 层面的约束再强也不能 100% 杜绝幻觉,<br>还需要在模型输出后做一层后处理
用规则或分类模型检测答案中是否包含检索文档中不存在的关键断言
如果检测到可疑内容,可以拦截并替换为更保守的回答
或者触发二次检索验证
在金融场景下,还需要加风控检测层,过滤掉不当内容
Prompt 构建
不是把把检索到的文档片段和用户问题拼在一起这么简单
上下文的数量和顺序很关键
Lost in the Middle
给 LLM 的上下文不是越多越好
过多无关片段会占用上下文窗口
研究表明,大模型更容易关注上下文开头和结尾的内容,中间部分的信息容易被忽略
实践做法
通过 Rerank 精排后只取 Top 5-10 个最相关的片段,<br>把相关度最高的片段放在最前面<br>
如果片段来自不同文档,在 Prompt 中用标题或编号区分清楚
帮助模型理解"这是来自不同来源的不同信息
答案形式要在 Prompt 中明确约束
不同场景下,答案的形式差异很大
知识问答场景希望详尽解释并引用来源
客服场景要求简明扼要
比如可以在 Prompt 中加上"请用三句话总结"或"请用专业术语回答,目标读者是金融从业人员"
若没有在 Prompt 中明确指定,模型就按自己的默认风格来,往往不是你想要的
冲突信息的处理策略
当不同检索片段给出的信息互相矛盾时
旧版流程和新版流程都被召回了
模型可能会把两个版本混在一起回答,让用户一头雾水
优化方案
在 Prompt 中加入指导,<br>比如"如果资料之间存在矛盾,请优先参考编号靠前的来源"
因为 Rerank 后相关度高的排在前面
在检索阶段就过滤掉低可信度或过时的片段,从源头减少冲突
引用标注
对准确性要求极高的场景下,用户不仅需要一个回答,还需要知道这个回答从哪来的
系统只给了一个结论,不说出处,用户的信任度会大打折扣
实现引用标注
检索片段带上元数据
每个召回的文档片段都带有来源信息——<br>文档名称、页码、幻灯片编号、甚至视频时间戳。
Prompt 中给片段编号
把检索到的片段按 [1]、[2]、[3] 编号传给 LLM,
并在 Prompt 中要求模型"在引用对应信息时标注来源编号"
后处理映射
模型输出的 [1]、[2] 标记是编号
再把这些编号映射回实际的文档名称和页码
最终展示给用户的是类似"【来源: 寿险ABC产品手册 第10页】
用户可以点击查看原文验证
好处
增加用户信任
能反向约束幻觉
模型被要求必须标注出处,当它想编造一个信息时,会发现没有对应的来源编号可以标注
这会在一定程度上抑制它的"创作欲望"
看似是给用户看的功能,实际上是给模型戴的紧箍咒
反馈与自检
进阶策略——让模型对自己的回答做一次自检
具体做法
在生成完初步回答后,再追加一轮 Prompt
让模型检查自己的答案是否充分利用了提供的资料、是否有未经支持的断言
如果发现有不确定的部分,就让模型修正答案或者在末尾补充说明"此部分信息未在提供的资料中找到"
场景
可以在 Prompt 内通过多轮对话实现(第一轮生成答案,第二轮让模型自查)
可以用一个小型验证模型来判别回答是否与检索到的文档一致
代价
多一次 LLM 调用,延迟会增加
通常只在对准确性要求极高的场景下才启用
反馈式检索
如果生成模块检测到自己"答不上来"
比如模型输出了"无法从资料中找到答案"
系统可以自动触发一次新的检索
放宽条件或换一种检索策略
到新的结果后再让模型重新生成
让生成反哺检索,形成闭环
总结
检索到了正确的文档,模型还是在胡说八道,你怎么解决
先定义问题
这是 RAG 系统的幻觉问题,即使提供了正确的上下文,LLM 仍可能混入预训练知识中的错误信息
三层防线
Prompt 层通过硬约束和 Few-shot 示例引导模型严格依据资料作答;后处理层通过幻觉检测和风控过滤拦截不可信内容;引用标注机制反向约束模型不编造没有出处的信息
展开多轮对话和 Prompt 构建
轮场景下通过查询重写做指代消解,维护对话状态避免上下文断裂;Prompt 构建时控制上下文数量和排序,避免 Lost in the Middle 问题,同时对冲突信息给出优先级指导
提自检和反馈闭环
对高风险场景启用模型自检机制,当模型回答"不知道"时自动触发二次检索,形成生成反哺检索的闭环