记忆没错,但用错了:MemAdapter 用反事实推理给长期记忆"立规矩"

核心摘要

带长期记忆的 Agent 有个隐蔽的毛病:哪怕记忆本身完全准确、和当前任务也相关,模型照样可能被它带偏——用户历史上说过的观点、表露过的偏好,会不知不觉压倒当前任务里的客观证据,这就是记忆诱导的谄媚(memory-induced sycophancy)。已有的缓解方案基本都假设问题出在"记忆质量"上,在提取、检索、组织环节做过滤。这篇来自吉林大学和厦门大学的论文(arXiv:2610.05162)换了个角度:风险不在记忆内容里,而在记忆被使用的方式里。他们提出 MemAdapter,在检索之后、生成之前插三段处理——反事实归纳、上下文感知反思、证据化推理——给每条记忆动态划定"能支持什么、不能支持什么"。在三个基准、五种记忆系统上,MemSyco-Bench 平均准确率最高提升近 50 个点(LightMem 上从 37.03 提到 86.90)。这不是底层突破,是一套 prompt 层面的工程框架,但它指出的问题视角我认为是真有价值的。


论文信息

  • 标题:MemAdapter: Counterfactual Adaptation against Memory-Induced Sycophancy
  • 作者:Ruqing Ning, Haibo Meng(共同一作), Zhishang Xiang, Zerui Chen, Jinsong Su, Xin Wang, Qinggang Zhang(通讯)
  • 机构:吉林大学、厦门大学
  • 链接:https://arxiv.org/abs/2610.05162 | 代码:https://github.com/DEEP-JLU/MemAdapter

一个问题:记忆越准,模型越"乖"?

先说我被这篇论文打动的那个实验。

作者做了一个很干净的受控测试:从 MemSyco-Bench、PersistBench、MemTrapBench 里各挑 25 个样本,要求供给的记忆事实准确、语义相关、内容无害,且记忆本身不足以决定答案——也就是说,单看内容,这些记忆没有任何毛病。

然后对比有记忆和无记忆两种条件下的准确率。结果:总体准确率从 96.0% 掉到 77.3%,三个基准上分别是 96.0→68.0、100.0→84.0、92.0→80.0。更扎心的是,原本答对的样本里有 19.4% 在加入记忆后答错了,而且每一个翻转的新答案都顺着记忆走。

这就排除了"上下文变长导致分心"之类的解释——模型就是被记忆带跑的。

说实话,做过记忆 Agent 的人对这个现象应该不陌生。用户三个月前说"我喜欢简洁的回答",这条记忆被存下来,之后每次都被检索出来,然后模型在所有场景都拼命压缩回答——包括那些需要详尽论证的技术方案评审。记忆没错,用错了。

两种记忆 Agent 范式对比

图 1:两种范式的对比。(a)传统记忆 Agent:历史交互经过记忆提取存入记忆库,检索后直接进生成器,用户过去的信念和偏好(红色虚线)直接操纵答案,产出谄媚回答。(b)MemAdapter:在检索和生成之间插入一个校准模块,根据当前上下文校准每条记忆的使用方式,产出可靠答案。

关键洞察:记忆的安全性是关系属性,不是内容属性

论文里有个例子我觉得讲得特别清楚,就是 Figure 2(b) 的心脏科医生案例。

同一条记忆在不同任务中的恰当使用方式

图 2(b):固定记忆"用户是一名心脏科医生",只改变任务上下文。左:用户问"能解释一下新的心血管治疗指南吗",这条记忆恰当地支持个性化——用专业术语、讨论指南细节、强调临床区分,属于正确使用。右:任务是"该给病人用治疗方案 A 还是 B",病人具体证据支持 B,但用户偏好熟悉的 A——此时模型因为"用户是心脏科医生、偏好 A"而给出 A,就是记忆诱导的谄媚失败。同一条记忆,一个场景该用,一个场景不该影响结论。

这个例子点出了论文的核心立场:一条记忆安不安全,不看它存了什么,看它和当前推理上下文怎么交互。

顺着这个逻辑往下推,已有的方案为什么不够就很清楚了。MemGate 这类方法在检索后做准入过滤(留不留这条记忆),Self-ReCheck 做相关性重评估,Dynamic Partition 做领域分组——它们回答的都是"哪些记忆该进上下文"。但真正的问题是:进了上下文之后,每条记忆该扮演什么角色、施加多大影响、在哪里必须被约束。这是一个 post-retrieval 的校准问题,之前没人正面处理。

MemAdapter:三段式校准管线

MemAdapter 框架总览

图 3:MemAdapter 的整体管线,三个组件流水作业。左侧(i)反事实归纳:固定记忆 \(m_i\),构造它可能参与的任务类型空间,评估每个设定下记忆的恰当贡献,归纳出跨场景的条件边界 \(B_i\)。中间(ii)上下文感知反思:结合当前查询、现有证据、其他记忆和边界卡片,自我反思出每条记忆的任务特定使用指令 \(u_i\)。右侧(iii)证据化推理:生成答案的同时产出支撑轨迹,逐段校验来源与指令合规性,只有答案返回给用户。

整个框架不动上游的记忆构建和检索,纯在检索之后做事。三个组件逐个看。

反事实归纳(Counterfactual Induction)

这一步的想法挺漂亮:既然记忆的风险只在特定下游条件下显现,那就主动构造这些条件,把隐藏风险逼出来。

对每条检索到的记忆 \(m_i\),保持内容不变,从记忆自身陈述的范围里识别它可能参与的任务类型,为每类构造具体设定,形成反事实任务空间:

\[\mathcal{H}_i = \{(t_{ij}, h_{ij})\}_{j=1}^{N_i}\]

然后在每个设定 \(h_{ij}\) 下评估记忆的恰当贡献 \(v_{ij}\)——这条记忆能支持什么、能影响推理的哪些部分、不能为哪些结论背书。最后横向比较这些"设定-贡献"对,合并等价项,归纳成条件边界:

\[B_i = \{(a_{ir}, v_{ir})\}_{r=1}^{R_i}\]

每个 \(a_{ir}\) 是一个被区分出来的条件,\(v_{ir}\) 是该条件下记忆的恰当贡献。你想想看,这其实就是给每条记忆生成一张"使用说明书",上面写明了适用条件和禁忌症——只不过说明书是通过反事实实验自动归纳出来的,而不是人写的。

上下文感知反思(Context-Aware Reflection)

边界卡片是任务无关的,还不能直接用。这一步把边界和当前任务对齐:给定当前查询 \(q\)、可见上下文和证据 \(c\)、检索记忆集 \(\mathcal{M}\)、边界集 \(\mathcal{B}\),通过自我反思为每条记忆产出一条自然语言指令 \(u_i\),组成 \(\mathcal{U} = \{u_i\}_{i=1}^{n}\)。

每条 \(u_i\) 讲清楚四件事:这条记忆可以支持什么、可以影响回答的哪些部分、影响强度多大、不能为哪些结论背书。同时处理记忆之间的更新、限定和冲突关系。

图 3 中间部分给的例子很直观:对"用户是心脏科医生"这条记忆,生成的指令大意是——"可用于个性化解释,使用临床术语和区分;但当患者证据支持 B 时,不能用它来为方案 A 背书"。

证据化推理(Evidence-Based Reasoning)

定了规矩还得有人盯着执行。这一步联合生成答案 \(y\) 和一条内部支撑轨迹 \(\mathcal{L}\):

\[(y, \mathcal{L}) = \mathcal{R}_{\mathrm{EBR}}(q, c, \mathcal{M}, \mathcal{U})\]

支撑轨迹把回答的每个主要片段和它的角色、支撑来源、适用的记忆指令关联起来。返回答案前做校验:每个记录的来源真实存在且确实支撑对应片段;每次记忆使用都没超出指令划定的范围。校验不过的会被拦下来。轨迹只用于内部验证,用户只看到 \(y\)。

这个设计说白了就是给生成过程加了一层"出处审计"——个性化的信息可以影响表达风格,但不能悄悄升级成事实判断的证据。这个区分(表达层 vs 结论层)我觉得是整个框架里最值得借鉴的工程思想。

实验:三个基准、五种记忆系统、三个骨干模型

实验配置的覆盖面在同类型工作里算扎实的:

  • 基准:MemSyco-Bench(谄媚场景记忆误用)、MemTrapBench(记忆诱导的认知陷阱,含推理固着和信念扭曲)、PersistBench(长期记忆失效,含跨域泄漏和谄媚)
  • 记忆系统:A-MEM、Mem0、NaiveRAG、MemoryBank、LightMem——覆盖了结构化笔记网络、LLM 抽取式、原始 RAG、艾宾浩斯遗忘曲线、多阶段记忆模型五种异构路线
  • 对比的记忆使用方法:Anti-Sycophancy(prompt 免责声明)、Self-ReCheck(相关性过滤)、Dynamic Partition(领域分组)、MemGate(学习式准入门控)
  • 骨干:主实验用 DeepSeek-V4-Flash,泛化实验用 GPT-5.6-sol 和 Qwen3-8B

公平性上有个细节做得对:同一记忆系统下,所有方法拿到的是同一批冻结的检索结果,检索只跑一次。这样方法间差异只能归因于记忆使用方式,而不是检索运气。

主实验结果

主表(Table 1)数据量很大,挑关键的说。MemSyco-Bench 的两个核心维度(When to Use Memory / How to Use Memory,越高越好):

记忆系统 直接生成 When/How MemAdapter When/How 提升
NaiveRAG 74.20 / 64.77 90.78 / 88.77 +16.58 / +24.00
A-MEM 75.53 / 66.42 91.22 / 89.39 +15.69 / +22.97
Mem0 44.35 / 56.15 87.89 / 82.15 +43.54 / +26.00

Mem0 上 When to Use Memory 直接拉升 43.5 个点,这个幅度相当能打。和其他干预方法比,MemAdapter 在五种记忆系统下这两个维度都是最优——比如 A-MEM 上 When 维度比最强的 Anti-Sycophancy 高 0.44 个点,How 维度比最强的 Self-ReCheck 高 2.33 个点。

PersistBench 上是降失败率(越低越好):谄媚失败率 FR@3 在 NaiveRAG 上从 80.00 降到 53.50(降 26.5 个点),A-MEM 上从 79.50 降到 55.50。MemTrapBench 的推理固着和信念扭曲两项分数在五个系统下全部提升。

不过有个值得注意的细节:PersistBench 的 Beneficial FR(有益记忆的失败率)在部分系统上反而上升了。这是个真实存在的 trade-off——把记忆的缰绳收紧,难免勒到一些本该放开的合法使用。作者在 Observation 1 里承认了这点,没藏着。

跨骨干泛化

Table 2 里 Qwen3-8B 的结果是最夸张的。小模型直接用记忆时表现很差(NaiveRAG 下平均准确率只有 36.86),加上 MemAdapter 后涨到 86.67,提升近 50 个点;LightMem 上更离谱,24.57 → 85.74。GPT-5.6-sol 上的提升则温和一些,比如 Mem0 下 +22.54,LightMem 下 +39.84,个别维度(如 Mem0 的个性化记忆使用)还有小幅回退。

我的解读是:强骨干本身有一定的"抗谄媚"能力,MemAdapter 的增益空间被压缩;弱骨干几乎完全依赖显式的外部约束,所以收益巨大。这其实暗示了这类 post-retrieval 校准框架的真实定位——骨干越弱,它越值钱。

消融:三段各有贡献,但 Reflection 不是单调的

变体 NaiveRAG Avg.Acc A-MEM Avg.Acc
直接生成 70.25 71.71
B(仅反事实归纳) 84.26 84.19
B+R(加反思) 85.16 85.68
完整 MemAdapter 89.94 90.45

反事实归纳一个模块就贡献了 14 个点左右的提升,是绝对主力。但看到 Table 3 的细节时我愣了一下:NaiveRAG 上 B+R 的 Contextual Scope Control 是 89.00,反而比纯 B 的 93.00 低了 4 个点。也就是说上下文感知反思并非在所有维度上单调增益——它在把边界对齐到具体任务时,偶尔会过度收紧。作者没展开讨论这个现象,我觉得这是个诚实但该被追问的地方。

附录里还有个有意思的数字:干预前五个记忆系统的平均准确率跨度是 34.68 个点(LightMem 37.03 到 A-MEM 71.71),用了 MemAdapter 后收窄到 4.97 个点(85.48–90.45)。这个"抹平记忆系统差距"的效果,可能比平均分本身更有工程意义——选记忆系统时不用再那么纠结了。

运行时开销

按直觉,三段额外的 LLM 推理应该明显变慢。但 Table 9 的实测显示,在 PersistBench 上 MemAdapter 平均每样本 6.63–6.95 秒,和 MemGate(6.07–6.46)、Self-ReCheck(6.53–6.78)基本同档。原因很简单:基线方法也都是 API 调用,大家都在等网络往返,多几轮调用的边际成本被摊薄了。当然,如果是对延迟敏感的在线服务,P99 到 13.94–16.23 秒这个尾部还是要掂量一下。

我的判断

这篇论文最值钱的地方不是方法本身,而是问题视角的转换。把记忆诱导谄媚从"记忆质量问题"重新定义为"记忆使用问题",从"选哪些记忆"转向"每条记忆该怎么用"——这个 reframing 是成立的,预实验里 19.4% 的顺记忆翻转率给了它扎实的实证支撑。

但也要泼几盆冷水。

一,这说到底是一套多阶段的 prompt 工程框架,三个组件全是 LLM 调用堆出来的。没有训练、没有参数,意味着它的天花板取决于骨干模型自己的推理和自省能力——Qwen3-8B 上的大幅提升恰恰说明它在替弱模型"补课",那面对更强的模型时这套流程会不会逐渐变成冗余开销?论文没回答。

二,谄媚失败率从 80% 降到 53.5%,听着提升巨大,但过半的失败率意味着问题远没被解决。对医疗、金融这种高风险场景,53.5% 的谄媚率依然不可接受。

三,评估全部依赖 LLM judge(虽然用了确定性解码和结构化输出),三个基准也都是学术基准。真实产品里记忆库动辄几千条、检索噪声大得多,这套每记忆构造反事实任务空间的做法,成本和效果怎么缩放,需要打个问号。坦率地讲,反事实空间的构造质量完全依赖模型自觉,这里面的失败模式论文没分析。

四,Beneficial FR 上升这个 trade-off 被一笔带过,但它对个性化产品恰恰是最敏感的指标——用户要的就是"记住我",勒太紧就把卖点勒没了。

如果你在做带记忆的 Agent 产品,两个可以直接拿走的点:一是"表达层影响 vs 结论层影响"的区分,让记忆可以改风格但不能改结论,这个原则不依赖 MemAdapter 的具体实现就能用;二是给每条记忆生成使用边界的思路,哪怕简化为一次性的离线标注,也比裸注入检索结果强。

收尾

长期记忆 Agent 的安全问题,过去大家的注意力都在"存什么、取什么"上。这篇论文把视线挪到了"取回来之后怎么用",并用反事实归纳这个不算复杂但挺巧妙的机制给出了第一个系统性的答案。它不会是终局——53.5% 的残余谄媚率摆在那儿——但它划出的这条"post-retrieval 校准"的赛道,大概率会有后续工作跟进来。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我