Kaelem

让 Agent 在关键时刻想起来:Meta 的 Proactive Memory Agent 到底证明了什么

·20 min read
AI论文解读AgentMemoryLong-horizon

一句话概括:这篇论文真正有价值的地方,不是又给 Agent 加了一个“记忆库”,而是把记忆重新定义成一种控制回路里的动作:什么时候应该提醒行动模型,什么时候应该沉默。作者把这种长任务失败叫做 behavioral state decay——关键信息可能还在上下文里,却不再影响下一步决策。Meta AI 的 Proactive Memory Agent 在不改行动 Agent 的前提下,并行维护结构化记忆,并在必要时注入一句有证据约束的提醒。在 Terminal-Bench 2.0 上,Claude Sonnet 4.5 从 37.6% 提到 45.9%,提升 +8.3 个百分点;在 τ²-Bench task-weighted average 上从 55.0% 到 61.8%,提升 +6.8 个百分点。但它证明的不是“长上下文问题解决了”,也不是“记忆越多越好”,而是:长程 Agent 需要一个被校准过的、会选择沉默的记忆干预策略。

图 1:记忆不是仓库,而是干预

先把概念放到桌面上:Agent 为什么会“忘”?

我们先不谈模型结构。想象一个 Agent 正在修一个复杂 bug。它第 5 步发现“测试必须覆盖单字符边界”,第 12 步发现“某个文件写入路径会失败”,第 30 步又在另一个错误上绕了很久。到第 45 步,它可能并不是完全看不到前面的记录;很多时候,那些信息仍然在 transcript 里,甚至还没被上下文窗口挤出去。问题是,它做下一步动作时,已经不再被这些信息约束。

论文把这种现象叫 behavioral state decay,直译是“行为状态衰减”。这里的“状态”不是聊天摘要,而是会改变下一步行动的执行状态:任务要求、环境事实、失败尝试、诊断结论、未完成子目标。信息仍然存在,但失去了控制行为的力量。

这就引出第二个概念:memory as intervention。常见记忆系统关心“存什么、怎么检索”;这篇论文问的是更尖锐的问题:“这条记忆现在该不该打断行动 Agent?”如果提醒太少,Agent 会重复踩坑;如果提醒太多,额外 token、延迟和干扰都会伤害局部进展。真正困难的不是把所有历史都塞回去,而是在下一步动作之前,把那一小片会改变决策的状态重新点亮。

第三个概念是 selective silence:沉默也是一个动作。一个好的记忆 Agent 不应该每轮都像旁白一样总结历史;它应该知道什么时候不说话。论文后面的 ablation 正好说明,强制每步提醒并没有稳定压过选择性提醒,尤其在按领域均衡的 macro average 上,完整系统更稳。

长上下文为什么不够:信息在,不等于信息在起作用

图 2:行为状态衰减

直觉上,我们可能会说:如果问题是“忘”,那把上下文窗口做长一点不就行了吗?

这正是论文试图拆掉的直觉。长任务里的失败不只是信息被截断。作者在引言里强调,关键信息可能仍在 transcript 中,甚至仍在模型可见的上下文窗口里,但它“不再可靠地控制行为”。这和 Lost in the Middle 一类观察是一致的:上下文可见性和信息可用性不是一回事。

在命令行任务里,这种衰减常表现为重复失败命令、忘记早先诊断、为了修一个局部错误破坏原始要求。论文在 qualitative analysis 里举了 Terminal-Bench 的例子:在 regex-log 中,记忆重新激活了边界条件和诊断,提醒当前正则漏掉了单数字 IPv4 octets;在 adaptive-rejection-sampler 中,记忆追踪了反复失败的文件编辑,并在后面浮出环境相关的 workaround。

在 τ²-Bench 这种交互式工具任务里,衰减的样子又不一样。用户可能声称自己是 Gold status,但工具查询显示是 Regular member。基础 Agent 后面可能被用户说法带偏,按 Gold 身份发补偿;有记忆干预时,系统会提醒行动 Agent 以工具验证记录为准。另一个例子是 basic-economy flight 不能修改,记忆在状态变更工具调用之前重新激活这条政策。

注意,这些都不是“把历史总结得更好”这么简单。真正有用的是在某个即将犯错的动作之前,把一个具体约束重新放进控制回路。

这套系统怎么工作:一个旁路的记忆 Agent

图 3:两阶段记忆代理

论文的工程设计刻意保持“旁路”:行动 Agent 不改,工具 scaffold 不改,解码方式不改。另起一个 memory agent,和行动 Agent 并行运行。它在第一步以及之后的固定间隔被调用;主实验里,论文写明 memory agent 在第一步之后每一步运行一次,观察任务描述、最近 k=8 条消息窗口和当前 memory bank。

这个 memory bank 不是一段自由摘要,而是三块结构化状态:

  • status:记忆 Agent 私有的进展、风险和未解决问题,不展示给行动 Agent;
  • knowledge memory:相对稳定的事实,比如任务要求、环境属性、文件路径、配置细节、工具验证事实;
  • procedural memory:尝试和结果,比如失败命令、成功修复、排除的假设、错误模式、性能观察。

每次调用分两阶段。第一阶段,memory agent 通过受限 tool calls 管理记忆库:memory_update_statusmemory_save_knowledgememory_save_proceduralmemory_delete。它不是随便写一段总结,而是显式地新增、更新或删除结构化条目。

第二阶段才是论文的核心:它读取更新后的记忆库,选择输出一句 <context_for_action> 提醒,或者输出 <no_intervention/>。如果提醒存在,系统把它作为临时 memory context 注入下一次行动 Agent 调用;如果没有,行动 Agent 的上下文不变。

这个边界很重要。它不是 RAG,因为不是等行动 Agent 主动查询;也不是普通 advisor,因为它被限制为 memory-grounded reminder,而不是泛泛给战略建议;更不是总结器,因为总结器只问“保留什么”,这里还问“什么时候让保留的信息重新产生行为影响”。

数字里最有信号的部分:弱 Agent 提升大,强 Agent 也没消失

主结果在 Table 1。作者用了两个长程 Agent benchmark:Terminal-Bench 2.0 和 τ²-Bench。Terminal-Bench 是容器化命令行环境,Agent 要查文件、跑命令、改代码、调 bug,最后由隐藏 verifier 判定 pass/fail。论文说 benchmark 有 89 个任务,但报告的是 85 个 baseline 与 memory 都有有效评估的 paired tasks,排除了 4 个与 Agent 行为无关的 docker failures。

τ²-Bench 则是交互式工具使用任务,包含 airline、retail、telecom 三个 domain。base split 是 50 个 airline、114 个 retail、114 个 telecom,总共 278 个任务。每个 episode 是行动 Agent 和 user simulator 的一次对话,是否通过由 benchmark evaluator 判定。

结果非常直接:当行动 Agent 是 Claude Sonnet 4.5,memory agent 是 Claude Opus 4.6 时,Terminal-Bench 从 37.6% 到 45.9%,提升 +8.3 pp。在 τ²-Bench task-weighted average 上,从 55.0% 到 61.8%,提升 +6.8 pp。分 domain 看,airline 从 68.0% 到 78.0%,+10.0 pp;retail 从 49.1% 到 58.8%,+9.6 pp;telecom 从 55.3% 到 57.9%,+2.6 pp。

更有意思的是强行动 Agent 上增益没有完全消失。Claude Opus 4.6 自己做行动 Agent 时,Terminal-Bench 从 43.5% 到 45.9%,+2.4 pp;τ²-Bench task-weighted average 从 66.2% 到 68.7%,+2.5 pp。这个幅度小很多,但方向仍然一致。它支持一个比较克制的结论:记忆干预不只是给弱模型补智商,也在帮助强模型维持执行状态。

不过这里要留一个边界:论文报告的是 pass@1 单次运行平均,不是多次采样置信区间;表格也没有给标准误或显著性检验。所以我们可以说“在这套评测和配置下观察到稳定提升”,但不应该把每个小数点都解读成精确排序。

消融实验真正回答的问题:是不是只要把记忆塞进去就行?

图 4:选择性提醒胜过全部暴露

如果只看主结果,很容易误读成“多给历史记忆就会变好”。Table 2 的消融实验更关键,因为它把几个看似合理的替代方案拆开比较。

基线 Sonnet 4.5 在 τ²-Bench 三个 domain 的 macro average 是 57.5,micro/task-weighted average 是 55.0。完整 memory agent 是:第一阶段管理记忆库,第二阶段选择性提醒或沉默,三域结果为 airline 78.0、retail 57.0、telecom 57.9,macro 64.3,micro 61.2

第一种替代方案叫 Full-bank context:仍然维护记忆库,但每步把整个 bank 暴露给行动 Agent,不做选择性干预。它的 macro 是 61.5,micro 58.6,比完整系统低 2.8 macro points 和 2.6 micro points。这说明“让历史可见”有帮助,但不等于让关键状态在正确时刻起作用。

第二种是 Always inject:仍然生成提醒,但取消沉默,每步都必须注入。它的 macro 是 63.5,micro 61.5。micro 比完整系统高 0.3,但论文指出这个差距在预期运行方差内;更重要的是,domain-balanced macro 上选择性沉默更好,尤其 airline 差距明显。换句话说,总是提醒可以竞争,但不够稳。

第三种是 Injection-only (no bank):没有持久记忆库,只让一个辅助模型看轨迹后给建议或沉默,类似 advisor。它 macro 61.0,micro 60.8,telecom 上甚至到 66.7,但 airline 从基线 68.0 掉到 62.0。没有持久执行状态时,建议可能有用,也可能不可靠。

第四种是 Mem0:用通用持久记忆层,ADD 写入,vector+BM25 top-10 检索给行动 Agent。它 macro 62.1,micro 60.8,证明通用 memory retrieval 本身有价值;但 airline 没超过基线,macro 也低于完整系统。这里的差异正好对应论文主张:检索相关记录和判断“这条记录现在该不该干预”不是同一个问题。

所以消融实验的核心答案是:不是“记忆越多越好”,而是“维护执行状态 + 选择性注入”这个组合最均衡。

开源权重记忆策略:能学,但还只是早期证据

论文最后一部分尝试训练一个 open-weight memory agent。主实验里的 memory agent 是 Claude Opus 4.6,实际部署成本高,而且每步调用前沿模型也不一定现实。作者于是固定行动 Agent 为 Qwen3.5-122B-A10B,只训练 Qwen3.5-27B 做 memory agent。

训练数据来自 SETA,一组带 verifier rewards 的可执行 terminal-agent tasks。流程是先用 SFT 蒸馏 prompted memory trajectories,让模型学会第一阶段的记忆库操作和第二阶段的提醒/沉默选择;再用 GRPO 做强化学习校准。因为任务级 verifier reward 很稀疏,作者没有对所有 memory calls 平均施力,而是聚焦在离线 rollouts 标注出的 pivot turns——也就是更可能影响后续成功的关键回合。

Table 4 的数字值得细看。SETA validation 上,action only/no memory 平均 reward 是 0.709,solved 56;直接加未训练的 Qwen3.5-27B base memory 反而掉到 0.693,solved 54。SFT 后回升到 0.720,solved 58;GRPO 后到 0.734,solved 仍是 58,相对 action only 提升 +0.025 reward。

迁移到 held-out Terminal-Bench 2.0 时,Qwen3.5-122B-A10B action only 是 37.6%,加训练后的 Qwen3.5-27B memory 到 41.1%,提升 +3.5 pp

这部分最诚实的读法是:记忆干预策略可以被学习,RL 对“什么时候该说话”有帮助;但目前只是 early exploration。它没有证明一个 27B open-weight memory agent 已经能全面替代 Opus 4.6,也没有证明跨 benchmark、跨 harness、跨模型族都稳健。尤其未训练 base memory 会伤害 SETA reward,说明“多一个代理”本身不是免费午餐,校准不好会制造噪声。

这篇论文证明了什么,没有证明什么

论文证明了几件具体的事。

第一,在两类长程任务上,旁路记忆干预可以提升 pass@1。证据是 Terminal-Bench 2.0 的 85 paired tasks 和 τ²-Bench 的 278 tasks,且弱行动 Agent 提升更大,强行动 Agent 仍有小幅提升。

第二,成功机制更接近“重新激活执行状态”,不是泛泛总结。Table 3 把机制归纳为五类:requirement/policy reactivation、environment grounding、failure-loop avoidance、diagnostic carryover、progress/entity tracking。定性案例也显示,记忆最有用的时候,往往是在行动 Agent 即将忽略一条早先已观察到的约束之前。

第三,完整两阶段设计比几个朴素替代方案更均衡。Full-bank context、always inject、injection-only advisor、Mem0 都能在某些平均指标上改善基线,但完整系统的 macro average 最高,说明选择性干预确实不是装饰。

第四,开源权重 memory policy 有可学习迹象。Qwen3.5-27B 经 SFT 和 GRPO 后在 SETA validation 上优于 no-memory,并能向 held-out Terminal-Bench 部分迁移。

但它没有证明另外几件事。

第一,它没有证明长上下文可以被记忆代理替代。相反,memory agent 仍依赖最近窗口、结构化 bank 和固定调用频率;论文甚至把“学习何时调用记忆,而不是固定 schedule”列为未来方向。

第二,它没有证明总成本可接受。主配置中 memory agent 在第一步之后每步运行,且使用 Opus 4.6 作为 memory agent。论文讨论了 prompted memory agent 成本高,但没有给完整 latency/token overhead 表格。

第三,它没有证明所有 domain 都同样受益。τ²-Bench 中 Sonnet 的 airline/retail 提升很大,telecom 只有 +2.6 pp;Opus 在 airline 是 +0.0 pp。这说明记忆干预的价值取决于任务里是否真的存在会跨步衰减、又能被提醒修复的状态。

第四,它没有证明 memory agent 不会犯错。作者明确写到剩余失败主要是 calibration errors:有时会把 speculative inference 说得太有信心,有时重复行动 Agent 已知的信息,有时提出合理但不必要的担忧,导致额外验证。

更大的意义:Agent 需要的不是更厚的笔记本,而是一个会插话的同事

看完整篇论文,最值得带走的不是某个具体 benchmark 数字,而是问题框架的改变。

我们通常把 Agent 记忆想成笔记本:把事实写进去,之后需要时翻出来。但长程执行更像两个人结对工作。一个人在动手修问题,另一个人不应该每五秒读一遍完整笔记,也不应该永远沉默。它最有价值的时刻,是在同伴即将重复旧错误、违反早先约束、忘记工具验证事实之前,说一句短而准的话:“等一下,前面已经证明这条路不通。”

Proactive Memory Agent 试图把这个“会插话的同事”形式化:它维护结构化执行状态,也学习何时让状态重新进入行动回路。这个方向对未来 Agent 系统很重要,因为真实任务的瓶颈常常不在单步推理,而在跨几十步保持约束、诊断和目标的一致性。

它也提醒我们,Agent memory 的评估不应该只问“能不能检索到相关记录”。更关键的问题是:这条记录有没有在正确时刻改变行为?如果没有,它只是被保存了,不是被记住了。