【论文阅读】Agent记忆机制(106):COUNTERMEM——用可执行世界模型验证“如果当时换个动作”的反事实记忆

文章目录

  • 前言
  • 零、论文基本信息
  • 一、背景:事实记忆为什么不够
    • [1. 轨迹只能说明"做了什么",不能说明"本可怎样做"](#1. 轨迹只能说明“做了什么”,不能说明“本可怎样做”)
    • [2. 为什么必须从同一状态比较](#2. 为什么必须从同一状态比较)
    • [3. 验证正确仍然不代表可以跨任务复用](#3. 验证正确仍然不代表可以跨任务复用)
  • [二、相关工作:COUNTERMEM 改变了记忆的哪一部分](#二、相关工作:COUNTERMEM 改变了记忆的哪一部分)
    • [1. Reflection 与经验记忆](#1. Reflection 与经验记忆)
    • [2. Counterfactual Reasoning 与搜索](#2. Counterfactual Reasoning 与搜索)
    • [3. World Model](#3. World Model)
  • 三、方法总览:从失败动作到可复用修正
  • 四、模块一:为失败动作生成局部反事实
    • [1. 状态、动作与可执行结果](#1. 状态、动作与可执行结果)
    • [2. 为什么只做 Local Edit](#2. 为什么只做 Local Edit)
    • [3. SQL 例子](#3. SQL 例子)
  • 五、模块二:验证、准入与反事实记忆结构
    • [1. 同状态下计算局部增益](#1. 同状态下计算局部增益)
    • [2. 一条反事实记忆包含什么](#2. 一条反事实记忆包含什么)
    • [3. 通过验证不等于自动保存](#3. 通过验证不等于自动保存)
  • 六、容量管理:记忆变多时应该保留什么
    • [1. Utility-aware Retention](#1. Utility-aware Retention)
    • [2. 更新复用效用](#2. 更新复用效用)
  • 七、模块三:检索后,学习使用还是跳过
    • [1. 先做条件过滤,再做相似度排名](#1. 先做条件过滤,再做相似度排名)
    • [2. 为什么 Retriever 之后还需要 Selector](#2. 为什么 Retriever 之后还需要 Selector)
    • [3. DQN 看到什么](#3. DQN 看到什么)
    • [4. Reward:成功与交互成本一起算](#4. Reward:成功与交互成本一起算)
    • [5. Q-learning](#5. Q-learning)
  • 八、严格的构建、训练与评测隔离
  • 九、实验设置
    • [1. 六个领域、十二个 Benchmark](#1. 六个领域、十二个 Benchmark)
    • [2. Base Agent、Backbone 与 Baseline](#2. Base Agent、Backbone 与 Baseline)
    • [3. 评价指标](#3. 评价指标)
  • 十、主实验:反事实记忆是否优于事实经验
    • [1. gpt-oss-120b](#1. gpt-oss-120b)
    • [2. Gemini 3.1 Flash-Lite](#2. Gemini 3.1 Flash-Lite)
  • 十一、记忆积累与淘汰:更多经验不总是更好
  • 十二、迁移实验:相似并不等于适用
  • 十三、消融实验:验证、持久化与匹配缺一不可
    • [1. Verification 和 Persistent Storage 的作用](#1. Verification 和 Persistent Storage 的作用)
    • [2. 正确记忆放错位置会怎样](#2. 正确记忆放错位置会怎样)
  • 十四、失败案例与反例:记忆确实会破坏任务
    • [删除适用条件 c c c 会怎样](#删除适用条件 c c c 会怎样)
  • 十五、效率与公平比较
    • [1. 十二个 Benchmark 的一致性](#1. 十二个 Benchmark 的一致性)
    • [2. 共同 6M Token Budget](#2. 共同 6M Token Budget)
  • [十六、与 Agent Memory 系列方法的横向比较](#十六、与 Agent Memory 系列方法的横向比较)
  • [十七、对 Coding Agent、Tool Agent 与 Multi-Agent 的启发](#十七、对 Coding Agent、Tool Agent 与 Multi-Agent 的启发)
    • [1. Coding Agent:把失败 Patch 变成最小对照实验](#1. Coding Agent:把失败 Patch 变成最小对照实验)
    • [2. Tool Agent:为工具调用构造 Counterfactual Call](#2. Tool Agent:为工具调用构造 Counterfactual Call)
    • [3. Multi-Agent:验证协作协议的局部替代](#3. Multi-Agent:验证协作协议的局部替代)
  • 十八、局限性
    • [1. 强依赖可执行检查器和状态重置](#1. 强依赖可执行检查器和状态重置)
    • [2. Verification 只在测试覆盖范围内成立](#2. Verification 只在测试覆盖范围内成立)
    • [3. 只能一次使用一条记录](#3. 只能一次使用一条记录)
    • [4. Memory 会过时](#4. Memory 会过时)
    • [5. 没有隔离 DQN 的独立收益](#5. 没有隔离 DQN 的独立收益)
    • [6. 成本口径不完整](#6. 成本口径不完整)
    • [7. 复现材料尚不完整](#7. 复现材料尚不完整)
    • [8. 安全与隐私](#8. 安全与隐私)
  • 十九、我的理解与启发
    • [1. COUNTERMEM 真正改变的是 Memory 的证据标准](#1. COUNTERMEM 真正改变的是 Memory 的证据标准)
    • [2. Verified 与 Applicable 必须同时成立](#2. Verified 与 Applicable 必须同时成立)
  • [ \\text{Useful Memory}](# \text{Useful Memory})
    • [3. Skip 应该成为所有 Memory Agent 的标准动作](#3. Skip 应该成为所有 Memory Agent 的标准动作)
    • [4. 反事实记忆是一种可迁移的测试资产](#4. 反事实记忆是一种可迁移的测试资产)
  • 二十、总结
  • 参考资料

前言

Agent Memory 通常从"已经发生的事实"中学习:Agent 做了什么、环境返回了什么、任务为什么成功或失败,然后把轨迹、反思或策略保存下来,供未来任务复用。

这种做法有一个容易被忽略的缺口。

假设 Coding Agent 提交了一个错误补丁,测试失败。传统记忆可以保存"这次补丁失败了"以及模型事后写出的反思,但它没有回答一个更有价值的问题:如果当时只把某个表达式换掉,测试结果是否真的会变好?

反思提出的替代动作只是一种猜测。未经执行验证的"应该这样做",可能成为下一次任务中的错误建议。另一方面,直接在真实环境里反复尝试替代动作,又可能消耗大量交互、改变环境状态,使两个动作失去公平比较的起点。

COUNTERMEM 把这件事变成了一个可验证的反事实实验:在失败决策出现后,从同一份可复制或可重置的状态出发,生成少量局部替代动作,并使用测试套件、证明检查器、SQL 结果检查器或 SAT/SMT Solver 检查这些动作。只有确实比原动作更好的替代方案,才会被存成一条带证据、适用条件和复用统计的 Counterfactual Memory。

但"曾经验证正确"不等于"以后都应该使用"。因此,论文又训练一个 DQN Selector,在新任务中从检索结果里选择一条记忆,或者直接跳过记忆。Base LLM 始终保持冻结。

本文的唯一核心增量可以概括为:

COUNTERMEM 将 Agent Memory 的来源从"真实轨迹及事后反思"扩展到"同一状态下经可执行世界模型验证的局部反事实动作对",并学习何时复用或跳过这些带适用条件的修正。

如果把前面的 Agent Memory 系列看作对"如何保存、组织和取回经历"的持续探索,那么 COUNTERMEM 推进的是更基础的一步:一条从未真正执行过的替代经验,怎样获得进入长期记忆的资格?

零、论文基本信息

  • 论文名称: COUNTERMEM: World-Model Verified Counter-Factual Memory for Language Agents
  • 发表平台: ICLR 2027
  • 代码仓库: 尚未发布,论文说明将在接收后公开
  • 作者: Hongji Pu、Ruixiang Tang、Yongfeng Zhang

一、背景:事实记忆为什么不够

1. 轨迹只能说明"做了什么",不能说明"本可怎样做"

传统经验记忆通常来自如下链条:

State → Action → Feedback → Reflection \text{State} \rightarrow \text{Action} \rightarrow \text{Feedback} \rightarrow \text{Reflection} State→Action→Feedback→Reflection

它能够保存已发生的路径,却无法直接观察未执行动作的结果。看到动作 A A A 失败,只能证明 A A A 在当时失败,不能证明替代动作 B B B 会成功。

LLM 可以在事后生成"应该使用 B B B"的反思,但这条建议若没有经过环境检查,本质上仍是模型的文本推测。把它长期保存,相当于把未经测试的补丁写进知识库。

2. 为什么必须从同一状态比较

反事实比较要求除了动作之外,其他条件尽量一致。

如果 Agent 先执行 A A A,环境已经改变,再执行 B B B,两次结果的差异未必由动作本身造成。COUNTERMEM 因此要求环境能够复制或重置到原决策状态 s t s_t st,让原动作和替代动作都从同一起点接受检查。

这也是论文使用"World Model"一词的含义:它并非一定是学习得到的神经网络模型,而是任何可以执行动作并返回可靠结果的可执行评估器,例如:

  • Coding 中的 Repository Tests;
  • Lean、Dafny、Verus 的 Proof / Program Verifier;
  • Text-to-SQL 中的数据库执行与参考结果比较;
  • SMT 与 SAT Solver。

3. 验证正确仍然不代表可以跨任务复用

一条修正在源任务上有效,可能在相似的新任务上有害。

例如,原问题要求"年龄至少为 18",把 age > 18 改成 age >= 18 是正确修复。但新问题如果要求"严格大于 18",同样的修复就会制造错误。

所以反事实记忆不能只保存"错误动作"和"正确动作",还必须保存:

  • 为什么原动作错;
  • 替代动作经过了什么检查;
  • 在什么条件下修正才适用;
  • 后续复用曾经带来帮助、无影响还是伤害。

二、相关工作:COUNTERMEM 改变了记忆的哪一部分

1. Reflection 与经验记忆

Reflexion 保存语言化反思,ExpeL 提取可迁移经验,Generative Agents 保存经历和反思,Voyager 保存可复用技能,MemGPT 管理上下文与外部记忆。这些方法主要从实际轨迹中压缩经验。

COUNTERMEM 的差异不是记忆格式更长,而是增加了一条新的经验生产路径:对失败动作做局部改写,并通过真实可执行检查产生"如果改成这样,结果确实更好"的证据。

2. Counterfactual Reasoning 与搜索

反事实推理、Tree Search、Best-of-N 也会探索替代方案,但通常服务于当前任务。COUNTERMEM 不仅在当前状态中验证替代动作,还将验证后的动作对连同适用条件持久化,使其能够跨任务复用。

因此,它不是单纯增加 Test-time Compute,而是把额外计算转化为长期资产。

3. World Model

传统 World Model 往往预测环境转移;本文使用的是 Executable World Model。它不需要生成整个世界,只需对候选动作给出可执行、可比较的结果。

这个定义很实用,但也限定了适用范围:环境必须允许重置或复制状态,并拥有足够可靠的检查器。

三、方法总览:从失败动作到可复用修正

理解全文最好的方式,是先看构建与使用的完整闭环。

Figure 1:反事实记忆的构建与使用。 系统在失败决策处生成局部替代动作,从同一状态验证并保存改进;新任务中先检索兼容记录,再由 DQN 选择一条或跳过,评测阶段冻结记忆与选择器。

整个流程分为三个阶段:

  1. Memory Construction: 在源任务中发现失败动作,生成至多 4 个局部替代动作,并用 World Model 验证;
  2. Selector Training: 冻结 Memory Store,用 2,000 个决策步训练 DQN,学习"选哪条或跳过";
  3. Held-out Evaluation: 同时冻结 Memory Store、Reuse Statistics 与 Selector,在未参加构建和训练的任务上评测。

这里有两个重要的隔离:Base LLM 全程不更新;评测任务既不能进入 Memory Construction,也不能进入 Selector Training。实验因此测量的是先前经验的复用,而不是边测边记。

四、模块一:为失败动作生成局部反事实

1. 状态、动作与可执行结果

在时间步 t t t,Agent 在状态 s t s_t st 采取动作 a t a_t at。状态包括当前任务、环境、部分解答和已有反馈。World Model / Evaluator H H H 返回结果:

o t = H ( s t , a t ) o_t = H(s_t,a_t) ot=H(st,at)

当动作失败且验证预算尚未耗尽时,Generator G G G 根据状态、失败动作和反馈生成候选集合:

A c f = G ( s t , a t , o t ; K ) \mathcal{A}^{\mathrm{cf}} = G(s_t,a_t,o_t;K) Acf=G(st,at,ot;K)

论文设置 K = 4 K=4 K=4,即一个失败动作最多提出 4 个候选。实现中,每个任务最多扩展 2 个失败决策。

2. 为什么只做 Local Edit

Generator 只能改变一个 Decision Unit,例如:

  • SQL 的一个 Predicate 或 Join;
  • Lean 的一个 Tactic / Proof Step;
  • Code 中一个局部表达式或 Patch;
  • SAT/SMT 的一个 Encoding / Solver Action。

如果直接生成一份完全不同的解答,即使它成功,也难以把差异归因于某个可复用修正。局部编辑让系统更接近受控实验:其他部分不变,只比较一个决策单元。

3. SQL 例子

Figure 1 中,Agent 错误地写出:

sql 复制代码
Make = 'volvo'

但 Make 字段并不直接保存标准厂商名,结果返回 0 行。局部替代动作改为沿 car_makers → model_list → car records 的 Schema Relation 过滤。新查询从同一数据库状态运行,返回期望的 1 行,于是效用从 0 提升到 1。

系统记住的不是整条 SQL,而是:遇到这类名称不匹配时,应避免直接按 Make 过滤,优先沿规范化关系寻找车型,并保留支持这一判断的执行证据。

五、模块二:验证、准入与反事实记忆结构

1. 同状态下计算局部增益

每个候选动作 a ′ a' a′ 都从 s t s_t st 的副本或重置状态执行。论文定义:

Δ ( a ′ ) = U ( H ( s t , a ′ ) ) − U ( o t ) \Delta(a') = U(H(s_t,a')) - U(o_t) Δ(a′)=U(H(st,a′))−U(ot)

U U U 把检查器反馈映射到 0 , 1 0,1 0,1,可以是二元正确性,也可以是通过测试的比例。 Δ ( a ′ ) \Delta(a') Δ(a′) 因此表示局部修改相对原动作带来的效用变化。

候选只有在检查完成且满足

Δ ( a ′ ) > ϵ a d m ≥ 0 \Delta(a') > \epsilon_{\mathrm{adm}} \ge 0 Δ(a′)>ϵadm≥0

时才有资格进入记忆。报告配置使用 ϵ a d m = 0.05 \epsilon_{\mathrm{adm}}=0.05 ϵadm=0.05。在二元任务中,这相当于从失败变为成功;在部分得分任务中,即使整题未解,只要局部得分确实提高,也可形成记录。

2. 一条反事实记忆包含什么

被接受的记录写成:

m i = ( q i , a i − , a i + , e i , c i , u i ) m_i=(q_i,a_i^{-},a_i^{+},e_i,c_i,u_i) mi=(qi,ai−,ai+,ei,ci,ui)

字段 含义 作用
q i q_i qi Situation 描述出现了什么问题
a i − a_i^{-} ai− Inferior Action 原本较差的动作
a i + a_i^{+} ai+ Improved Action 经验证更好的局部动作
e i e_i ei Evidence 原动作与修正动作的检查结果
c i c_i ci Applicability Conditions 未来任务必须满足的适用条件
u i u_i ui Reuse Statistic 构建阶段复用后的帮助/中性/伤害统计

Table 2:反事实记忆字段。 记录同时保存动作对、可执行证据、适用条件与复用统计,而不是只保存一段语言化建议。

此外,系统保留 Source Task ID,使检索能够排除当前任务自己产生的记录,避免数据泄漏式的自我复用。

3. 通过验证不等于自动保存

通过最低增益门槛后,还要计算 Admission Score:

S a d m ( m i ) = λ Δ Δ ~ i + λ u u ~ i − λ r R ( m i , M ) − λ I I ( m i , M ) S_{\mathrm{adm}}(m_i)= \lambda_{\Delta}\widetilde{\Delta}_i+ \lambda_u\widetilde{u}_i- \lambda_rR(m_i,M)- \lambda_I I(m_i,M) Sadm(mi)=λΔΔ i+λuu i−λrR(mi,M)−λII(mi,M)

其中:

  • Δ ~ i \widetilde{\Delta}_i Δ i:归一化后的源任务改进;
  • u ~ i \widetilde{u}_i u i:归一化后的复用效用;
  • R R R:与已有记录的重复程度;
  • I I I:与已有建议的冲突程度。

报告配置的四个权重为 ( 1.0 , 0.5 , 0.7 , 1.0 ) (1.0,0.5,0.7,1.0) (1.0,0.5,0.7,1.0),准入阈值 τ a d m = 0.1 \tau_{\mathrm{adm}}=0.1 τadm=0.1。这一步避免 Memory Store 被大量重复或冲突建议淹没。

六、容量管理:记忆变多时应该保留什么

1. Utility-aware Retention

Memory Store 最多保存 B = 200 B=200 B=200 条记录。容量不足时,系统用以下分数排序:

S k e e p ( m i ) = α Δ ~ i + β u ~ i + ω F i − η R ( m i , M ) S_{\mathrm{keep}}(m_i)= \alpha\widetilde{\Delta}_i+ \beta\widetilde{u}_i+ \omega F_i- \eta R(m_i,M) Skeep(mi)=αΔ i+βu i+ωFi−ηR(mi,M)

F i F_i Fi 是归一化复用频率;报告配置 ( α , β , ω , η ) = ( 1.0 , 1.0 , 0.5 , 0.7 ) (\alpha,\beta,\omega,\eta)=(1.0,1.0,0.5,0.7) (α,β,ω,η)=(1.0,1.0,0.5,0.7)。这个规则同时偏好:源任务上改进大、后续复用有帮助、经常被使用且不重复的记录。

2. 更新复用效用

构建阶段中,一条记录每次复用后更新:

u i ( j + 1 ) = ( 1 − ρ ) u i ( j ) + ρ y i , j u_i^{(j+1)}=(1-\rho)u_i^{(j)}+\rho y_{i,j} ui(j+1)=(1−ρ)ui(j)+ρyi,j

其中 y i , j ∈ { − 1 , 0 , + 1 } y_{i,j}\in\{-1,0,+1\} yi,j∈{−1,0,+1} 分别表示有害、中性和有益复用, ρ = 0.3 \rho=0.3 ρ=0.3。

这里的参照是同一决策的 Memory-free Draft:记忆未改变最终动作则记为中性;改变动作并解决任务则记为有益;如果有先前可比较的执行结果,则根据效用变化符号判断,否则仍记为中性。

这个定义避免把"检索到一条记忆,但 Agent 没采纳"误判为有害复用。

七、模块三:检索后,学习使用还是跳过

1. 先做条件过滤,再做相似度排名

当前任务 x x x、状态 s s s 的 Eligible Set 为:

C ( x , s ) = { m i ∈ M : x i s o u r c e ≠ x , c i 与 s 兼容 } \mathcal{C}(x,s)=\{m_i\in M:x_i^{\mathrm{source}}\ne x,\ c_i\text{ 与 }s\text{ 兼容}\} C(x,s)={mi∈M:xisource=x, ci 与 s 兼容}

系统排除当前任务自己的记录,并过滤不满足适用条件 c i c_i ci 的记录。剩余记录按下式排名:

r i ( s ) = sim ⁡ ( ϕ ( s ) , ϕ ( q i ) ) + λ r e u s e u i r_i(s)=\operatorname{sim}(\phi(s),\phi(q_i))+\lambda_{\mathrm{reuse}}u_i ri(s)=sim(ϕ(s),ϕ(qi))+λreuseui

R k = TopK ⁡ m i ∈ C ( x , s ) r i ( s ) R_k=\operatorname{TopK}_{m_i\in\mathcal{C}(x,s)}r_i(s) Rk=TopKmi∈C(x,s)ri(s)

报告配置 k = 3 k=3 k=3、 λ r e u s e = 0.2 \lambda_{\mathrm{reuse}}=0.2 λreuse=0.2。相似度项寻找相近 Situation,Reuse Term 则提升历史上真正有帮助的记录。

2. 为什么 Retriever 之后还需要 Selector

相似记录不一定有用。例如,新 Draft 已经正确使用 >=,此时再展示边界修正只会浪费 Token,甚至诱导不必要修改。

Selector 的动作空间为:

j t ∈ J t = { 0 , 1 , ... , ∣ R t ∣ } j_t\in\mathcal{J}_t=\{0,1,\dots,|R_t|\} jt∈Jt={0,1,...,∣Rt∣}

j t = 0 j_t=0 jt=0 表示跳过记忆, j t > 0 j_t>0 jt>0 表示只向 LLM 展示第 j t j_t jt 条记录,让 LLM 决定是否修改 Draft。Selector 不直接编写任务动作,也不能选择任意记录组合。

3. DQN 看到什么

Selector 的数值观察向量为:

z t = P E ( s t ) ∥ P E ( a \^ t ) ∥ f t , 1 ∥ ⋯ ∥ f t , L ∥ b t z_t=P E(s_t)\\Vert P E(\\hat a_t)\\Vert f_{t,1}\\Vert\\cdots\\Vert f_{t,L}\\Vert b_t zt=PE(st)∥PE(a\^t)∥ft,1∥⋯∥ft,L∥bt

其中:

  • E E E 把状态和 Draft 转成 512 维字符 n-gram Hashing Embedding;
  • 固定随机投影 P P P 将其压到 32 维;
  • 每条记录使用 7 维特征:相关性、Admission Score、估计改进、Reuse Utility、使用频率、有益比例与有效性;
  • b t b_t bt 是 6 维剩余预算;
  • 架构保留 L = 4 L=4 L=4 个 Candidate Slot,但实际最多检索 k = 3 k=3 k=3 条,其余位置 Mask。

最终输入维度为:

32 + 32 + 4 × 7 + 6 = 98 32+32+4\times 7+6=98 32+32+4×7+6=98

DQN 是两层隐藏宽度为 ( 64 , 64 ) (64,64) (64,64) 的 MLP,输出 Skip 与各 Candidate Slot 的 Q Value。

4. Reward:成功与交互成本一起算

每个决策的 Reward 为:

r t = 1 t = T 1 s o l v e d − λ w δ w t − λ f δ f t − λ τ δ τ t τ 0 r_t= \mathbb{1}t=T\mathbb{1}\\mathrm{solved} -\lambda_w\delta w_t -\lambda_f\delta f_t -\lambda_\tau\frac{\delta\tau_t}{\tau_0} rt=1t=T1solved−λwδwt−λfδft−λττ0δτt

第一项只在任务结束且成功时给 1;后三项分别惩罚 World-model Calls、失败动作与 Token。论文设置:

λ w = 0.15 , λ f = 0.25 , λ τ = 0.02 , τ 0 = 10 4 \lambda_w=0.15,\quad \lambda_f=0.25,\quad \lambda_\tau=0.02,\quad \tau_0=10^4 λw=0.15,λf=0.25,λτ=0.02,τ0=104

这里没有再次奖励源任务上的 Δ \Delta Δ。原因是 Δ \Delta Δ 只能证明修正在源状态有用,不能证明它在当前任务中值得复用。

5. Q-learning

Selector 学习折扣累计回报:

Q θ ( z , j ) ≈ E ∑ ℓ = 0 T − t γ ℓ r t + ℓ ∣ z t = z , j t = j Q_\theta(z,j)\approx \mathbb{E}\left \\sum_{\\ell=0}\^{T-t}\\gamma\^\\ell r_{t+\\ell} \\mid z_t=z,j_t=j \\right Qθ(z,j)≈Eℓ=0∑T−tγℓrt+ℓ∣zt=z,jt=j

Target 与 Loss 为:

y t = r t + γ ( 1 − d t ) max ⁡ j ∈ J t + 1 Q θ − ( z t + 1 , j ) y_t=r_t+\gamma(1-d_t)\max_{j\in\mathcal{J}{t+1}}Q{\theta^-}(z_{t+1},j) yt=rt+γ(1−dt)j∈Jt+1maxQθ−(zt+1,j)

L ( θ ) = E D ( y t − Q θ ( z t , j t ) ) 2 \mathcal{L}(\theta)= \mathbb{E}_{\mathcal D}\left(y_t-Q_\\theta(z_t,j_t))\^2\\right L(θ)=ED(yt−Qθ(zt,jt))2

训练使用 2,000 个决策步、Discount γ = 0.95 \gamma=0.95 γ=0.95、Replay Capacity 10 4 10^4 104、Batch Size 32,探索率从 0.30 衰减到 0.05。5 个 Selector Seeds 分别训练,并通过与最终测试集分离的验证子集选择 Checkpoint。

八、严格的构建、训练与评测隔离

设 T b u i l d T_{\mathrm{build}} Tbuild、 T t r a i n T_{\mathrm{train}} Ttrain 和 T e v a l T_{\mathrm{eval}} Teval 分别是记忆构建、Selector 训练与最终评测任务,论文要求:

( T b u i l d ∪ T t r a i n ) ∩ T e v a l = ∅ (T_{\mathrm{build}}\cup T_{\mathrm{train}})\cap T_{\mathrm{eval}}=\varnothing (Tbuild∪Ttrain)∩Teval=∅

构建与 Selector Training 可以共享任务标识,但二者都不能包含 Evaluation Task。评测时:

  • 不增加新记录;
  • 不更新 Reuse Statistics;
  • 不做 Admission / Eviction;
  • 不更新 DQN;
  • 只使用 Greedy Selection。

这个协议避免把 Test-time Learning 混入跨任务记忆效果。

九、实验设置

1. 六个领域、十二个 Benchmark

领域 Benchmark World Model / Evaluator 决策单元
Math miniF2F Lean Kernel Tactic / Proof Step
Math ProofNet Lean Kernel Proof Continuation
Math AMBER Lean-based Checker Tactic / Lemma Choice
Coding SWE-bench Verified Repository Tests Edit / Patch
Coding BugsInPy Regression Tests Localized Edit
Formal Verification DafnyBench Dafny Verifier Invariant / Annotation
Formal Verification Vericoding-Dafny Dafny Verifier Code Step
Formal Verification Vericoding-Verus Verus Verifier Proof / Code Step
Text-to-SQL Spider SQL Engine + Result Check Join / Predicate
Text-to-SQL BIRD SQL Engine + Result Check Schema / Join
SMT SMT-LIB / SMT-COMP SMT Solver Encoding / Solver Action
SAT SAT Competition / SATLIB SAT Solver Branching / Encoding

Table 4:评测套件与可执行 World Model。 十二个设置覆盖数学、编程、形式化验证、Text-to-SQL、SMT 与 SAT,均能对局部动作给出可执行检查。

2. Base Agent、Backbone 与 Baseline

Base Agent 使用 ReAct 与 Reflexion;Backbone 使用 gpt-oss-120b 与 Gemini 3.1 Flash-Lite。

Memory Baseline 包括 ExpeL、Generative Agents、Voyager、MemGPT 与 ReasoningBank。Best-of-N 作为额外计算控制:生成 N = 1 + K = 5 N=1+K=5 N=1+K=5 个当前任务候选,由 LLM Judge 选择一个执行,但不形成持久记忆,也不用 Verifier 选候选。

3. 评价指标

  • Task Score:0--100,按 Benchmark Success Metric;
  • Task-run Tokens:包含推理、检索与 Augmentation,但不包含离线 Selector Training;
  • World-model Calls / Solved Task;
  • Failed Attempts / Solved Task;
  • Retrieval Coverage;
  • Harmful Use Rate;
  • Rescued / Broken Tasks。

需要注意,Calls per Solved 是比值,下降可能来自分母"成功任务数"增加,不一定意味着总调用次数下降。

十、主实验:反事实记忆是否优于事实经验

1. gpt-oss-120b

Base Agent Augmentation Math Coding Text-to-SQL SAT Tokens(M)
ReAct None 29.8 48.7 26.8 50.7 6.0
ReAct Best-of-N 34.5 38.1 36.2 41.1 9.4
ReAct ExpeL 27.4 56.5 17.2 49.0 5.4
ReAct Generative Agents 22.6 37.1 17.6 41.6 6.2
ReAct Voyager 21.9 60.6 26.3 51.4 5.2
ReAct MemGPT 27.3 39.5 48.9 47.0 5.8
ReAct CF Memory 57.5 66.6 47.0 58.9 4.4
Reflexion None 40.8 34.6 54.6 61.2 5.2
Reflexion Best-of-N 31.8 21.7 62.5 53.6 10.0
Reflexion ExpeL 38.0 32.8 68.1 60.0 5.0
Reflexion Generative Agents 36.7 38.8 60.4 48.3 5.6
Reflexion Voyager 37.7 42.6 55.4 58.3 4.5
Reflexion MemGPT 48.0 39.1 47.5 58.0 5.7
Reflexion CF Memory 53.4 40.7 66.1 63.7 4.8

Table 1:四领域主实验(gpt-oss-120b)。 CF Memory 在 ReAct 与 Reflexion 下都取得最高四领域平均分,并显著减少 ReAct 的任务运行 Token。

ReAct 的四领域平均分从 39.0 提升到 57.5,增加 18.5 个百分点;Reflexion 从约 47.8 提升到约 56.0,增加 8.2 个百分点。Reflexion 本身已经保存反思,CF Memory 仍有额外收益,说明"经验证的动作对"提供了不同于语言化反思的信息。

但 CF Memory 并非每一列都第一:gpt-oss-120b + ReAct 的 Text-to-SQL 上,MemGPT 48.9 高于 CF Memory 47.0;Reflexion 的 Text-to-SQL 上,ExpeL 68.1 高于 66.1;Coding 上 Voyager 42.6 高于 40.7。论文更强的结论是平均表现稳定,而不是垄断所有单领域最优。

2. Gemini 3.1 Flash-Lite

Base Agent Augmentation Math Coding Text-to-SQL SAT Tokens(M)
ReAct None 38.5 30.9 57.6 45.0 5.0
ReAct Best-of-N 30.7 29.0 67.3 34.9 9.6
ReAct ExpeL 57.4 37.3 68.6 37.2 4.8
ReAct Generative Agents 42.4 31.3 57.2 43.9 5.7
ReAct Voyager 39.9 34.4 48.2 55.1 4.3
ReAct MemGPT 31.4 38.2 68.5 45.2 5.5
ReAct CF Memory 54.5 40.0 71.7 57.9 2.9
Reflexion None 55.5 47.7 59.1 43.7 4.3
Reflexion Best-of-N 58.7 43.9 65.6 54.7 8.2
Reflexion ExpeL 50.3 43.2 70.2 36.8 4.0
Reflexion Generative Agents 44.6 36.6 66.6 66.1 4.9
Reflexion Voyager 54.9 37.1 49.0 32.1 3.9
Reflexion MemGPT 43.8 38.2 52.0 49.5 4.8
Reflexion CF Memory 74.0 73.5 77.8 62.3 3.4

Table 1(续):四领域主实验(Gemini 3.1 Flash-Lite)。 CF Memory 在两个 Agent 设置中继续取得最高宏平均分,Gemini + Reflexion 的增益达到 20.4 个百分点。

四组 Agent--Backbone 组合中,CF Memory 的平均增益范围为 8.2--20.4 个百分点,并在 16 个领域比较中的 11 个领先。

与 None 相比,Task-run Tokens 下降 7.7%--42.0%。Best-of-N 消耗 8.2M--10.0M Token,而 CF Memory 仅为 2.9M--4.8M,平均分仍更高。这支持"持久复用已验证修正"比每个任务重新采样多个候选更有效。

不过,离线 DQN Training Cost 没有计入 Token 表,不能把这些数字解释为完整生命周期成本。

十一、记忆积累与淘汰:更多经验不总是更好

Figure 2:从更多源任务学习并选择保留内容。 随构建任务增加,CF Memory 的 Held-out Score 持续上升;ReasoningBank 先升后降。固定容量下,Utility-based Retention 优于 Recency、Random 与 Similarity。

Checkpoint 位于 0、25、50、100、200 个源任务。横轴是已处理任务数,而不是实际 Memory Record 数;一个任务可能产生零条或多条记录,Store 容量仍限制为 200。

ReasoningBank 在更多源任务下先改善后下降,表明经验积累可能产生 Interference。CF Memory 也没有完全保住早期任务表现,但回归更小。

固定容量实验中:

Retention Rule Score
Recency 54.2
Random 51.7
Similarity 59.8
Utility(ours) 65.3

Figure 2(d):固定容量下的记录淘汰。 Utility Rule 比 Similarity 高 5.5 分,说明"源任务改进 + 后续复用效果"比单纯相似性更适合决定长期保留。

与此同时,Memory Library 越大,检索与上下文 Token 也越多。论文证明了质量控制的必要性,并没有证明 Memory 可以无成本无限增长。

十二、迁移实验:相似并不等于适用

Figure 3:四类迁移条件下的成功率、检索覆盖率与有害复用率。 COUNTERMEM 在四种条件下都高于 ReasoningBank,尤其能减少外观相似但前提不同任务中的错误套用。

四类迁移分别是:

  1. 同环境、新任务;
  2. 新环境、新任务;
  3. 同一错误、不同表面表达;
  4. Look-alike:表面相似,但旧修正的前提已不成立。
条件 ReasoningBank 成功率 CF Memory 成功率 ReasoningBank 有害率 CF Memory 有害率
同环境、新任务 58.7 67.4 6.8 3.1
新环境、新任务 44.2 52.6 11.2 7.9
同错误、新表面 51.9 63.1 9.4 4.2
Look-alike、前提变化 36.4 49.8 27.6 11.8

Figure 3(数据重制):跨任务迁移。 CF Memory 在环境变化和表面变化后仍有增益,但难度上升会降低绝对成功率。

最值得注意的是,Look-alike 条件下两者 Retrieval Coverage 都很高:ReasoningBank 88.2%,CF Memory 91.5%。但成功率和有害率差异明显。这说明"能找到相似记忆"并不足够,决定成败的是能否识别 c i c_i ci 是否成立以及是否跳过。

十三、消融实验:验证、持久化与匹配缺一不可

Figure 4:验证、持久存储与记录匹配消融。 未验证建议和只在当前任务验证都无法恢复完整收益;随机或错位记录几乎无效,甚至造成负增益。

1. Verification 和 Persistent Storage 的作用

设置 ReAct 增益 Reflexion 增益 ReAct Calls/Solved Reflexion Calls/Solved
Base Agent 0.0 0.0 9.6 9.1
CF without WM +5.2 +2.1 10.4 9.9
WM without CF +7.1 +3.4 8.6 8.8
Full CF Memory +18.5 +8.2 7.0 8.4

Figure 4(a--b):组件必要性与交互成本。 保存未经检查的建议、或只检查但不跨任务保存,都远低于完整方法。

CF without WM 把未验证建议存为记忆,虽然略有收益,却增加了每个成功任务的 World-model Calls。WM without CF 在当前任务检查替代动作,但不持久化,因此也无法获得跨任务累积收益。

这说明 COUNTERMEM 的关键不是"有 Verifier"或"有 Memory"任意一个,而是把验证结果转化为可复用记录。

2. 正确记忆放错位置会怎样

Retrieval 设置 ReAct 增益 Reflexion 增益
No Retrieval 0.0 0.0
Random Retrieval +0.6 +0.4
Shuffled CF -1.1 -0.9
Correct CF +18.5 +8.2

Figure 4©:记录分配消融。 在源任务上有效的修正若被分配到错误状态,增益会消失甚至转负。

Shuffled CF 每检索一条记录产生 0.21 次动作改变,其中 0.17 次有害;正确匹配产生更多动作改变(0.29),有害改变却只有 0.03。

关键因此不是压低 Memory Influence,而是让影响发生在正确的 Decision State。

十四、失败案例与反例:记忆确实会破坏任务

Figure 8:复用收益与伤害。 配对实验同时统计 Memory Rescued 与 Memory Broken;删除 Applicability Condition 后,Look-alike Task 的有害使用率显著上升。

在每个领域 120 个配对任务中,ReasoningBank 的净成功增量分别为 + 5 , + 4 , + 4 , − 5 , + 5 +5,+4,+4,-5,+5 +5,+4,+4,−5,+5;CF Memory 为 + 25 , + 15 , + 31 , + 6 , + 17 +25,+15,+31,+6,+17 +25,+15,+31,+6,+17。合计 600 个配对任务时,净增量从 13 提升到 94。

但 CF Memory 仍会破坏任务。形式化验证领域中,它救回 17 个任务,同时破坏 11 个任务。总体平均分变好,不代表每条记忆都安全。

删除适用条件 c c c 会怎样

设置 普通任务有害率 Look-alike 有害率
ReasoningBank 9.4% 27.6%
CF Memory 4.2% 11.8%
CF Memory without c c c 6.1% 34.2%

Figure 8(b):适用条件消融。 删除 c c c 后,Look-alike Task 的有害使用率由 11.8% 上升到 34.2%,甚至高于 ReasoningBank。

这提供了全文最清晰的反例:即使修正经过源任务验证,只要忽略使用条件,Verified Memory 仍可能成为高置信度错误。

十五、效率与公平比较

1. 十二个 Benchmark 的一致性

使用 gpt-oss-120b 时,ReAct 与 Reflexion 加入 CF Memory 后,在 12 个 Benchmark 的 24 个比较中全部提升,平均增加 12.6 个百分点。

但交互成本并非全部下降。例如 SWE-bench Verified 的 Calls/Solved 分别减少 3.6 与 1.2;Vericoding-Verus + ReAct 虽提升 9.6 分,却多使用 0.5 次调用。收益跨 Benchmark 更一致,成本变化则依赖领域。

2. 共同 6M Token Budget

在独立的五领域实验中,所有方法使用相同 6M Task-run Token Budget。CF Memory 平均 63.5,比 ReasoningBank + MaTTS 高 7.8 分,比 ReasoningBank + Verified Feedback 高 10.4 分,并在五个领域全部领先。

这说明优势不只是因为见过更多轨迹或拿到了 Verifier Feedback。记录如何形成、是否保存动作对与条件、怎样选择使用,同样重要。

不过该实验没有说明具体 Agent--LLM Pair,也未解释 6M Token 在构建与求解之间如何分配;更没有包含离线 Selector Training Cost。因此它只能证明 Task-run Budget 相同时仍有优势,不能证明总训练成本相同。

十六、与 Agent Memory 系列方法的横向比较

方法 主要记忆来源 核心对象 是否验证替代动作 是否显式限制适用条件
A-MEM 已发生的交互与语义关联 动态关联记忆条目 否 非本文式条件字段
MAGMA 多粒度交互经验 多层次/多形态 Memory 否 非本文核心
CoM 长历史与压缩经验 组织后的记忆结构 否 非本文核心
ReMemR1 当前阅读内容与历史记忆 可回访的 Memory Update 否 非本文核心
Mem²Evolve 持续交互经验 可演化记忆或机制 不以同状态可执行反事实为核心 依具体机制
MemScope 轨迹、Memory State 与 Provider Code 局部 Provider Code 不负责构造反事实经验 通过补丁约束保证兼容
ReasoningBank 过往尝试 可复用策略 否 无 COUNTERMEM 的 c c c 字段
COUNTERMEM 经同状态检查的局部替代动作 动作对 + 证据 + 条件 + 复用统计 是 是

横向比较:COUNTERMEM 在 Agent Memory 演进中的位置。 它不是重新组织事实记忆,而是为"未实际采取的替代动作"建立经验证的记忆准入与复用机制。

与 A-MEM、MAGMA、CoM 相比,COUNTERMEM 改变的是 Memory Source,不是主要改变 Memory Organization。与 ReMemR1 相比,它不是回看历史记忆,而是在历史决策点构造经过检查的新经验。与 MemScope 相比,两者都重视可执行证据,但 MemScope 用证据修 Provider Code,COUNTERMEM 用证据生产 Action-level Memory。

十七、对 Coding Agent、Tool Agent 与 Multi-Agent 的启发

以下内容是基于论文方法的工程推演,不是论文已经验证的结论。

1. Coding Agent:把失败 Patch 变成最小对照实验

Coding Agent 可以在测试失败后保留工作树快照,对局部替代 Patch 分别运行相关测试,只把测试覆盖下确实改善的差异写入记忆:

( Failure Pattern , Bad Edit , Good Edit , Tests , Scope ) (\text{Failure Pattern},\text{Bad Edit},\text{Good Edit},\text{Tests},\text{Scope}) (Failure Pattern,Bad Edit,Good Edit,Tests,Scope)

相比保存"以后记得检查空值"这样的宽泛反思,这种记录可以明确在哪类调用路径、数据类型和测试条件下使用。

但测试覆盖不足时,Verified 只代表"通过这些测试",不能代表真实正确。生产级系统还需要静态分析、安全扫描和回归测试共同验证。

2. Tool Agent:为工具调用构造 Counterfactual Call

当 API 调用失败时,可以固定参数上下文,局部修改工具、参数名、分页方式或重试策略,并在沙箱中比较结果。记忆保存的不是"某工具不好用",而是"在某权限、Schema 与错误码条件下,应把调用 A 改为 B"。

Selector 的 Skip Action 尤其重要:当前 Draft 已正确时,不应为了使用记忆而改写调用。

3. Multi-Agent:验证协作协议的局部替代

多 Agent 失败可能来自错误 Delegation、消息缺字段或 Reviewer 介入过晚。若系统能重放协作状态,就可以只修改一次任务分配或一条消息结构,观察团队结果是否改善,再把验证过的 Protocol Contrast 保存下来。

这比从整段失败对话中生成一句团队反思,更容易确定因果归属。

十八、局限性

1. 强依赖可执行检查器和状态重置

方法要求任务存在 World Model,并允许复制或重置到原状态。开放式写作、长期社会互动或不可逆现实操作很难满足。小范围局部编辑也无法解决需要整体规划变化的失败。

2. Verification 只在测试覆盖范围内成立

测试套件可能漏掉边界情况,SQL Reference 可能只覆盖一个输入。验证证明的是"这个状态和这些检查下更好",不是未来所有任务都正确。

3. 只能一次使用一条记录

Selector 最多选择一条 Memory,无法组合多个修正。复杂任务若同时需要 Schema 修复、边界处理和资源约束,单记录可能不足。

4. Memory 会过时

工具版本、数据库 Schema、权限和任务要求变化后,过去正确的 c i c_i ci 也可能失效。当前方法没有完整的 Staleness Detection 与自动退休机制。

5. 没有隔离 DQN 的独立收益

论文比较的是完整方法,没有用固定 Selector 与 DQN 做严格对照。因此无法判断增益中有多少来自 Verified Record,有多少来自学习型 Selector。

6. 成本口径不完整

主表 Token 不包含离线 DQN Training,Calls/Solved 也不能等同于总调用或财务成本。论文没有完整报告 Wall-clock、训练 Token 与端到端价格。

7. 复现材料尚不完整

论文说明代码将在接收后发布;当前 Manuscript Package 不含完整 Task Manifest、Evaluator Trace、Experiment Runner、Benchmark Environment 与 Trained Checkpoint。Best-of-N 与部分 Baseline 的完整 Prompt 和 Construction Budget 也未全部提供。

8. 安全与隐私

长期记忆可能保存敏感轨迹;恶意或不完整的测试也可能把错误修正包装成"已验证"记录。论文 Ethics Statement 明确指出,Benchmark Improvement 不等于部署安全保证。

十九、我的理解与启发

1. COUNTERMEM 真正改变的是 Memory 的证据标准

传统记忆常问"这段经验看起来是否值得保存",COUNTERMEM 问的是"替代动作是否在同一状态中产生了可测量改进"。

这相当于把长期记忆从 Narrative Database 推向 Evidence-bearing Database。每条记录不仅说"做什么",还保存"为什么相信它"和"何时不该用"。

2. Verified 与 Applicable 必须同时成立

全文最重要的逻辑可以写成:

Useful Memory ≠ Verified Correction \text{Useful Memory} \ne \text{Verified Correction} Useful Memory=Verified Correction

$$

\text{Useful Memory}

\text{Verified Correction}

\text{Applicable Context}

\text{Selective Use}

$$

删除 c c c 后 Look-alike 有害率升到 34.2%,比 ReasoningBank 的 27.6% 还高。这说明带证据的错误迁移可能比普通经验更危险,因为系统会对"已验证"产生额外信任。

3. Skip 应该成为所有 Memory Agent 的标准动作

许多记忆系统默认"检索到就塞进上下文"。COUNTERMEM 把 Skip 放进动作空间,承认 Memory 不是必需品。Retrieval 负责"可能相关",Selector 负责"现在值得使用"。

这一层可以推广到 RAG、Tool Retrieval 和 Multi-Agent Delegation:系统不仅要会选,还要会拒绝。

4. 反事实记忆是一种可迁移的测试资产

一条好的 Counterfactual Memory 很像一个小型回归测试:它记录失败模式、最小修正、检查证据和适用前提。与纯文本反思相比,它更适合进入自动维护闭环。

未来可以进一步把记录与真实 Test Case、Proof Obligation 或 Database Snapshot 绑定。当工具和 Schema 变化时,重新执行验证,自动更新或淘汰过时记录。

二十、总结

COUNTERMEM 关注传统 Agent Memory 很少处理的问题:真实轨迹只告诉我们 Agent 做了什么,却没有验证"如果当时采取另一个局部动作,是否会更好"。

它在失败决策点生成至多 4 个局部替代动作,从同一可复制或可重置状态运行测试、证明检查器、SQL Checker 或 Solver,只把效用确实提高的动作对存入 Memory。每条记录保留 Situation、原动作、改进动作、证据、适用条件与复用统计。新任务中,系统先按条件和相似度检索,再由 DQN 选择一条记录或跳过。

实验覆盖六个领域、十二个 Benchmark。使用 gpt-oss-120b 时,ReAct 与 Reflexion 的 24 个比较全部提升,平均增加 12.6 个百分点;四组 Backbone--Agent 设置的 Task-run Token 下降 7.7%--42.0%。消融表明,没有验证、没有持久存储、错误匹配记录都会显著削弱收益;删除 Applicability Condition 会把 Look-alike Task 的有害率从 11.8% 推高到 34.2%。

一句话总结:

COUNTERMEM 不再把模型"觉得应该怎样做"的反思直接当作记忆,而是把同状态下经过可执行检查的局部修正,连同证据和适用条件一起存下来,并学习何时使用、何时跳过。

参考资料

  1. COUNTERMEM: World-Model Verified Counter-Factual Memory for Language Agents. ICLR 2027.
  2. 论文页面:https://arxiv.org/abs/2609.31874
  3. 论文 PDF:https://arxiv.org/pdf/2609.31874
相关推荐
鬼手点金1 小时前
消息的四种角色
java·前端·人工智能·git·深度学习
人人都是软件工程师1 小时前
📚 Tesla AI 总监:让 LLM 把文档"编译"成持续生长的知识库 llm_wiki
人工智能·rust·开源
十方空烬1 小时前
开源雷达 · 2026-10-21:技能开始像软件包一样被治理
开源·github
武子康1 小时前
灰度完成率从100%变成50%:五条失败记录怎样消失
人工智能·后端·agent
狂潮lister1 小时前
第6篇 掀翻共识:注意力叠权才是一切,异源对撞破同源自噬|【狂潮元理论 2.1‑public】
人工智能·llm
溯朢1 小时前
让AI从制度文档里建本体,怎么保证它不瞎建
人工智能
橙色云-智橙协同研发1 小时前
智搜·智驱·智淀:智橙PLM三大AI能力深度解析
人工智能
我是李工啊1 小时前
Prompt 不是越精确越好:提示词的战术执行与战略探索两种写法
人工智能