文章目录
- 前言
- 零、论文基本信息
- 一、背景:事实记忆为什么不够
-
- [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 选择一条或跳过,评测阶段冻结记忆与选择器。
整个流程分为三个阶段:
- Memory Construction: 在源任务中发现失败动作,生成至多 4 个局部替代动作,并用 World Model 验证;
- Selector Training: 冻结 Memory Store,用 2,000 个决策步训练 DQN,学习"选哪条或跳过";
- 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,尤其能减少外观相似但前提不同任务中的错误套用。
四类迁移分别是:
- 同环境、新任务;
- 新环境、新任务;
- 同一错误、不同表面表达;
- 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 不再把模型"觉得应该怎样做"的反思直接当作记忆,而是把同状态下经过可执行检查的局部修正,连同证据和适用条件一起存下来,并学习何时使用、何时跳过。
参考资料
- COUNTERMEM: World-Model Verified Counter-Factual Memory for Language Agents. ICLR 2027.
- 论文页面:https://arxiv.org/abs/2609.31874
- 论文 PDF:https://arxiv.org/pdf/2609.31874