关于幻觉的讨论长期被一个隐喻主导:模型说错了,是因为它没见过这条事实。这个隐喻指向覆盖问题,于是所有解法都围绕覆盖面展开——更多数据、更长上下文、更激进的检索。
arXiv 上这篇《The Cost of Compression》提出了一个我认为值得认真对待的补充:即使一条事实被观测过,有限记忆也可能迫使它只能被近似地存储。这不是覆盖问题,这是压缩问题。两者可以同时存在于一个模型里,而现在的评测大多把它们混在一起。
一、一个可以推到底的简化模型
论文刻意把设定压到最简。一个无结构问答任务:
- 有
N个可能的问题 - 有
K个可能的答案 - 学习器观测到
M条训练事实 - 把这些事实压缩进至多
B比特的记忆 - 回答均匀抽样的测试问题,不允许检索
- 真值映射按均匀随机处理
这个设定去掉了所有工程细节,剩下的就是一个信息论问题:给定 M 条观测、B 比特预算,答案的期望错误率下界是多少。
推导结果是一个不带修饰的不等式:
E ≥ (M/N) · δ*(B/M) + (1 - M/N) · (1 - 1/K)
其中 δ*(r) 是均匀 K 元源在零一损失下
率失真函数的反函数,r = B/M 是每条已观测
事实平均可用的比特数。
二、两项各自的含义
这个式子的价值不在于它的精度——它显然不是幻觉的完整理论——而在于它把误差源拆开了。
第一项 (M/N) · δ*(B/M) 是压缩失真。 它只对已观测到的事实生效。B/M 是每条事实平均能分到的比特数,δ* 把这个比特预算映射成信息论意义上的最小失真。直观理解就是:一条事实被观测到了,但你只有这么多空间存它,存得越省、失真越大。
注意这里的 M/N 系数。它说明压缩失真只作用于「观测过」的那个比例。如果 M 远小于 N,模型大部分知识都在第二项里,此时优化存储效率几乎没有收益。
第二项 (1 - M/N) · (1 - 1/K) 是覆盖缺口。 未观测事实的比例乘以猜中的概率。在 K 个答案里瞎猜,猜中率是 1/K,所以错误率是 1 - 1/K。这一项和记忆容量完全无关,只和覆盖面与答案空间的规模有关。
这个结构的工程含义非常直接:两个瓶颈要分别对付,作用在不同项上的手段不能互换。
| 手段 | 主要作用项 | 机制 |
|---|---|---|
| 更多训练数据 | 第二项 | 提高 M/N,缩小覆盖缺口 |
| 更有效的记忆容量 | 第一项 | 提高 B/M,降低存储失真 |
| 检索增强 | 主要削弱第一项 | 把事实从参数搬到外部索引 |
| 结构化先验 | 两项 | 利用规律性降低实际所需比特 |
| 弃答 | 改变损失函数 | 规避猜错的惩罚 |
| 长上下文组织 | 第一项(推理侧) | 改善信息在上下文中被利用的效率 |
三、为什么这是「可分离」的失败模式
论文反复强调一个措辞:separable failure mode。这个措辞很谨慎,也很有价值。
它没有说幻觉只有这两个来源,也没有说这两项可以精确计算。它说的是:在有限记忆这个约束下,至少存在一个可以被单独刻画、单独测量的失败模式——对已观测事实的有损回忆。
这件事的重要性在于它可证伪、可测量。如果这个模式存在,就应该能在真实模型里观察到它的特征信号。论文正是这么做的:先用理论隐含的模拟验证下界的行为,再在现代语言模型上做受控的事实注入探针,通过改变事实负载和有效可训练记忆容量,去看预测中的特征是否出现。
受控事实注入这个设计值得点出。它不是看模型在自然数据上的表现,而是人为控制注入多少条事实、给多少可训练容量,然后观察错误率的走向是否与第一项的形式一致。这种「先有理论预测再去找特征」的路径,比常见的事后归因扎实得多。
四、对当前主流工程手段的再评估
按这个框架回看几件大家正在做的事,结论会变得更清楚。
长上下文不等于参数记忆。 把上下文窗口从 128K 扩到 1M,改变的是推理期有多少信息可用,而不是参数里压缩了多少知识。它确实能改善第一项在推理侧的表现,但窗口关掉之后什么也没留下。把长上下文当作「记忆扩容」用,本质上是在第一项和第二项之间来回借。
RAG 是绕开压缩瓶颈,不是解决它。 检索把事实从参数空间搬到索引空间,第一项因此被大幅削弱。但索引空间有索引空间的覆盖问题——稀疏索引漏召回、分块切断语义、多版本事实互相冲突。它没有让覆盖问题消失,只是换了个位置。
结构化先验被低估了。 表中唯一同时作用于两项的是结构。原因是结构降低了「描述一批事实所需的最少比特数」——如果一批事实服从某个简洁规律,你不需要逐条存储。这也是为什么在同样参数量下,训练数据质量与组织形式带来的差距往往大于数据量本身。
弃答改变的是评分,不是能力。 下界是在零一损失下推导的,即强制必须给出答案。一旦允许弃答,模型就可以选择不接受猜错的惩罚。这解释了一个常见困惑:为什么加了弃答之后幻觉指标明显改善,但模型看起来并没有变聪明。它确实没有变聪明——它只是换了一套更合理的损失函数。
五、这个框架的边界
必须说清楚它不是什么。
这不是幻觉的完整理论。它的模型里没有多跳推理、没有矛盾事实、没有时间衰减、没有检索噪声。(1 - 1/K) 这一项假设答案空间是离散且有限的,在开放生成任务里 K 事实上是无穷的,此时这一项趋近于 1,覆盖缺口退化成常数——这提醒我们,开放域生成的幻觉率天然被这一项压住,靠扩大覆盖面能改善的空间比闭卷问答小得多。
另外,δ* 用的是理想率失真函数,它假设编码器最优。真实模型的参数化、优化过程、以及训练数据分布的偏斜,都会让实际失真高于理论下界。所以这个式子更适合当作下界与结构参照,而不是预测工具。你不能拿它算出某个模型的幻觉率。
六、给工程实践的三条结论
第一,先区分你的错误属于哪一项。如果你的错误里大部分是「模型完全没听说过这个事实」,那优化存储效率是徒劳的,该去补覆盖或加检索。如果是「听说过但细节说错」,那第一项才是主战场。
第二,不要让两种手段互相顶替。为了降低覆盖缺口而无限堆数据,会同时推高 M/N 使更多事实落入压缩失真的管辖范围。这里存在真实的权衡,不是单调递增的关系。
第三,认真对待弃答与校准。既然猜错的惩罚可以被合法的弃答规避,那么校准良好的「我不知道」就不是能力缺陷,而是一种工程选择。把它做出来,比在指标上争论幻觉率更有实际价值。
结语
这篇论文真正提供的东西是一把尺子。在它之前,「模型记错了」和「模型没见过」是两种感受;在它之后,这两件事在同一个不等式里被写成了不同项。工程上能做的事情没有因此变多,但你终于知道自己在对付的是哪一边——而这通常就是大部分优化工作能不能见效的分水岭。