——从"证据可用性"到"生成可控性"的断层分析,兼论可落地的归因与约束路径
摘要与阅读导引
检索增强生成(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 一个可操作的归因流程
下面给出一个五步归因流程,可直接嵌入现有的评测流水线:
- 固定证据集:对每个测试问题,人工标注含答案的最小片段,并记录其 id。
- 检查进入率:比对实际送入模型的上下文,确认标注片段是否完整出现、位置如何。
- 逐句回溯:对模型输出的每个陈述句,用句子级相似度或 NLI 模型判断其是否有片段支撑,记录支撑片段 id。
- 引用核验:检查输出引用是否落在上下文片段的 id 集合内,统计越界比例。
- 分层归因:进入率低→检索/拼装问题;进入率高但回溯失败→证据利用问题;回溯成功但引用越界→引用构造问题。
实践提示:第 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 拓展资源
以下资源适合进一步动手实践,链接均在新窗口打开:
- Lost in the Middle(arXiv:2307.03172)——长上下文位置偏置的经典测量。
- RAGAS(arXiv:2309.15217)——RAG 自动评估框架。
- RAGTruth(arXiv:2311.09476)——生成幻觉的词级标注语料。
- Outlines 项目——结构化/约束生成的工程实现参考。
- Hugging Face Cookbook——RAG 与评估的实操教程合集。
七、结论与展望
回到标题的问题:检索对了,为什么还幻觉?本文给出的回答是——因为"检索对了"只保证了证据可用性,而幻觉发生在生成可控性的缺口里。这个缺口由四重机制共同打开:位置偏置削弱证据利用、参数记忆与上下文冲突、解码目标与忠实目标错配、引用格式先验脱离证据独立生成。四者叠加,就出现了"文档在眼前、引用却是编的"这一反直觉现象。
对应的工程路径也已清晰:用结构化上下文锚定证据,用封闭 id 集合约束引用,用后校验拦截越界,用拒答策略守住底线,训练侧对齐作为长期补充。这套组合不追求零幻觉,而是让幻觉变得可测量、可拦截、可解释。
展望未来,笔者认为有两个方向值得关注:一是把引用有效性纳入 RAG 评测的标准维度,推动基准从"内容忠实"走向"溯源忠实";二是随着长上下文模型能力提升,位置偏置的影响可能减弱,但"格式先验压过事实约束"的问题不会自动消失——它属于生成范式的固有特性,需要协议层面的约束而非单纯的能力提升。对从业者而言,与其等待更强的模型,不如先把引用协议与校验链路做扎实,这是当下就能兑现的确定性收益。
八、主要参考文献与拓展资源
本文在写作中参考了 RAG 评估、长上下文利用、知识冲突、幻觉检测与结构化生成等方向的公开研究,累计参考条目 60 余篇,其中近三年(2023—2025)文献占比超过 50%。以下列出 9 篇主要参考文献,完整引用请以原始文献为准。
- Lewis P., et al. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. NeurIPS 2020. arXiv:2005.11401.
- Liu N. F., et al. Lost in the Middle: How Language Models Use Long Contexts. TACL 2024. arXiv:2307.03172.
- Es S., et al. RAGAS: Automated Evaluation of Retrieval Augmented Generation. EACL 2024 Demo. arXiv:2309.15217.
- Chen J., et al. Benchmarking Large Language Models in Retrieval-Augmented Generation(RGB). AAAI 2024. arXiv:2309.01431.
- Niu C., et al. RAGTruth: A Hallucination Corpus for Developing Trustworthy Retrieval-Augmented Language Models. ACL 2024. arXiv:2311.09476.
- Lyu Y., et al. CRUD-RAG: A Comprehensive Chinese Benchmark for Retrieval-Augmented Generation of Large Language Models. ACM TOIS 2024. arXiv:2401.17043.
- Tang Y., Yang Y. MultiHop-RAG: Benchmarking Retrieval-Augmented Generation for Multi-Hop Queries. 2024. arXiv:2401.15391.
- Longpre S., et al. Entity-Based Knowledge Conflicts in Question Answering. EMNLP 2021. arXiv:2109.05052.
- Asai A., et al. Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection. ICLR 2024. arXiv:2310.11511.
文章声明:本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。
内容仅供学习参考。如需引用,请以原始文献为准。 全文约 7300 字 | 参考文献 60 余篇(主要 9 篇)。

