Home Projects Blog Resume Contact 中文
Back to list
2026年7月3日 5,327 words 11 min read

08-RAG 幻觉治理:引用、拒答、证据约束和答案校验

上一篇讲 Rerank 与上下文工程时,重点放在候选证据如何进入 Prompt。检索把材料找回来,Rerank 判断证据优先级,上下文工程把证据整理成模型可以使用的形态。到了这一篇,问题继续往后推进:即使模型已经拿到了外部知识,RAG 仍然可能产生幻觉。

#LLM#检索增强#证据链#RAG

08-RAG 幻觉治理:引用、拒答、证据约束和答案校验

上一篇讲 Rerank 与上下文工程时,重点放在候选证据如何进入 Prompt。检索把材料找回来,Rerank 判断证据优先级,上下文工程把证据整理成模型可以使用的形态。到了这一篇,问题继续往后推进:即使模型已经拿到了外部知识,RAG 仍然可能产生幻觉。

很多人第一次接触 RAG 时,容易把它理解成“给模型一份知识库,模型就会基于知识库回答”。这个理解抓住了 RAG 的方向,但低估了链路里的不确定性。知识库里有正确答案,不代表检索一定能找出来;检索找出来,不代表排序和截断会保留下来;证据进入上下文,不代表模型一定会忠实使用;模型给出引用,也不代表引用真的支撑对应结论。

所以,RAG 幻觉治理的核心,是把“模型为什么会说出没有证据支撑的话”拆回到整条证据链路里处理,从多个环节一起降低无依据生成的概率。

这一篇的核心判断可以先放在前面:

RAG 只能通过外部证据降低幻觉概率,不能天然消灭幻觉。幻觉治理要从召回、排序、上下文、生成、引用、拒答和答案校验多层一起做,让模型的回答尽量被可追溯证据约束住。

RAG 里的幻觉要按链路理解

大模型的幻觉通常指生成了看似合理但事实错误、缺少依据或与给定上下文不一致的内容。放到 RAG 里,幻觉表现会更复杂,因为答案不再只依赖模型参数,还依赖外部知识链路。

一个 RAG 系统回答错误,可能是模型在生成阶段自由发挥,也可能是它被前面错误证据带偏。正确文档没有入库,模型看不到答案。正确 chunk 没有被召回,模型只能基于相似但无关内容回答。正确证据被 Rerank 排到后面或被上下文截断,模型同样无法利用。证据里存在冲突,模型可能把多个版本混在一起。Prompt 没有明确要求引用和拒答,模型会倾向于给出完整回答。

所以排查 RAG 幻觉时,不能只看最终文本。更稳的方式是沿着链路回放:

用户问题
  -> query 理解和改写
  -> 召回结果
  -> Rerank 排序
  -> 最终上下文
  -> Prompt 约束
  -> 模型答案
  -> 引用映射
  -> 后校验结果

这条链路里的每一层都可能制造幻觉,也都可以提供治理入口。RAG 的优势在于答案有机会被证据约束,前提是这条证据链路足够稳定、可追溯、可评估。

链路位置常见幻觉来源治理入口
召回正确证据没有进入候选池Query Rewrite、Hybrid Search、多路召回
排序 / 截断正确证据被排低或被截掉Rerank、topK、token 预算、去重
上下文混入噪声、冲突或过期内容metadata 过滤、冲突标注、来源质量控制
生成模型超出证据补全Prompt 证据约束、引用、拒答
返回前答案和引用不匹配答案后校验、引用支撑检查

召回失败会让模型在缺证据状态下回答

第一类幻觉来自召回失败。正确证据没有进入候选池,模型看到的上下文里缺少答案。此时模型有两种常见表现:一种是拒答,说明资料不足;另一种是根据相似上下文和自身常识补出一个答案。后者就是 RAG 场景里很常见的幻觉。

召回失败的原因很多。用户 query 太短,检索信号不足;改写阶段补错了上下文;embedding 模型对领域术语理解不稳;关键词检索没有保留错误码、接口名或配置项;metadata filter 把正确版本过滤掉;文档入库时 chunk 切分破坏了答案完整性。这些问题都发生在模型生成之前。

这种情况下,单纯加强 Prompt 的收益有限。Prompt 可以要求“只基于上下文回答”,但如果上下文里没有答案,系统仍然需要给模型一个明确出口。更可靠的设计,是把低召回置信度和拒答机制结合起来。当候选分数整体偏低、没有证据能覆盖关键实体、Rerank 后仍然缺少高置信片段时,系统应该倾向于提示资料不足,避免模型继续组织一个完整结论。

召回失败的治理要回到检索侧。Query Rewrite、Hybrid Search、多路召回、metadata filter、chunk 策略和 embedding 选型都会影响正确证据能否进入候选池。幻觉治理从这里就已经开始了。

排序和截断失败会让正确证据看得见却用不上

第二类幻觉来自排序和截断。正确证据已经被某一路召回命中,但没有进入最终上下文。排查时经常能在召回 top50 或 top100 里找到答案,最终给模型的 top5 里却没有它。

这种问题比召回失败更隐蔽,因为系统看起来“检索到了”。但模型实际接收的上下文才是生成依据。正确证据如果排在后面,被 topK 截掉,或者被 token 预算挤掉,对模型来说就等于不存在。

排序失败常见于粗粒度召回分数直接决定上下文。向量相似度高的候选可能只是主题相关,没有回答问题。关键词命中强的候选可能只是重复出现某个术语。Rerank 的价值就在于把候选重新排序,让真正能回答问题的证据靠前。

截断失败则常见于上下文打包阶段。系统按固定 topK 拼接,长 chunk 抢占 token,重复证据占满窗口,关键限制条件被截掉。模型看到一半证据,就容易给出一半正确的答案。比如只看到“默认超时时间为 30 秒”,没有看到“管理员可在项目级配置中覆盖”,最终答案就会过度确定。

治理这类幻觉,需要记录 Rerank 前后结果和最终 Prompt 上下文。只有知道正确证据在哪一步丢失,才能判断该调召回、Rerank、topK、去重、压缩还是截断策略。

现象更可能的问题
top50 里有正确证据,最终上下文没有Rerank、topK、token 预算或截断策略问题
正确证据被长 chunk 挤掉chunk 长度、上下文打包或压缩策略问题
重复证据占满窗口去重和相邻 chunk 聚合问题
只看到部分条件,答案过度确定截断、压缩或上下文合并问题

上下文污染会把模型带向错误结论

第三类幻觉来自上下文污染。这里的模型并非完全自由发挥,它确实基于上下文回答,只是上下文本身混入了噪声、冲突或过期内容。

弱相关证据是一种常见污染。它和主题接近,但无法回答当前问题。模型读到这类内容后,可能把背景介绍当成操作建议,把概念说明当成限制条件。过期证据也是常见污染。旧版本文档如果和新版本文档同时出现,模型可能选择旧规则,或者把两个版本合并成不存在的规则。

冲突证据更麻烦。不同来源对同一问题给出不同说法,模型如果没有被告知冲突边界,往往会尝试生成一个统一答案。这个统一答案语言流畅,但事实关系可能已经被合并错了。比如正式手册写“企业版支持自定义保留周期”,旧 FAQ 写“保留周期固定 30 天”,模型可能回答成“默认 30 天,企业版也固定 30 天”,从而丢掉关键条件。

上下文污染的治理依赖证据质量控制。metadata 要参与排序和过滤,正式文档、当前版本、有效时间、适用产品线和权限范围都应该影响候选优先级。冲突证据要在 Prompt 前被标注,必要时让模型说明资料存在不一致,并分别列出来源。对于高风险业务,低可信来源可以只作为补充,不进入最终答案依据。

从这个角度看,上下文工程本身就是幻觉治理的一部分。模型看到的证据越干净,生成阶段越不需要猜。

生成不忠实是最后一层幻觉

第四类幻觉发生在生成阶段。正确证据已经进入上下文,模型仍然给出了超出证据范围的回答。

这类问题常见于模型过度概括。证据写的是“当前版本支持 A 场景”,模型回答成“系统支持 A”。证据写的是“部分用户灰度开放”,模型回答成“已经全量开放”。证据只说明配置步骤,模型额外补充了未被文档支持的最佳实践。语言模型天生倾向于补全上下文,让回答完整、顺滑、有帮助,这种倾向在 RAG 里需要被约束。

生成不忠实也可能来自 Prompt 边界不清。系统只把上下文和问题拼在一起,没有明确要求“答案必须基于证据”“无法从证据推出时说明资料不足”“每个关键结论要引用来源”。模型就会按普通问答习惯处理,把上下文当作参考材料,事实边界约束会变弱。

因此,RAG Prompt 要明确证据优先级。它应该告诉模型当前任务是基于给定证据回答,证据不足时要说明不足,不能引入上下文之外的事实,遇到冲突要指出冲突,涉及结论、步骤、限制和数值时要引用来源。

Prompt 约束作用
只能基于给定证据回答降低模型自由补全空间
证据不足时说明不足给模型明确拒答出口
遇到冲突要指出冲突避免强行合并不一致来源
关键结论必须引用来源让答案和证据建立可校验关系

Prompt 不能补救缺失证据,但可以减少模型在有证据时的自由发挥。它的价值是把生成阶段从“尽量回答”收束到“有依据地回答”。

引用要成为证据约束

引用在 RAG 里经常被当成展示层能力。答案后面带几个来源链接,用户看起来会更放心。但如果引用只是最后补上去的装饰,它对幻觉治理帮助很有限。

真正有价值的引用,应该贯穿上下文组织和答案生成。每段进入 Prompt 的证据都带有 source_id、标题、文档 ID、版本、更新时间和正文。模型回答时,关键结论要标注对应 source_id。系统后续可以检查答案里的引用是否真的支持该句结论。

引用的价值有三层。第一层是可追溯,用户能从答案回到原文。第二层是可校验,系统能判断回答和证据之间是否存在支撑关系。第三层是约束生成,模型在写答案时会更倾向于围绕已有证据组织,减少事后补来源的空间。

引用也会暴露问题。如果答案里某个结论没有引用,说明它可能来自模型自身知识或推断。如果引用段落只提到相关主题,却没有支持对应结论,说明引用和答案存在错配。如果一个答案依赖多个来源,引用应该尽量和结论逐句或逐段对应,全文末尾统一堆来源会削弱可校验性。

所以,RAG 的引用需要结构化设计。source_id 不能由模型自由生成,必须来自检索系统。引用和证据之间要有稳定映射。答案里的关键事实、数值、限制、步骤和判断,都应该能回到具体片段。

引用检查点要避免的问题
source_id 来自检索系统模型凭空编造来源
关键结论逐句或逐段对应引用全文末尾堆来源但无法校验
引用片段能支撑对应结论相关但不支撑的错配引用
引用保留版本、时间、来源信息过期或不适用证据被误用

拒答是 RAG 的必要能力

一个可靠的 RAG 系统需要会回答,也需要会拒答。拒答并不代表系统能力弱,它代表系统能识别证据边界。

很多业务场景里,错误回答比没有回答更危险。技术支持里给出错误配置可能导致故障扩大,法务制度里给出过期条款可能带来合规风险,医疗金融等高风险场景更不能用看似合理的文本替代证据。

拒答触发通常来自几个信号。召回结果整体置信度低,说明系统没有找到足够相关材料。候选证据之间冲突且无法判断优先级,说明单一结论不可靠。上下文缺少关键实体、版本、时间或适用范围,说明答案边界不清。模型生成后无法为关键结论找到引用,说明回答可能超出证据。

拒答信号更合适的处理
召回结果整体置信度低说明资料不足,避免硬答
候选证据冲突且无法判定优先级明确列出冲突来源
缺少关键实体、版本、时间或适用范围要求补充信息或限定答案范围
关键结论找不到引用支撑删除该结论、降级回答或拒答

拒答也要写得有信息量。简单说“我不知道”用户体验很差。更好的方式是说明当前资料不足在哪里,例如缺少指定版本文档、没有找到该错误码的处理说明、现有资料只覆盖企业版、多个来源说法不一致。这样用户知道下一步该补充什么,系统也能把失败样本回流到知识库和评测集。

拒答机制的本质,是让 RAG 在证据不足时停止猜测。它和引用、上下文质量、后校验一起构成幻觉治理的边界。

证据约束要进入 Prompt 和输出格式

只在系统说明里写一句“请基于上下文回答”,通常不够。证据约束需要体现在 Prompt 结构和输出格式里。

Prompt 可以把任务拆成几个明确动作:先阅读证据,判断证据是否足够,再回答用户问题,最后给出引用。对于证据不足的情况,输出格式应该允许模型返回“资料不足”或“无法判断”,避免强制输出完整答案。

结构化输出也有帮助。比如答案可以拆成结论、依据、适用范围、注意事项和引用。这样的格式会提醒模型每个结论都需要证据支撑,也方便系统做后校验。对于排障类问题,可以要求模型区分“已由证据支持的步骤”和“需要进一步确认的信息”。对于政策类问题,可以要求保留版本、时间和适用条件。

证据约束还要避免诱导模型过度回答。如果 Prompt 要求“给出完整、详细、专业的解决方案”,模型会倾向于补充缺失内容。RAG 场景更适合强调“准确、可引用、证据不足时收敛”。这并不会让答案变得生硬,反而会让回答更可信。

在生产系统里,Prompt 版本也要记录。某一次幻觉到底来自检索、上下文还是 Prompt 约束,需要通过 trace 回放判断。Prompt 不应该成为一个无法观测的黑盒字符串。

答案后校验补上最后一道防线

生成完成后,还可以做答案后校验。它相当于在答案返回用户前,再检查一次回答是否被证据支持。

后校验可以做得轻,也可以做得重。轻量方式是检查答案中是否包含引用、引用是否来自当前上下文、关键结论是否都有 source_id。更进一步,可以用模型或规则判断每个结论是否被引用片段支持,是否出现了上下文之外的实体、数值、版本或承诺。

后校验层次检查内容
轻量校验是否有引用、引用是否来自当前上下文
结论校验关键结论是否都有 source_id
支撑校验引用片段是否真的支持对应结论
越界校验是否出现上下文之外的实体、数值、版本或承诺

对于高风险场景,可以把答案拆成更小的声明单元,再逐条校验。比如“企业版支持自定义保留周期”“默认保留 30 天”“管理员可以在项目设置中修改”,每一句都需要找到对应证据。找不到证据的句子要被删除、降级或触发拒答。

后校验不能替代前面的检索和上下文工程。它发现问题时,通常已经接近链路末端,修复成本更高。但它能显著减少明显无依据的输出,尤其适合处理模型在语言组织时额外补充的内容。

答案后校验还可以产生很有价值的反馈数据。哪些问题经常证据不足,哪些引用经常不支持结论,哪些文档经常造成冲突,这些都能回流到知识库治理、检索优化和评测集建设。

幻觉治理需要和日志评测结合

RAG 幻觉治理不能只依赖主观感觉。系统需要保存足够完整的 trace,才能定位幻觉来自哪一层。

一次请求最好能记录原始问题、改写 query、metadata filter、召回候选、Rerank 排序、最终上下文、Prompt 版本、模型答案、引用映射、后校验结果和用户反馈。这样当用户反馈“答案不对”时,系统可以复盘整条证据链。

如果正确证据没有入库,问题在知识库治理。如果正确证据入库但没被召回,问题在检索策略。如果正确证据被召回但没进 Prompt,问题在 Rerank、topK 或上下文工程。如果正确证据进入 Prompt 但答案不忠实,问题在 Prompt 约束、模型生成或后校验。不同问题需要不同优化手段。

评测集也要按这个思路构建。只看最终回答分数不够,还要看检索是否命中正确证据、上下文是否包含答案、生成是否忠实、引用是否准确、低证据问题是否拒答。后面的评测篇会继续展开这些指标。

幻觉治理的闭环来自真实失败样本。线上用户点踩、追问、转人工、引用未点击、后校验失败,都可以变成优化样本。RAG 系统一旦进入生产,就需要持续收集这些样本,逐步修正文档、检索、上下文和生成策略。

小结

RAG 能降低幻觉,是因为它把模型回答拉回到外部证据上。但这条链路本身存在很多不确定性。召回失败会让模型缺少证据,排序和截断失败会让正确证据用不上,上下文污染会把模型带偏,生成不忠实会让答案超出证据范围。

幻觉治理要分层做。检索层提高正确证据覆盖,Rerank 和上下文工程提升证据质量,Prompt 明确证据边界,引用让答案可追溯,拒答让系统在证据不足时停止猜测,后校验在返回前拦截无依据结论,日志和评测让问题可以持续回放和优化。

理解这一点以后,“RAG 怎么减少幻觉”,就不会停留在“加知识库”和“写好 Prompt”。更完整的回答应该围绕证据链路展开:证据能不能找回来,能不能排到前面,能不能干净地进入上下文,模型能不能忠实使用,答案能不能被引用验证,证据不足时系统能不能拒答。下一篇进入评测体系,核心就是如何证明这些治理手段真的让 RAG 变好了。