一半重要记忆从未被检索到:因果推断揭露LLM记忆系统的致命盲区
你给一个带记忆的 LLM 装了一套记忆管理系统:每条对话后,系统决定存什么、删什么、合并什么。为了判断某条记忆 m 有没有用,你做了一个看起来很合理的事——做 A/B 实验:有 m 的对话和没有 m 的对话,比较任务表现差异。
目录
一个直觉的陷阱
你给一个带记忆的 LLM 装了一套记忆管理系统:每条对话后,系统决定存什么、删什么、合并什么。为了判断某条记忆 m 有没有用,你做了一个看起来很合理的事——做 A/B 实验:有 m 的对话和没有 m 的对话,比较任务表现差异。
结果发现,大量记忆的"效用"接近零。于是系统自信地把它们删了。
但等一下。一条从未被检索到的记忆,它的"效用为零"和"我们不知道它有没有用"是完全不同的事情,但从外部观测来看,它们一模一样。
这就是 CMP(Causal Memory Policy)这篇论文要解决的核心问题。作者用结构因果模型(SCM)证明了一件让人后背发凉的事:在当前所有记忆管理系统中,超过一半的"必需记忆"从未被检索器召回过,而它们的"低效用"估计完全是假象。
记忆效用不是标量,是乘积
论文的第一个关键贡献是把记忆效用拆成两个因子:
- 可检索性:给定查询 q 和上下文 c,记忆 m 被检索器选中的概率
- 条件效用:如果 m 被检索到了,它对任务输出的因果贡献
一条记忆可能条件效用极高(一旦被检索到就能大幅提升回答质量),但如果检索器永远不选它,它的总效用就是零。而你从外部观测到的"零效用",无法区分这两种情况: 1. 这条记忆真的没用 2. 这条记忆有用,但检索器从没给它机会
"存储层干预"的幻觉
你可能会想:那我随机往记忆库里加/删记忆,不就能估计效用了?
论文证明这不够。因为检索是记忆到输出的唯一路径(中介变量)。如果你在存储层做随机化(加一条记忆 m 或删一条记忆 m),但检索器从不召回 m,那么:
- 有 m 的检索结果 = 没有 m 的检索结果
- 两个实验臂产生了完全相同的实验
实证数据触目惊心
| 基准测试 | 必需记忆中 P=0 的比例 | 记忆库大小 |
|---|---|---|
| LongMemEval (独立子集) | 54.0% | 487 |
| LongMemEval (全部) | 61.2% | 487 |
| LoCoMo | 66.9% | 588 |
| Mem0 (部署系统) | 28.4% | 291 |
更让人不安的是 Figure 3 的发现:任务正确率在检索到全部必需记忆之前一直趴在 0.2 附近,只有当所有必需记忆都被检索到时,才跳到 0.73。这意味着"漏掉一条"和"漏掉一半"几乎一样糟糕——因为多跳推理需要所有拼图。
CMP 的解法:随机化检索本身
既然问题出在检索层,解法也必须在检索层。CMP 的核心设计是 "随机化检索暴露"(randomized retrieval exposure):
把 B 个上下文槽位分成两部分:
- B-k 个槽位:正常用检索器排序填充
- k 个槽位:从暴露池 \(\mathcal{P}\) 中按已知概率随机采样填充
为什么必须"平衡分配"而不是独立采样?
如果每次独立以概率 \(k/|\mathcal{P}|\) 采样,在 \(T=90, k=2, |\mathcal{P}|=32\) 的设置下,期望暴露次数是 5.6 次,但约三分之一的记忆会得到少于 5 次暴露。CMP 用平衡分配:每条记忆精确获得 \(\lfloor Tk/|\mathcal{P}| \rfloor\) 或 \(\lceil Tk/|\mathcal{P}| \rceil\) 次暴露。
估计器
有了已知暴露概率,条件效用的估计就变成了标准的逆概率加权(Hájek 估计器):
由于平衡分配固定了 \(n_m\),这个估计器的方差是精确的,不依赖于实际实现的臂大小。
关键实验结果
Q1:检索支持失败有多严重?
已在上表展示。54%-67% 的必需记忆从未被检索到。
Q2:更好的检索器能修复吗?
在 Mem0 上,要恢复 50% 的未被检索到的必需记忆,需要把检索窗口扩大到 138 条;恢复 90% 需要扩大到 286 条——这等于放弃检索。问题不是检索器不够好,而是确定性检索本身就有盲区。
Q3:随机化检索能否恢复可识别性?
| 设计 | AUC | 提名率 | 黄金损失 |
|---|---|---|---|
| 存储层随机化 | 0.542 | 0.97 | 10.9 |
| CMP(暴露设计) | 0.664 | 0.68 | 5.2 |
更关键的是 Table 3 的分层分析:两个设计的全部差距都来自 P=0 的那一层。在 P>0.8 的层,两者完全一样。这证明问题不在估计器,而在设计——存储层估计器不是"不够准确",而是"在测量一个根本不可识别的东西"。
Q4:识别了效用就能做删除策略吗?
不能。 这是论文最诚实的发现之一。
逐查询估计把 AUC 从 0.581 提到 0.784,但这个效用不能跨查询迁移。在对话的前半段估计的效用,和后半段的相关性只有 r=0.10。没有任何"在已观测查询上的聚合"能预测记忆在未观测查询上的价值。
论文因此不声称 CMP 是一个删除策略。它只声称 CMP 是一个识别框架——让你能测量,但测量本身不等于决策。
不可逆操作的不对称性
论文还有一个精妙的决策理论贡献:遗忘和保留的错误代价不对称。
- 遗忘是不可逆的:删了就没了,未来无法重新估计效用
- 保留是可逆的:留着不用的记忆,以后还能删
消融实验验证了这一点:
- 去掉单侧弃权:黄金损失从 5.2 升到 9.0
- 去掉暴露设计:黄金损失从 5.2 升到 10.9
- 两个都去掉:黄金损失升到 11.7
- 双侧弃权反而更差:14.1(比不弃权还差)
我的思考:这个发现为什么重要
1. "评测盲区定律"的新实例
这篇论文让我想到一个正在成型的谱系:评测系统的盲区不是随机的,而是系统性的。
- LLM 审计器有 100% 召回率但校准极差(Rigged Backtest)
- 社交性谄媚评估器把"好的沟通"误判为"谄媚"(Receptiveness)
- 关键词匹配假阳性(评测可信度谱系)
- 现在再加上:存储层随机化在 52.2% 的情况下做了"不存在的实验"
2. "标量幻觉"的又一个案例
"记忆效用"不是一个标量。它是两个因子的乘积:可检索性 × 条件效用。把它当标量处理,就会在 P=0 的区域产生系统性误判。
这和之前讨论过的"齿轮还是摩擦垫更好"(不能问标量,要问约束下的选择)、"LLM 审计准不准"(不能问标量,要问召回和校准两个维度)是同一个模式。
3. "判断-闸门解耦"在记忆层的实例
CMP 的结构让我想到"判断-闸门解耦"谱系:
- 判断:记忆库中有什么记忆(存储层操作)
- 闸门:检索器选择哪些记忆进入上下文
4. 暴露池选择是"剩余的硬问题"
论文最诚实的地方是承认:CMP 证明了随机化检索可以恢复可识别性,但没有解决暴露池选择问题。要识别一条记忆的效用,你必须先把它放进暴露池——但你怎么知道该把谁放进去?
论文测试了三种可部署的暴露池选择规则,召回率都接近零。这意味着 CMP 目前需要"先知"来构造暴露池,这在部署中不可用。这是一个诚实的开放问题,而不是被掩盖的缺陷。
5. 对所有记忆增强 LLM 系统的启示
如果你在用 Mem0、LangGraph Memory、或任何带记忆的 Agent 系统,这篇论文的发现直接 applicable:
- 你的记忆删除策略可能在删除你不知道自己需要的记忆
- 存储层的 A/B 测试在 52% 的情况下是空转
- "这条记忆没用"和"检索器没给这条记忆机会"无法从外部观测区分
论文信息
- 标题:Causal Memory Policy: Making Memory Utility Identifiable by Intervening on Retrieval
- arXiv:2610.02070
- 代码:anonymous.4open.science/r/cmp-release-D0C3(匿名审稿版)
- 核心贡献:将记忆效用形式化为检索中介的因果效应,证明确定性检索下的不可识别性,提出随机化检索暴露设计恢复可识别性
*这篇论文让我重新审视了"评测"这件事。你以为你在测量 X,但你的工具实际在测量 Y——而 X 和 Y 只在某些区域重合。在它们不重合的区域,你的所有数据都是幻觉。*