AI研究

RAG检索到了正确文档,模型仍然编了一段没人说过的引用,检索对了生成为什么还在幻觉?

👤 为我痴狂 👁 6 阅读 ❤ 0 点赞 ➦ 0 分享 📅 2026-11-05
首页› AI› AI研究› 正文
RAG检索到了正确文档,模型仍然编了一段没人说过的引用,检索对了生成为什么还在幻觉?

——从"证据可用性"到"生成可控性"的断层分析,兼论可落地的归因与约束路径

摘要与阅读导引

检索增强生成(Retrieval-Augmented Generation,RAG)的工程叙事长期建立在一个朴素假设之上:只要把正确证据送进上下文窗口,生成端就会"照着说"。然而在真实系统中,检索命中率与引用忠实度之间存在系统性偏差——检索器返回了包含答案的文档,模型却输出了文档中并不存在的表述,甚至伪造出格式规范、编号连续的参考文献。本文将这一现象定义为"证据可用性—生成可控性断层",并以此为主线,逐层拆解其成因、诊断方法与约束手段。

全文的论证路径是:先界定问题边界,区分检索失败、证据利用失败与引用构造失败三类不同性质的错误;再从注意力分配、上下文位置偏置、解码目标错配、引用作为"格式先验"被独立生成四个机制层面解释断层来源;随后给出一套以"证据可归因性"为核心的诊断流程与工程改造清单;最后讨论约束解码、引用校验、训练侧对齐三条技术路线的边界条件与成本结构。文中所引数据均标注来源,模拟与整合数据单独说明。

目录

一、问题界定:三种"检索对了"的伪命题

1.1 检索命中不等于证据可用

工程上常说的"检索对了",通常指标注答案所在的文档出现在 Top-K 结果中,即召回率(Recall@K)达标。但召回率衡量的是"文档是否被取回",而非"答案片段是否以模型可消费的形式进入上下文"。二者之间存在多重损耗:分块(chunking)可能把答案切成两半,重排序(rerank)可能把含答案的块压到窗口边缘,上下文拼装可能因长度截断而丢弃关键段落。因此,Recall@K 是一个上界指标,它给出的是"有机会正确"的概率,而非"必然正确"的保证。

本文评述:把召回率当作 RAG 质量的总指标,是当前工程实践中最普遍的度量错位。召回率的分母是标注答案,而生成端的输入是拼接后的上下文序列,两者的对象根本不同。任何以 Recall@K 论证"检索没问题、所以是模型的问题"的归因,都跳过了一个必要环节——证据在上下文中是否处于可被有效利用的形态。

1.2 三类错误的严格区分

为便于后续诊断,笔者建议把"检索正确但输出错误"细分为三类,它们的成因与修复手段完全不同:

错误类型 定义 典型表现 主要修复层
证据利用失败 证据在上下文中,但模型未采信或采信错误片段 答非所问、答成参数记忆中的旧版本 上下文组织、指令、微调
引用构造失败 内容大体正确,但引用的编号、标题、作者系伪造 不存在的文献、错位的编号 引用后校验、结构化输出
内容虚构 证据未覆盖的部分被模型自行补全 具体数字、时间、因果链被"合理化" 拒答策略、约束解码、训练对齐

这三类错误的混淆,是大量线上事故复盘失效的根源。引用构造失败尤其具有迷惑性:因为它往往与正确内容同时出现,人工抽检时容易因"内容对"而放过"引用错"。而一旦下游系统把引用当作溯源依据,错误引用就会被放大为可信度灾难。

1.3 为什么"引用"是幻觉的高发区

引用在文本中是一种高度模式化的成分:编号、方括号、作者姓氏、年份、期刊名,都有稳定的表面形式。语言模型在预训练中见过海量此类模式,因而对"引用长什么样"有极强的先验。问题在于,形式先验与事实约束是两套独立的生成信号:模型可以先按形式先验生成一个语法完美的引用,再去寻找内容支撑,而不是反过来。当证据中没有明确的可引用对象时,形式先验就会压倒事实约束,产出"格式正确、内容虚构"的引用。

笔者认为,这正是"检索对了还幻觉"最反直觉的部分:检索提供的是内容约束,而引用生成走的是形式通道,两者在解码时并未强制绑定。要修复它,不能只加强检索,而必须在生成端建立"引用必须指向上下文中实际存在的片段"这一硬约束。

二、机制拆解:断层是如何在生成端形成的

2.1 注意力分配与"中间遗忘"

Liu 等人 2023 年的研究("Lost in the Middle: How Language Models Use Long Contexts")系统测量了信息在上下文中的位置对利用率的影响,发现模型对上下文首尾两端的信息利用显著优于中段,呈 U 形曲线。这一现象在长上下文场景中尤为明显。对 RAG 的直接含义是:即便含答案的块被正确召回,如果它被拼装在上下文中段,被有效采信的概率会下降。

本文评述:位置偏置不是"模型不听话",而是注意力机制在长序列上的统计特性。工程上把它当作提示词问题去修,往往收效有限;更有效的做法是把最关键的证据块显式重排到上下文首部或尾部,或在指令中给出"仅依据标记为 [E1] 的片段作答"这类可定位的锚点。位置问题应当用位置手段解决,而非用语气更强的指令去压制。

2.2 上下文与参数记忆的冲突

当上下文证据与模型参数中存储的知识不一致时,模型并不总是优先采信上下文。Longpre 等人 2021 年的工作("Entity-Based Knowledge Conflicts in Question Answering")表明,在存在知识冲突时,模型对上下文与参数记忆的取舍受实体类型、上下文连贯性等多种因素影响,并不稳定。这意味着"证据在眼前"并不构成"证据被采信"的充分条件。

在 RAG 中,这一冲突常表现为"旧版本答案":知识库已更新,检索也取回了新版本,但模型仍输出训练时见过的旧数值。这类错误的危险在于它看起来非常合理,人工审核若不做逐条比对极难发现。笔者认为,缓解此类冲突的关键不是让模型"更相信上下文",而是让上下文具备可验证的结构——例如给出明确的生效日期、版本号,并要求模型在输出中显式引用该字段。

2.3 解码目标与"忠实"目标的错配

标准语言模型的训练目标是下一个 token 的似然最大化,其优化对象是"流畅且常见"的续写,而非"可被证据支持"的陈述。这两个目标在多数情况下一致,但在证据稀薄处会分叉:此时"编一个合理的说法"在似然意义上优于"承认不知道"。这是幻觉的统计学根源,也是为什么仅靠提示词"不要编造"无法根治——提示词改变的是条件分布,而非优化目标本身。

本文评述:把幻觉完全归因于"模型能力不足"是一种懒惰的解释。更准确的表述是:在缺乏外部约束时,解码过程会自然地滑向高似然但低事实性的区域。因此,约束必须来自解码之外——检索的结构化、后校验的硬规则、或训练阶段的偏好对齐,三者都是在给似然目标打补丁。

2.4 引用的"格式先验"独立生成

这是本文主线中最关键的一环。引用在生成时通常以两种方式出现:一是"先取证据、再标注来源"的 grounded 路径;二是"先按格式生成引用、再补内容"的 pattern 路径。后者在模型见过大量学术文本后极易被激活,尤其在用户要求"给出参考文献"时。此时模型实际上是在做模式补全,而非事实检索。

# 伪代码:两种引用生成路径的差异
# 路径 A(grounded):先定位证据,再生成引用
evidence = retrieve(query)            # 返回带 id 的片段
answer   = generate(query, evidence)  # 指令:仅依据 evidence 作答
cite     = [e.id for e in evidence if supports(answer, e)]

# 路径 B(pattern):先按格式生成,再补内容
cite     = generate_citation_style()  # 触发格式先验,未绑定证据
answer   = generate(query, cite)      # 内容围绕伪造引用"合理化"

工程上区分这两条路径并不困难:只要在输出协议中强制引用必须来自一个封闭集合(如上下文片段的 id 列表),路径 B 就无从发生。真正的难点在于,很多系统把"引用"当作自由文本字段,给了模型自由发挥的空间。

三、诊断流程:把"幻觉"拆成可测量的中间量

3.1 端到端指标为什么不够用

端到端的正确率或人工评分只能告诉你"错了",无法告诉你"错在哪一层"。要定位断层,必须引入中间量。笔者建议至少采集四个可观测指标:证据进入率(含答案片段是否真的进入上下文)、证据可定位率(模型输出能否逐句回溯到具体片段)、引用有效率(输出引用是否指向真实存在的片段)、拒答恰当率(证据不足时是否正确拒答)。

这四个指标构成一条链:任一环节断裂,都会表现为端到端的幻觉。把它们分开测量,才能避免"一错全怪模型"的归因惯性。

3.2 一个可操作的归因流程

下面给出一个五步归因流程,可直接嵌入现有的评测流水线:

  1. 固定证据集:对每个测试问题,人工标注含答案的最小片段,并记录其 id。
  2. 检查进入率:比对实际送入模型的上下文,确认标注片段是否完整出现、位置如何。
  3. 逐句回溯:对模型输出的每个陈述句,用句子级相似度或 NLI 模型判断其是否有片段支撑,记录支撑片段 id。
  4. 引用核验:检查输出引用是否落在上下文片段的 id 集合内,统计越界比例。
  5. 分层归因:进入率低→检索/拼装问题;进入率高但回溯失败→证据利用问题;回溯成功但引用越界→引用构造问题。
实践提示:第 3 步的逐句回溯不必追求完美,用轻量 NLI 模型做粗筛、人工复核争议样本即可。关键是让"哪一句没有证据"变成可统计的量,而不是靠肉眼扫全文。

3.3 一个真实场景的拆解示例

假设某企业知识库问答系统被投诉"引用了不存在的内部规范"。按上述流程拆解,常见的结果是:含答案的规范条款确实被召回(进入率高),但被切分在上下文第 7 块、位于窗口中部(位置不利);模型输出了正确要点,但引用编号是"规范第 3.2 条"——而上下文中该条款编号实际为"3.2.1"(引用构造失败)。此时若只加强检索,问题不会消失;若只改提示词,编号仍可能漂移。正确做法是同时做两件事:把关键条款重排到上下文首部,并把引用改为从封闭 id 集合中选择。

本文评述:这个例子说明,断层往往是多因一果。工程团队容易陷入"单点归因"的舒适区,因为单点修复的叙事更简单。但可验证的改进必须建立在对中间量的分别测量之上,否则优化只是碰运气。

四、工程改造:从提示工程到约束解码的四层防线

4.1 第一层:上下文结构化

把证据从"一段拼接文本"改造为"带 id 的结构化条目",是成本最低、收益最直接的一步。每个片段附带唯一 id、来源、生效时间,并在指令中明确"引用只能使用这些 id"。这一步同时解决了引用封闭集合与位置锚定两个问题。

[E1] 来源:内部规范 v2.3 | 生效:2024-06-01
正文:……(片段原文)……
[E2] 来源:运维手册 v1.8 | 生效:2024-03-15
正文:……(片段原文)……

指令:仅依据 [E1]-[E2] 作答;每个结论后标注来源 id;
若证据不足,输出"证据不足"并说明缺什么。

4.2 第二层:输出协议与引用后校验

要求模型以结构化格式输出(如 JSON),字段包括 answer、citations、confidence。随后在服务端做硬校验:citations 中的每个 id 必须存在于本次上下文;每个陈述句必须能匹配到至少一个 citation。校验不通过则触发重试或降级为"证据不足"。这一层的本质是把"引用"从自由文本变成受约束的枚举值。

笔者认为,引用后校验是当前投入产出比最高的一环。它不依赖模型能力提升,纯靠工程规则即可拦截绝大多数伪造引用。代价是增加了服务端逻辑与少量延迟,但相比错误引用带来的信任损失,这个代价几乎可以忽略。

4.3 第三层:约束解码与拒答策略

在解码阶段,可通过受限词表或语法约束,强制引用 token 只能来自上下文 id 集合。对开源模型,可用 outlines、guidance 等库实现结构化生成;对闭源 API,则依赖输出 schema 与后校验。同时应显式设计拒答路径:当检索得分低于阈值、或证据与问题语义距离过大时,直接返回"证据不足",而不是让模型自由发挥。

本文评述:拒答策略常被产品侧抵触,因为它降低了"有问必答"的体验。但从可验证性角度看,一个诚实的"不知道"远比一个精致的错误更有价值。关键在于把拒答做得有信息量——告诉用户缺什么证据、可以怎么补,而不是一句冷冰冰的"无法回答"。

4.4 第四层:训练侧对齐

对自研模型,可在监督微调或偏好优化阶段引入忠实度信号:构造"有证据—正确引用"与"有证据—伪造引用"的对比样本,用 DPO 类方法提升前者概率。RAG 相关的训练方法(如 RA-DIT、Self-RAG 等)已在这一方向做了探索,其核心思想是让模型学会判断"是否需要检索、证据是否足够、输出是否有据"。

需要强调的是,训练侧对齐见效慢、成本高,且难以覆盖知识库的持续更新。它更适合作为前三层防线的补充,而非替代。把全部希望寄托在"训一个更诚实的模型"上,在快速迭代的业务场景中并不现实。

五、数据与评测:引用忠实度该怎么量

5.1 现有基准的覆盖与盲区

RAG 评测已有多个公开基准:RAGAS 提出以忠实度(faithfulness)、答案相关性、上下文精确度等维度评估 RAG 流水线;RGB(Chen 等,2023)从噪声鲁棒性、负样本拒答、信息整合、反事实鲁棒性四个维度考察;CRUD-RAG(Lyu 等,2024)面向中文场景构建了覆盖创建、读取、更新、删除四类任务的评测集;MultiHop-RAG(Tang 与 Yang,2024)聚焦多跳查询;RAGTruth(Niu 等,2024)则专门针对生成中的幻觉做词级标注。这些工作共同把"忠实度"从模糊感受变成了可计算指标。

但盲区依然存在:多数基准衡量的是"内容是否有据",对"引用标识是否真实存在"这一层覆盖不足。也就是说,一个模型可能拿到不错的忠实度分数,却在引用编号上系统性漂移。笔者认为,引用有效性应当作为独立维度纳入评测,而不能被内容忠实度吸收。

5.2 数据集与预处理说明

若要在自有业务上构建评测集,可参考以下预处理流程(本文所述为方法建议,非某数据集原始统计):

步骤 操作 注意事项
采样 按业务问题类型分层抽样 覆盖单跳、多跳、否定、时效类
标注 标注最小证据片段及其 id 片段需可独立支撑结论
清洗 去除重复、过期版本、格式噪声 保留版本号与生效时间
切分 按语义边界切块,记录块 id 与偏移 避免把结论与前提切散

需要说明的是,不同业务的知识形态差异极大,通用基准的绝对分数不宜直接横向比较。更可靠的做法是建立一套内部金标集,并持续用同一套流程回归,观察中间量随版本迭代的变化趋势。

5.3 引用忠实度的计算口径

一个可落地的口径是:对输出中每个带引用的陈述句,检查其引用 id 是否在上下文集合内(引用有效率),再用 NLI 判断该句是否被所引片段蕴含(引用支撑率)。两者相乘得到引用忠实度的近似值。这个口径简单、可自动化,适合做持续监控。

本文评述:任何单一指标都可能被"优化"——模型可能学会只引用最安全的片段而回避关键结论。因此引用忠实度应与答案覆盖率联合观察,防止出现"引用全对但什么都没答"的退化。

六、对比与局限:三条技术路线的成本边界

6.1 三条路线的取舍

路线 见效速度 主要成本 适用边界
提示与上下文工程 快(天级) 低 受模型指令遵循能力上限约束
后校验与约束解码 中(周级) 中,需服务端改造 依赖结构化输出协议
训练侧对齐 慢(月级) 高,需数据与算力 知识更新频繁时收益递减

6.2 局限与失效条件

必须承认,上述防线各有失效条件。上下文结构化在片段极多时会挤占窗口,反而加剧位置偏置;后校验依赖 NLI 模型,而 NLI 本身有误差,可能误杀正确引用;约束解码在闭源 API 上无法直接实施,只能退化为后校验。训练侧对齐则面临知识时效性问题:模型学会"诚实",不等于学会"最新的诚实"。

笔者认为,工程上不应追求"消灭幻觉",而应追求"幻觉可检测、可拦截、可解释"。这是一个更现实也更可验证的目标。把不可达的零幻觉当作 KPI,只会催生指标造假与过度拒答。

6.3 拓展资源

以下资源适合进一步动手实践,链接均在新窗口打开:

七、结论与展望

回到标题的问题:检索对了,为什么还幻觉?本文给出的回答是——因为"检索对了"只保证了证据可用性,而幻觉发生在生成可控性的缺口里。这个缺口由四重机制共同打开:位置偏置削弱证据利用、参数记忆与上下文冲突、解码目标与忠实目标错配、引用格式先验脱离证据独立生成。四者叠加,就出现了"文档在眼前、引用却是编的"这一反直觉现象。

对应的工程路径也已清晰:用结构化上下文锚定证据,用封闭 id 集合约束引用,用后校验拦截越界,用拒答策略守住底线,训练侧对齐作为长期补充。这套组合不追求零幻觉,而是让幻觉变得可测量、可拦截、可解释。

展望未来,笔者认为有两个方向值得关注:一是把引用有效性纳入 RAG 评测的标准维度,推动基准从"内容忠实"走向"溯源忠实";二是随着长上下文模型能力提升,位置偏置的影响可能减弱,但"格式先验压过事实约束"的问题不会自动消失——它属于生成范式的固有特性,需要协议层面的约束而非单纯的能力提升。对从业者而言,与其等待更强的模型,不如先把引用协议与校验链路做扎实,这是当下就能兑现的确定性收益。

八、主要参考文献与拓展资源

本文在写作中参考了 RAG 评估、长上下文利用、知识冲突、幻觉检测与结构化生成等方向的公开研究,累计参考条目 60 余篇,其中近三年(2023—2025)文献占比超过 50%。以下列出 9 篇主要参考文献,完整引用请以原始文献为准。

  1. Lewis P., et al. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. NeurIPS 2020. arXiv:2005.11401.
  2. Liu N. F., et al. Lost in the Middle: How Language Models Use Long Contexts. TACL 2024. arXiv:2307.03172.
  3. Es S., et al. RAGAS: Automated Evaluation of Retrieval Augmented Generation. EACL 2024 Demo. arXiv:2309.15217.
  4. Chen J., et al. Benchmarking Large Language Models in Retrieval-Augmented Generation(RGB). AAAI 2024. arXiv:2309.01431.
  5. Niu C., et al. RAGTruth: A Hallucination Corpus for Developing Trustworthy Retrieval-Augmented Language Models. ACL 2024. arXiv:2311.09476.
  6. Lyu Y., et al. CRUD-RAG: A Comprehensive Chinese Benchmark for Retrieval-Augmented Generation of Large Language Models. ACM TOIS 2024. arXiv:2401.17043.
  7. Tang Y., Yang Y. MultiHop-RAG: Benchmarking Retrieval-Augmented Generation for Multi-Hop Queries. 2024. arXiv:2401.15391.
  8. Longpre S., et al. Entity-Based Knowledge Conflicts in Question Answering. EMNLP 2021. arXiv:2109.05052.
  9. Asai A., et al. Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection. ICLR 2024. arXiv:2310.11511.

文章声明:本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。

内容仅供学习参考。如需引用,请以原始文献为准。  全文约 7300 字 | 参考文献 60 余篇(主要 9 篇)。

🔒 复制本站文章内容需登录并达到 L3。当前:未登录

分享到

💬
微信
📷
朋友圈
🐧
QQ好友
🌐
QQ空间
👁
微博
📌
钉钉
🔗
复制链接
📑
复制图文

微信扫一扫分享

打开微信「扫一扫」,扫描二维码后在微信中分享给好友或朋友圈。

💬 评论 (0)

评论功能已关闭

⏸️ 本站暂未开放评论功能,不能进行评论,此为规划的后续开发预留
首页| 关于本网| 网站声明| 联系我们| 网站纠错| 服务| 网站地图
黔ICP备19010680号-1  |  邮箱:six528528@163.com
贵公网安备 52010302001819号
Copyright 2019-2026 http://www.databrush.com/ All rights reserved.
QQ
QQ扫一扫
Logo
DBN数据刷