← 返回题目列表

为什么 RAG 检索到了资料仍然会幻觉?

高频 中等 第 2 / 29 题 更新于 2026/09/18
RAG幻觉Grounding证据

简化版

“检索到”不等于“模型使用了正确证据”。真证据可能被错误排序、截断或埋在噪声中,也可能与其他文档冲突;生成器还会沿用参数记忆、误解表格或把合理推断说成事实。治理要分别验证证据召回、上下文质量、claim—citation 支持和无答案拒答,而不是只在 Prompt 写“依据资料”。

详细版

常见原因分四层:检索命中的是主题相关但不能回答的片段;packing 丢掉限定条件或加入太多重复;Prompt 没定义证据不足/冲突处理;模型生成时忽略证据、错误合成或引用不支持。还可能是索引旧、权限过滤后真证据消失或 OCR 错误。

诊断用 oracle 实验:给定真值文档仍错,问题偏生成/理解;给定真值原文正确而检索上下文错,问题在召回/组装。输出拆成原子 claims,每条绑定 source_id 并做 entailment 校验;无充分证据返回结构化 insufficient_evidence。按 retrieval recall、context precision、faithfulness、answer correctness 分层评测。

检索命中 -> 证据是否可回答 -> 是否完整进入上下文 -> 模型是否忠实使用 -> Claim是否被引用支持

完整版教学

一、相关文档不一定包含答案

向量检索优化语义相似,不直接判断片段能否蕴含答案。用户问“退款期限”,召回一篇退款概览但没有天数,主题非常相关,模型却只能靠参数记忆补数字。检索分数高不能当作证据充分度。

需要标注 answer-bearing evidence,并用 reranker 或 verifier 判断 query—chunk 是否可回答。无答案样本尤其重要,否则系统会学习“既然检索了就必须答”。

二、证据可能在组装时被破坏

切块把条件拆开、Token 超限截断、去重误删或父块回填不足,都可能让已召回真证据没完整进入模型。相反,多个近重复错误片段会在上下文中形成虚假多数。要保存 retrieval candidates 与 final context 的差异。

典型失败诊断信号
召回真文档不在Top-kevidence Recall低
重排真证据排名靠后rerank MRR低
Packing条件被截/重复context precision低
生成有证据仍答错oracle context仍失败
引用答案对但引用错entailment失败

分层后才能选择正确修复,而不是无脑增加 k。

记忆钩子:RAG 有两道考试——先把证据送到桌上,再依据桌上的证据作答;第一道过了不代表第二道必过。

三、参数记忆会与文档竞争

模型预训练中学到的旧知识可能比上下文新规则更强,尤其当文档措辞含糊。Prompt 应明确资料是本任务权威来源,要求指出冲突和版本;但提示不能完全强制,生成后仍要校验。

例如模型记得旧退款期 30 天,当前文档改为 14 天。若只给一小段“期限调整如下”却缺标题,模型可能补回 30。提供完整生效日期、政策名和原句,并让答案附引用,可降低竞争。

四、长上下文和噪声怎样影响注意力

加入更多 chunk 会提高理论召回,却降低有效信息密度。关键句埋在 12K Token 中部,模型可能忽略;相似但不同产品的说明会造成实体串线。Rerank、产品 metadata filter 和 claim-focused packing 比扩大窗口更有效。

做位置消融:把同一真证据放前、中、后,记录准确率。若前后 90%、中部 60%,需要调整排序或减少上下文。对每个文档显示产品、日期和来源标签,帮助模型区分边界。

五、推断与事实为什么会混淆

文档说 A 导致 B,B 常与 C 同时发生,模型可能回答 A 导致 C,并以原文为引用。逻辑听起来合理但证据没有直接支持。输出应区分 direct fact 与 inference,并为推断列出前提;高风险问题只允许直接支持。

可把答案拆成 claims:

{"claim":"退款期为14天", "sources":["S2"], "support":"direct"}

后端对每条 claim 做 entailment,若只有 related 而非 entailed,则降级、不显示或要求模型重写。

六、证据冲突与过期

两份政策版本冲突时,模型可能把条件混成一个新答案。索引必须带 valid_from、valid_to、version 和 authority,检索按查询时间过滤;无法判定时并列冲突并拒绝单一结论。简单选择最新抓取时间可能错,因为抓取新不等于内容生效新。

OCR 或表格结构错误也会产生假证据。关键金额可回看原图,规则校验“总额=分项和”。RAG 并不会自动修复上游数据质量,证据本身必须可信。

七、分层指标如何设计

用 evidence Recall@k 测真证据进入候选,context precision 测最终上下文有用比例,answer correctness 测结论,faithfulness 测每个 claim 是否被上下文支持,citation completeness/accuracy 测引用。无答案集再测拒答 Recall 与过拒。

假设 Recall@10=95%,但 faithfulness=70%,主要瓶颈是生成/packing;若 oracle context 下 faithfulness=96%,更说明正常上下文噪声是原因。把指标相乘不是严格公式,但能直观看出任何一层低都会限制端到端上限。

八、常见误区与追问

  • 误区:只要召回到相关文档,模型就不会幻觉。 相关不等于可回答,模型也可能忽略或误用证据。
  • 误区:增加 Top-k 总能改善。 更多噪声和冲突可能降低忠实度。
  • 误区:附了引用就代表事实有依据。 引用可能仅主题相关,需 claim-level entailment。
  • 追问:如何区分检索和生成问题? 给真值证据做 oracle 实验,并比较候选与最终上下文。
  • 追问:如何让模型在无答案时停下? 训练/提示明确不足状态,校准支持度阈值,并准备无答案评测集。
  • 追问:旧知识与新文档冲突怎么办? 文档携带权威版本,明确以当前证据为准并输出冲突说明。

九、加强记忆

检索后幻觉可记成“召得对、装得全、读得准、说有据”。逐层检查可回答证据是否进入候选、限定条件是否完整组装、模型是否受噪声和旧记忆干扰、每个 claim 是否被引用蕴含。用 oracle 证据定位层级,并让无答案成为合法输出,RAG 才从“有资料”升级为“依据资料”。