遗忘是一种能力:五篇论文看懂长程 Agent 的记忆管理,正在重演操作系统内存史

精读 AgentFold、IterResearch、AgentSwing、ContextBudget、Self-GC 五篇 2025.10–2026.07 的论文:为什么"记住一切"的 agent 反而答得更差?用 Pass@1 = η×ρ 这个分解式看懂 context rot 的本质,以及上下文管理如何从启发式规则一步步演化成垃圾回收、预算分配和运行时调度——操作系统内存管理史的完整重演。

一个反直觉的实验结果:让长程 agent 什么都不忘、记住全部历史,它走到终点的概率最高——但走到终点后,答对的概率最低。这不是某个模型的毛病,而是 AgentSwing 论文在三个不同模型上都复现的规律,他们给它起了个名字:context rot(上下文腐烂)

如果你只带走一句话,就带走这个:

上下文不是日志,是工作记忆。日志的美德是完整,记忆的美德是取舍。长程 agent 的核心工程问题,正在从”怎么记住更多”翻转成”怎么聪明地遗忘”——而这个领域正在快速重演操作系统内存管理的整部历史。

这篇消化五篇论文,按时间排成一条演化线,九个月内每一步都在回答上一步留下的问题:

时间论文一句话定位
2025.10AgentFold(ICLR 2026)每一步主动”折叠”历史,上下文是要雕刻的工作台,不是只增日志
2025.11IterResearch最激进:不修剪日志,每轮直接重建工作区(马尔可夫化)
2026.03AgentSwing别选一种遗忘策略——并行试几种,用前瞻路由挑赢家
2026.04ContextBudget”何时压缩、压多少”不该手写规则,用 RL 在预算约束下出来
2026.07Self-GC把上下文当带生命周期的对象来治理——名字就叫垃圾回收

先立一个分解式:Pass@1 = η × ρ

五篇里最值得偷走的思维工具,来自 AgentSwing。它把长程任务的成功率拆成两个独立的概率:

Pass@1=ηρ\text{Pass@1} = \eta \cdot \rho
  • 搜索效率 η\eta:agent 在耗尽资源(上下文、轮数)之前走到终点、给出答案的概率;
  • 终点精度 ρ\rho:在给出答案的前提下,答案正确的概率。

这个分解的价值在于:它把”任务失败”拆成了两种完全不同的病。η\eta 低是没走完——上下文爆了、轮数耗尽了;ρ\rho 低是走完了但答错——被自己积累的噪声带偏了。一个只看 Pass@1 的评测会把两种病混在一起,开出错误的药方。

用这副眼镜回看开头那个反直觉结果,就通了:

  • 什么都不忘η\eta 最高(信息都在,总能磨到终点),但 ρ\rho 最低——context rot,越到后期上下文里失败尝试、过期快照、无关网页越多,模型注意力被稀释,推理被旧噪声污染;
  • 什么都忘掉(AgentSwing 里的 Discard-All 策略,定期清空只留原始问题):单次 η\eta 低,但每次清空相当于重开一次尝试,多次重试的成功率按 1(1ηsingle)N1-(1-\eta_{single})^N 复利叠加;而干净的小上下文让 ρ\rho 显著更高——在对齐的困难子集上,Discard-All 的 ρ\rho 达到 81.8%,是所有策略里最高的。

记忆和遗忘不是好坏之分,是 η\etaρ\rho 的权衡。 所有静态策略在这两个维度上排成一条权衡前沿——这就是五篇论文共同的地基。下面看每一篇怎么在这条前沿上做文章。

第一步:从”只增日志”到”主动折叠”(AgentFold)

传统 ReAct agent 的上下文是只增的(append-only):每一轮的思考、工具调用、返回结果原样堆进历史。AgentFold 的转变是把上下文看作”需要主动雕刻的认知工作台,而不是被动填满的日志”。

机制:每一步,模型除了输出工具调用,还并行输出一条折叠指令(JSON 格式,指定折叠哪个范围的历史步骤、用什么摘要文本替换)。折叠是多尺度的——可以细粒度地压缩单步(保留关键细节),也可以把整个已完成的子任务深度合并成一句话。

这一步的历史意义是把”遗忘”从框架层的截断规则(超过 N 轮删最旧的)变成了模型自己的输出动作。但它留下一个问题:折叠是摘要式的、不可逆的——摘掉的细节永远回不来了。

第二步:干脆不修日志,每轮重建(IterResearch)

IterResearch 给出了最激进的回答:与其在一个不断膨胀的单一上下文里修修剪剪(他们称之为 mono-contextual 范式的”上下文窒息”),不如把长程任务重构成马尔可夫决策过程——每一轮,agent 只面对一个重建过的工作区:一份持续演进的报告(作为记忆)加上当前轮的新信息,而不是全部原始历史。

效果是范式级的:交互次数可以扩展到 2048 轮,性能从 3.5% 涨到 42.5%;作为纯提示策略(不训练)用在前沿模型上,比 ReAct 高出最多 19.2 个百分点

ηρ\eta \cdot \rho 的话说:马尔可夫化重建让 ρ\rho 不随深度衰减(每轮都是干净上下文),从而解锁了”用更多轮数换更高 η\eta“的可能——这就是他们所说的 Interaction Scaling。上下文长度不再是任务深度的天花板。

代价也明确:每轮重建的报告是模型写的摘要,逐字证据、精确定位符会丢。写代码时你需要的常常不是”我改过那个文件”的叙述,而是那个文件第 47 行的原文。

第三步:别赌一种策略,并行试、路由选(AgentSwing)

前两篇各自押注一种遗忘哲学。AgentSwing 的观察是:没有一种静态策略在整条轨迹上都是对的。任务早期探索阶段适合多留信息,陷入死胡同时适合清空重来——策略应该随状态切换。

机制:当上下文超过阈值时触发一次”分岔”——把当前原始上下文分别交给三种处理(Keep-Last-N 只留最近 5 轮 / Summary 压缩成摘要 / Discard-All 全清空),每个分支在真实环境里继续跑 K=3 轮,然后让模型看着三条前瞻轨迹选出最有希望的一条,其余丢弃。

结果:GPT-OSS-120B 在 BrowseComp 上从基线 39.5 提到 60.0(最好的静态策略是 52.5);DeepSeek-v3.2 拿到 62.5 / 71.3(中文),超过若干专有模型;平均可用少至 1/3 的交互轮数追平静态方法。消融实验证明关键不在”有多个候选”——随机选分支只有 51.0,不看前瞻直接选只有 50.0,完整版 60.0。价值在于用真实环境的短期反馈来评估遗忘决策的后果,而不是静态地猜。

这在操作系统史里有个精确的对应物:分支预测与投机执行。不确定哪条路对,就几条都跑一小段,用真实执行结果来选。

第四步:遗忘策略本身是学出来的(ContextBudget)

前三篇的遗忘决策都还是提示工程(写规则告诉模型怎么折叠/重建/路由)。ContextBudget 问:为什么不把它变成一个可优化的目标?

它把上下文管理形式化成带预算约束的序贯决策问题:状态里显式包含剩余预算 rt=BCtr_t = B - |\mathcal{C}_t| 和即将到来的观察的长度;动作是三选一——不压缩 / 选择性合并部分历史块 / 全量合并;奖励设计非常”目标函数即命运”:任何一轮超预算,整条轨迹奖励直接清零——只有既做对任务又守住预算的行为才被保留。再配上课程学习:训练分 5 个阶段,预算从 8192 逐步收紧到 4096,逼着策略学会在越来越紧的约束下工作。

两个结果值得记住:

  1. 30B 模型 + 8k 学习型预算管理,打败了 235B 模型 + 128k 上下文的 ReAct(0.147 vs 0.136)。上下文管理得好,能顶得上参数量和上下文长度的数量级差距。
  2. 学出来的压缩是看菜下饭的:任务简单时它压缩得更少但更准(比基线少调用 41.7% 的压缩、F1 反而高 8.3%);任务复杂时压缩调用翻倍、F1 提升 143%。消融显示,把预算信息从状态里拿掉,性能就退化——压缩决策必须以预算为条件,这正是启发式规则(固定阈值触发)给不了的。

如果你读过我前一篇《删掉 80% 系统提示词之后》,会认出这是同一个模式:手写的启发式(超过阈值就摘要)正在被学习出来的判断取代——苦涩的教训,这次发生在上下文管理层。

第五步:上下文对象有了生命周期(Self-GC)

2026 年 7 月的 Self-GC 把这条演化线推到了系统工程的深度,名字直接致敬垃圾回收(Garbage Collection)。它的出发点是前面所有方法共同的盲区:上下文里的东西不是均质的文本,是不同类型的对象——用户约束、工具输出、生成的报告、失败的日志——它们该有不同的生命周期。

三个机制拆开看:

1)对象索引。 用户轮次、工具输出片段被编上稳定 ID(如 function:read:1),成为可精确寻址的对象——后续所有操作靠 ID 定位,不靠模糊文本匹配。

2)三种操作,对应三种对象性质:

  • fold(折叠):把原文逐字节搬进 sidecar(旁存),原位留一个恢复指针。用于将来可能要逐字引用或编辑的大块内容(报告正文、长 SQL)。关键词是可恢复——这直接回应了 AgentFold 和 IterResearch 摘要不可逆的痛点;
  • mask(遮蔽):保留结构边界、删掉重复的中段。用于日志型内容(重复的浏览器快照)。论文明确警告:稀疏表格、堆栈跟踪、diff 不许 mask——它们的”中段”就是证据本身;
  • prune(修剪):无恢复保证地删除。只用于确认过期的低信号痕迹(失败的命令日志、被取代的搜索)。

3)旁路 planner + 缓存感知提交。 决定 fold/mask/prune 的是一个旁路运行的 planner(fork 当前上下文去做规划,从不污染主对话),它的输出要经过 harness 的沙盘推演(rehearsal)——解析目标、丢弃非法编辑、本地物化验证——才能在安全的轮次边界提交。最工程师的细节是这个提交收益公式:

CommitBenefitNfuture(CC)Lcache_breakLGC\text{CommitBenefit} \approx N_{future}(C - C') - L_{cache\_break} - L_{GC}

每次编辑上下文都会打破 provider 的 prompt cache,所以压缩省下的钱必须大于缓存失效的成本加上 GC 自身的开销才值得立刻提交,否则挂起等到缓存自然过期。他们的生产经验值:预期修剪比例超过 0.3 才立即提交。这是我见过的第一篇认真处理”上下文编辑与 prompt cache 互相打架”的论文——所有做 agent 基建的人迟早会撞上这个问题。

数字:在高压测试集上修剪 43.95% 的前缀 token,84.85% 的后续任务不受影响;而各种启发式基线(删最旧轮、删工具输出)修剪量差不多,无影响率只有 54.55%–69.70%。生产环境上线后日间输入 token 降 10–15%,峰值近 20%。

合起来看:操作系统内存史的重演

把五篇放进一张表,对应关系几乎是逐条的:

操作系统概念Agent 上下文对应物论文
只增日志 → 主动整理折叠指令作为模型输出AgentFold
进程快照 / 状态重建马尔可夫工作区重建IterResearch
分支预测、投机执行并行分支 + 前瞻路由AgentSwing
预算约束下的分配策略预算条件化的 RL 压缩ContextBudget
垃圾回收(搬迁、指针修复、暂停成本调度)fold/mask/prune + sidecar + 缓存感知提交Self-GC
flowchart LR
    A["只增日志<br/>ReAct 范式"] --> B["启发式截断<br/>删最旧 / 摘要"]
    B --> C["模型主动折叠<br/>AgentFold 2025.10"]
    C --> D["工作区重建<br/>IterResearch 2025.11"]
    C --> E["策略路由<br/>AgentSwing 2026.03"]
    B --> F["RL 学压缩<br/>ContextBudget 2026.04"]
    C --> G["对象生命周期治理<br/>Self-GC 2026.07"]
    D -.摘要不可逆.-> G
    E -.静态策略不够.-> F

这个重演不是巧合。操作系统内存管理的全部智慧,来自一个约束:快的存储永远稀缺,所以必须决定什么留在快的层、什么下沉到慢的层、什么直接扔掉。agent 的上下文窗口就是这个时代的”快存储”——它贵(每 token 都要过一遍注意力)、它降质(context rot)、它有硬上限。同一个约束,长出同构的解法。

而贯穿五篇的元规律,和我上一篇写的是同一条:遗忘决策正在从”人写的规则”移交给”学习和判断”。 删最旧轮次是规则;AgentFold 让模型自己决定折什么;ContextBudget 把决策学进权重;Self-GC 用一个 LLM planner 做语义级的”可达性分析”。规则 → 判断,设计时如此(上一篇的删提示词),运行时也如此。

该泼的冷水

“上下文都百万 token 了,还需要遗忘吗?” 需要,而且这批论文给出的理由不是容量,是质量和成本。AgentSwing 的数据显示 context rot 是质量问题——窗口装得下,不代表模型用得好;Self-GC 的生产数据显示成本问题实打实(输入 token 降 10–20%)。窗口变大只是把权衡的位置往后推,没有消掉权衡。

但激进遗忘有明确的适用边界。 Self-GC 的失败模式分析是五篇里最诚实的一段:在 BI/数据分析型任务上,粗暴删除工具输出的基线反而有竞争力——因为数据可以重新查询;而在办公文档流上,一段短短的工具输出可能是唯一的、不可再生的业务证据,删了就永久丢失。规律是:任务有没有外部记忆基座(git、日志、测试、可重查的数据库),决定了你能遗忘得多激进。 写代码的 agent 可以大胆忘(git 记得),处理一次性对话和临时文件的 agent 必须保守。

这些方法自己也承认没到终点。 AgentSwing 明说 test-time 的外挂路由是权宜之计,根治要靠训练出”原生就能在小上下文里高效工作”的模型;ContextBudget 的压缩粒度还停留在整块合并,token 级的取舍做不到;Self-GC 没有做超参扫描,30% 的压缩阈值是拍的。这个领域还在快速演化的早期。

收束:给你自己的 agent 三个可带走的动作

  1. 把评测拆成 η\etaρ\rho 分别测。 你的 agent 失败,是没走完(η\eta 低,该管上下文了),还是走完了答错(ρ\rho 低,该清噪声了)?两种病吃不同的药,混在一个 Pass@1 里你永远不知道该治哪个。
  2. 给上下文里的对象分类,而不是一刀切。 照着 Self-GC 的三分法自查:哪些内容将来可能要逐字引用(fold 到可恢复的地方,别摘要)?哪些是重复日志(mask 掉中段)?哪些确认过期(prune)?堆栈跟踪和 diff 永远别摘要。
  3. 先看任务有没有外部记忆基座,再定遗忘的激进程度。 有 git 和测试兜底的编码任务,学 IterResearch 大胆重建工作区;没有版本基座的业务流,学 Self-GC 的保守主义——凡是删掉后无法重新获得的,都不许删。

上下文窗口是 agent 的工作记忆,而认知科学早就知道:工作记忆的容量不是智能的瓶颈,对工作记忆的管理才是。这五篇论文,是机器第一次认真学习这件人类每天都在做的事——遗忘。


论文清单

系列前文删掉 80% 系统提示词之后:Claude 5 时代的上下文工程新规则——设计时的减法;本篇是运行时的减法。