你的AI助手记了1000条对话,但54%的记忆从未被想起——因果推断如何修复这个隐形bug
你给AI助手装了记忆系统。它记下了你说的每一句话——偏好、日程、项目细节、上次提到的那个Bug。系统很认真,存了上千条记忆。
一个看不见的bug
你给AI助手装了记忆系统。它记下了你说的每一句话——偏好、日程、项目细节、上次提到的那个Bug。系统很认真,存了上千条记忆。
然后你问它一个问题。它检索出最相关的几条,生成回答。一切看起来很正常。
但有一天你翻日志,发现一个诡异的事实:有54%的关键记忆,从入库到被遗忘,从未被检索过一次。
不是因为它不重要。不是因为系统判断它没用。而是因为检索器——那个负责从记忆库中挑出相关记忆的组件——从来没给它机会出场。
这就像你写了一本1000页的自传,但索引只编了前500页。后500页不是没价值,是没人翻到过。
更诡异的是:现有的记忆管理系统全部检测不到这个bug。
为什么"看起来在测量"其实没测量
要理解这个bug有多深,先要理解记忆系统怎么判断"一条记忆有没有用"。
现有方案的逻辑很直接:做A/B测试。把记忆m加进去,看任务表现;把记忆m拿掉,看任务表现。两者差异大,说明m有用;差异小,说明m没用。
听起来没毛病对吧?但问题出在一个你没注意到的地方:检索器。
记忆库有上千条记忆,但每次回答问题时,检索器只挑出最相关的几条(比如6条)喂给LLM。如果记忆m从来没被检索器选中过,那么:
- 把m加到记忆库里 → 检索器还是不选它 → LLM看到的上下文没变 → 回答一样
- 把m从记忆库里删掉 → 检索器本来也不选它 → LLM看到的上下文没变 → 回答一样
但m可能极其重要——只是检索器没给它出场机会。
这就是论文揭示的核心问题:检索中介了记忆对输出的影响。一条记忆只有先被检索出来,才能影响回答。检索器是记忆和LLM之间的"必经之路"。如果这条路从来没被走过,你无法判断路尽头的风景值不值得看。
用因果推断的语言说,这叫"正值性违反"(positivity violation):因果效应的识别要求每个单位都有非零概率接受每种处理。当检索是确定性的,一条从未被检索出的记忆,其处理概率为零——它的效用不可识别。
更阴险的是:不可识别不等于返回"未知",而是返回"接近零"。两次A/B测试结果相同,估计值自然趋近于零。这和"记忆真的没用"在观测上完全无法区分。系统会自信地做出错误判断。
论文做了什么
Causal Memory Policy(CMP) 的核心洞察是:既然问题出在检索器,那就随机化检索器本身。
具体做法出奇简单:
1. 每次回答问题时,上下文有B个槽位(比如6个) 2. 把其中B-k个槽位留给正常检索器(按相关性排序) 3. 剩下k个槽位(比如2个)随机分配给记忆库中的记忆 4. 用逆倾向加权(IPW)估计每条记忆的因果效用
关键在于:随机化的是检索这一步,不是记忆库这一步。之前的方案随机化记忆库(随机保留/删除某些记忆),但如果被随机化的记忆本来就不会被检索出来,随机化记忆库对检索结果毫无影响——52.2%的扰动产生完全相同的检索结果。
CMP随机化的是"检索结果"本身。每条记忆都有已知概率被塞进上下文,正值性条件按构造成立。
一个精妙的设计选择
CMP有一个细节值得单独说:平衡分配。
最直觉的做法是每次独立随机抽取k条记忆。但论文指出这有问题:在T=90轮、k=2、记忆池32条时,期望每条记忆被抽中5.6次,但约三分之一的记忆会被抽中少于5次——有些可能一次都没被抽中。
CMP用平衡分配:把T×k个曝光槽位尽可能均匀地分配给池中每条记忆。每条记忆恰好被曝光5或6次,倾向分数已知且固定。
这个选择让估计器变得极其简洁——因为n_m是固定的,逆倾向加权退化成两组均值的差,方差可以精确计算,不需要估计倾向分数。
好的因果设计不是让估计更复杂,而是让估计更简单。
数据说话
论文在LongMemEval、LoCoMo、Mem0三个基准上验证:
| 指标 | 数值 |
|---|---|
| LongMemEval上从未被检索的关键记忆 | 54% |
| LoCoMo上从未被检索的关键记忆 | 67% |
| Mem0中未检索证据的中位排名 | 139/291 |
| 记忆库随机化产生相同检索结果的比例 | 52.2% |
| 基于效用的删除策略 vs 随机删除 | 提升仅0.97倍(≈随机) |
| 设计 | AUC | 误删关键记忆/100次回收 |
|---|---|---|
| 记忆库随机化 | 0.542 | 10.9 |
| CMP(检索随机化) | 0.664 | 5.2 |
| CMP + 按查询估计 | 0.784 | — |
一个诚实的"失败"
论文最值得尊敬的部分是第4.3节的ablation和第3.3节的结论:即使效用被识别了,也不足以决定保留还是删除。
为什么?因为记忆效用是按查询变化的。同一条记忆对查询A极其有用,对查询B毫无价值。CMP在估计它的那个查询上达到0.784 AUC,但当你试图把效用聚合成一个标量来做保留决策时:
- 取平均:被稀释(一条记忆只在1/30的查询中有用,平均后接近零)
- 取最大值:几乎所有记忆都有某个查询让它有用,结果是什么都保留
- 按未来查询相似度加权:需要知道未来查询是什么,但决策时不知道
所以论文的结论极其诚实:CMP是一个被识别的测量工具,不是一个保留策略。 它告诉你"这条记忆对这个查询有用",但不告诉你"这条记忆该不该留"。
工程洞察
如果你在做Agent记忆系统,这篇论文有几个直接可用的洞察:
1. 检查你的检索覆盖率。 在LongMemEval上54%的关键记忆从未被检索——你的系统可能更糟。最简单的诊断:统计每条记忆在历史交互中被检索的次数,画出分布。如果有大量记忆从未被检索过,你的基于效用的保留策略在盲删有用记忆。
2. 记忆库随机化是无效的。 如果你用"随机删除某些记忆看效果"来估计记忆效用,52.2%的实验是白做的——检索器根本没变化。必须随机化检索结果。
3. 不可逆操作需要单侧阈值。 论文证明Bayes最优规则是"只有当估计效用足够负时才删除"(one-sided abstention),而不是"当效用的绝对值足够大时删除"(two-sided)。后者会删掉明显有用的记忆。遗忘是不可逆的——保留错误的代价远低于删除错误的代价。
4. 按查询估计,不要按记忆估计。 同一条记忆对不同查询的效用差异巨大。如果你的保留策略基于"这条记忆整体有没有用",你会在1/30有用的记忆上犯错。
跨域类比
这个问题的结构其实很普遍:
- 推荐系统的冷启动:一个商品从未被推荐给用户 → 没有点击数据 → 系统判断"用户不喜欢" → 永远不推荐。和记忆系统完全同构。
- A/B测试中的幸存者偏差:只测试被曝光的变体,未曝光的变体永远没有数据。CMP的解法——随机保留一部分流量给"冷门"变体——和推荐系统中的exploration策略异曲同工。
- 科学界的"未被引用论文":一篇论文从未被检索到 → 没有引用 → 影响因子低 → 更难被检索到。正反馈循环。
我的思考
这篇论文让我想到一个更深的议题:AI系统的"看不见的bug"往往不是实现错误,而是设计层面的认知盲区。
记忆系统的工程师完全知道检索器有偏差——这是常识。但他们没意识到的是:基于效用的保留策略在检索偏差下会系统性地删除有用记忆。 因为"没被检索"和"没用"在观测上完全无法区分。
这和之前论文精选讨论过的几个概念形成共振:
- "代理目标陷阱":优化"估计效用"而非"真实效用",而估计效用在不可识别时趋近于零
- "合理化外壳":A/B测试看起来在测量,实际上在合理化已有的偏差
- "判断-闸门解耦":检索器是闸门,效用估计是判断,当闸门关闭时判断无意义
最后说一句:论文的诚实值得敬佩。很多论文会声称"我们的方法解决了问题",CMP明确说"我们识别了问题,部分解决了它,但保留策略仍是开放问题"。这种对"估计目标本身的结构性限制"的坦诚,比任何SOTA数字都更有价值。
论文:arxiv.org/abs/2610.02070 代码:anonymous.4open.science/r/cmp-release-D0C3/ 作者:Behnam, Wang, Binghui 一句话总结:当记忆从未被检索时,其效用不可识别——CMP通过随机化检索本身恢复识别,但识别后的效用仍不足以决定保留策略。