为什么你的 RAG 引用在撒谎:源归因中的事后合理化
向用户展示一个带有 AI 答案的界面,且每句话末尾都附有链接,还没等他们读完任何一个引用的段落,他们的信任度就已经飙升。这正是企业级 RAG 的全部营销卖点:“有据可查”、“有源可循”、“可验证”。这也是 AI 工程领域中交付最多、但测试最少的说法。最近的基准测试发现,50% 到 90% 的 LLM 回复并未得到其引用来源的完全支持,有时甚至与来源相矛盾。在对抗性评估集中,最先进模型生成的引用中有高达 57% 是不忠实的:模型根本没有真正使用它指向的文档。这些引用是事后补上去的,目的是为了让模型已经决定给出的答案显得合理。
这不是检索层面的 Bug。即便你拥有完美的检索系统,仍然会得到虚假的引用,因为这种失效是架构性的。生成器先写出文字,然后再缝补链接。这些链接看起来像证据,实则只是装饰。
业界一直过度关注引用的文档是否相关,却忽略了一个更令人不安的问题:引用的**片段(span)**是否真的蕴含了它所关联的论点?在生产规模下,答案通常是否定的。而且 你的 UI 把引用做得越精致——角标注释、悬停预览、彩色高亮——用户就越会果断地停止检查。
正确性不等于忠实度
研究界终于在企业级 RAG 产品混为一谈的两个概念之间划清了界限:引用的正确性(correctness)和引用的忠实度(faithfulness)。
- 正确性考量的是:引用的文档是否支持该陈述?你可以通过自然语言推理 (NLI) 模型来衡量,询问“段落 P 是否蕴含论点 C?”
- 忠实度考量的是:模型是否真的从引用的文档中推导出了该论点,还是说模型先根据参数记忆生成了论点,然后去猎取一个看起来兼容的段落?
一个事后合理化的引用在输出层面与忠实的引用是无法区分的。它甚至在技术上可能是“正确”的——段落确实支持论点——但模型在生成答案时忽略了该段落。这使得整个信任链条变成了一个“隐瞒真相的谎言”。用户(或下游代理)假设检索到的证据驱动了答案。事实并非如此。驱动答案的是模型的预训练,而检索只是“演戏”。
这一点至关重要,因为这种失效模式是无声的。如果你的生成器自信地断言了一些看似合理的事情,附上了一个看起来很真实的引用,且引用的片段与主题大致相关,那么任何“检查来源”的 UI 设计都无济于事。人类会略读,代理会将通过的链接视为确认。幻觉在引用这一步被“洗白”了。
架构如何固化了谎言
看看大多数 RAG 流水线是如何构建的,事后合理化就变得可以预见,甚至几乎是不可避免的。
主流模式是先生成再检索后引用 (generate-then-retrieve-then-cite) 或 先检索再生成后引用 (retrieve-then-generate-then-cite)。在这两种模式中,先运行检索,再运行生成,然后是第三步——通常是一个单独的提示词,有时是一个单独的模型——为已经写好的文本分配引用。等到引用步骤运行时,生成器与任何特定段落之间已经没有了机械上的联系。它根据 (提示词指令) × (参数记忆) × (松散关注的检索上下文) 的混合分布选择了 Token。引用器随后做了它唯一能做的事:将输出的每个句子与最接近的检索上下文块进行相似度匹配。“最接近”并不代表“因果关系”。
那个架构上的接缝就是忠实度丧失的地方。最近对比“生成时引用 (G-Cite)”与“事后引用 (P-Cite)”的研究发现,这种权衡早已植根于设计之中:P-Cite 实现了更高的引用覆盖率(它几乎能为任何论点找到某个匹配的段落),但语义精准度较低;而 G-Cite 在解码过程中就选定了证据,对于引用的内容更加吝啬。在 FEVER 事实核查任务中,G-Cite 达到了 94% 的正确性,但覆盖率仅为 27%;P-Cite 则在 75% 的正确性和 75% 的覆盖率之间取得了平衡。覆盖率是营销所需要的——每个句子都有脚注;精准度才是用户所需要的。
另一个架构上的罪魁祸首是块级检索 (chunk-level retrieval) 与句级引用 (sentence-level citation) 的配对。你的检索器返回一个 512 token 的块,生成器写一个句子,引用器把该块的 ID 钉在句子上。这个块包含十二 个论点,其中只有一个(可能)支持写下的句子。用户看到“[3]”并点击;他们跳转到一个包含关键词的段落;他们的大脑将该论点归类为“有据可查”。没有人验证过他们阅读的具体句子是否被所引用块的特定片段所蕴含。这就是为什么子句级和片段级引用的研究在近期呈爆发式增长的原因——粗粒度的指向在功能上无异于误导信息。
引用忠实度评估 (The Citation-Faithfulness Eval)
测量层面的修复方法是:停止将“是否有引用?”视为通过/失败的检查,并开始将引用级蕴含(citation-level entailment)视为一级评估(first-class eval)。
一个极简流水线:
- 将回答分解为原子主张(每个主张是一个可验证的断言)。
- 针对每个主张,提取被引用的文本段(span),而不仅仅是被引用的文档。
- 运行一个 NLI(自然语言推理)模型:被引用的文本段是否蕴含该主张?标记为
SUPPORTS(支持)、CONTRADICTS(矛盾)或NEUTRAL(中立)。 - 汇总为引用精确率(实际产生蕴含关系的引用比例)和引用召回率(拥有至少一个蕴含引用的主张比例)。
- https://arxiv.org/abs/2412.18004
- https://www.alphaxiv.org/overview/2412.18004v1
- https://dl.acm.org/doi/10.1145/3731120.3744592
- https://arxiv.org/html/2509.21557
- https://www.nature.com/articles/s41467-025-58551-6
- https://arxiv.org/abs/2305.14627
- https://arxiv.org/html/2407.01796
- https://arxiv.org/abs/2509.20859
- https://arxiv.org/abs/2507.04480
- https://arxiv.org/html/2510.17853v1
- https://www.whyaitech.com/notes/systems-note-002.html
- https://aclanthology.org/2023.findings-emnlp.307.pdf
