Paper

AutoCompact 论文速读:让编码 Agent 自己学会什么时候压缩上下文

6 min read ·

长程编码 Agent 有一个所有重度用户都体会过的痛点:任务越往后,上下文里堆的早期探索越没用——过时的假设、失败的修复尝试、几百行没人再看的工具输出。业界主流方案是按长度触发自动压缩,但什么时候该压、压的时候保留什么、压完怎么继续,这三件事一直没有好的答案。10 月 1 日挂上 arXiv 的 AutoCompact(arXiv:2610.02163,南洋理工团队)给出了一个训练侧的解法:把这些决策直接学进 Agent 策略。

核心思路:压缩是策略,不是机制

现有工具把压缩当作脚手架层的机械机制——上下文快满了就触发摘要。AutoCompact 的立场是:压缩决策本质上和「下一步调用哪个工具」一样,是策略的一部分,应该由模型自己判断。

为此它给终端式 REPL 脚手架增加了一个 compact() 动作,模型可以主动调用,也可以永远不调。训练分两段:先监督微调建立行为,再用强化学习打磨。

训练数据:judge 在线纠错

监督数据的收集是这篇论文最有工程味道的部分。团队在 379 个 SWE-rebench 任务上跑基础模型,用 GPT-5.5-Codex 做 judge,逐步审查三类决策:

  1. 触发时机——当前节点适不适合压缩;
  2. 工作状态——以 # Auto Context Summary 开头的摘要是否保留了后续所需的信息;
  3. 压缩后延续——压缩后的第一批动作是否遵循了摘要里的计划。

关键设计是纠正发生在执行之前:发现缺陷就替换成修正版,环境执行的是纠正后的输出,轨迹从好状态继续。最终收集到 1,052 条纠正轨迹,其中 24% 监督触发、53% 监督状态构建、23% 监督延续。评估时 judge 完全移除。

RL 阶段:只给二元任务奖励

第二段在 SWE-Gym 上用 GRPO 做端到端多轮强化学习,奖励只有「最终补丁是否通过测试」这一个二元信号,没有任何压缩专用的奖励塑形、没有 KL 惩罚、没有熵奖励。

技术上有个巧妙的处理:每次 compact() 会重写上下文前缀,所以轨迹要在重写处切分成多个 segment,同一轨迹的所有 segment 共享组内 advantage,策略损失按 token 级平均。这解决了「动作改写历史」给信用分配带来的麻烦。

结果:9.2 个绝对点,且低预算收益最大

基于 Qwen3-Coder-30B-A3B-Instruct 的主结果:

方法上下文SWE-bench VerifiedSWE-PolyBench
完整历史基线256K30.4%19.5%
固定长度压缩16K28.8%18.6%
AutoCompact-SFT256K32.2%21.7%
AutoCompact(SFT+RL)256K39.6%24.5%

三个值得注意的细节:

  • 固定长度压缩比不压缩还差 1.6 个点——机械压缩会伤人,这与很多工程团队的体感一致;
  • 主动压缩在上下文远未溢出时就有收益:256K 窗口下没有任何轨迹触发强制压缩,AutoCompact 仍然领先全部六档推理预算(每任务 0.10 到 4.00 美元),且预算越紧收益越大;
  • 消融证明压缩本身贡献了增益:同一检查点跳过 compact() 调用后,优势在最低预算档损失 19.9%,最高预算档仍损失 1.9%。

RL 对压缩行为的改善是可量化的:主动压缩的任务占比 44.3% 到 58.5%,摘要遗漏关键状态 3.1% 到 0.2%,遗漏下一步动作 8.2% 到 2.2%。一个案例研究尤其精彩:SFT 版在摘要里记录了未解决的语法错误,却提议「直接结束」,评估时报 SyntaxError;RL 版的摘要与提议动作完全自洽,通过测试。作者把这称为摘要自洽性——信息覆盖率之外更本质的质量维度。

成本评估的口径也值得借鉴

论文的成本评估没有用「token 总数」这种粗粒度指标,而是按六档推理预算(每任务 0.10 到 4.00 美元)来切分通过率,缓存 token 按标准输入价的 20% 计价,所有通过率取三次运行平均。这个口径把「省钱」和「成功率」放在同一张图里,直接回答了工程团队最关心的问题:同样的钱能买到多高的任务完成率。

答案对低预算场景尤其友好:AutoCompact 的优势在最低预算档最大——因为它不是靠拉长轨迹堆成功,而是靠更聪明的状态管理减少浪费的探索步。这与很多「训练后变啰嗦」的 RL 后训练形成鲜明对比。

与工程实践的对照

把论文结论映射到现有工具链上,有三条可以直接执行的实践:

第一,检查你的脚手架有没有主动压缩机制。 大多数开源 Agent 框架只有长度触发的被动压缩。论文证明了「模型主动调用压缩」是可以训练出来的行为,框架层面应该把压缩暴露成模型可调用的动作,而不是只做水位监控。

第二,压缩摘要要有结构约定。 AutoCompact 的摘要以 # Auto Context Summary 开头,固定保留三类内容:已确立的结论、相关代码与工作区状态、剩余动作。这个结构比自由发挥的「总结一下进展」可靠得多,值得直接抄进自己的提示词模板。

第三,摘要自洽性应该是评估维度。 大多数团队评估 Agent 时只看任务成功率和 token 消耗,论文的案例研究揭示了第三个维度:摘要内容与后续动作是否自洽。SFT 模型能写出信息覆盖率很高的摘要,却提出与摘要矛盾的下一步动作——这种「总结写得漂亮但不用」的失败模式,值得加进你的回归测试集。

与本周生态的呼应

把这篇论文放进本周的语境看会更有味道:Pi Durable 刚刚把「压缩在后台异步进行、对话不阻塞」做成了框架特性;DeepSeek Harness 把执行轨迹的排查做成了产品功能;而 AutoCompact 回答的是更上游的问题——压缩的决策本身应该长在哪。

三者的分工正在清晰化:框架层负责压缩的机制(什么时候存检查点、怎么不丢消息),模型层负责压缩的判断(这个阶段该不该清、清什么)。短期内两层共存,长期看 AutoCompact 这类研究会把越来越多的 harness 决策内化进权重——这正是 harness 演化曲线的下一个拐点。

局限与工程意义

局限方面:RL 只在 32K token 序列上训练,短于评估时的 256K 窗口;研究绑定单一脚手架;作者明确建议与 Codex、Claude Code 等现有长度触发压缩机制结合而非替代。

对构建 Agent 产品的团队,这篇论文的价值在于三个可以直接抄走的结论:第一,提示词诱发不出主动压缩,基础模型几乎不会在溢出前调用压缩,这必须靠训练引入;第二,压缩时机应绑定任务阶段(定位完成之后、动手实现之前是最佳窗口),而不是上下文水位;第三,二元任务奖励足以塑造出高质量的压缩行为,不需要为压缩单独设计奖励——这对所有「想教会 Agent 某种元行为」的团队都是可复用的范式。

Frequently asked questions

为什么长度触发的自动压缩不够用?
长度触发有两个结构性缺陷:过时的探索会一直累积到阈值才被清理,浪费了大量预算;而且压缩可能发生在证据仍在使用的未完成阶段中途,把还在需要的内容剪掉。论文实验显示固定长度压缩的通过率甚至比不压缩的完整历史基线还低。
judge 在线纠正和普通的离线标注有什么区别?
普通离线标注是事后给轨迹打标签,错误的压缩决策仍然被执行过,后续轨迹建立在坏状态上。AutoCompact 的做法是在执行前替换有缺陷的决策,让环境从纠正后的状态继续跑,每条轨迹都是自洽的。消融显示同等数据量下在线纠正比离线插入多出约 1.2 到 1.6 个点。
RL 为什么不需要压缩专用奖励也能改善压缩?
因为二元任务成功奖励会通过整条轨迹向后传递:压缩摘要写得好,后续动作才可能成功,任务才可能通过。GRPO 组内对比天然放大了这种差异。训练后主动调用压缩的任务比例从 44.3% 升到 58.5%,摘要遗漏关键状态的比例从 3.1% 降到 0.2%。
这套方法能直接用到 Codex 或 Claude Code 上吗?
不能直接搬,因为训练绑定特定的 REPL 脚手架和开源模型。但论文明确建议了融合方向:把学习到的主动压缩与现有工具的长度触发回退压缩结合使用,前者在预算内挑时机省 token,后者兜底防溢出。实验也验证了两者叠加时增益依然成立。
这项研究对普通开发者最大的启发是什么?
压缩不只是省钱的手段,更是质量问题:过时的假设、失败的尝试、冗长的工具输出留在上下文里会持续干扰模型。即使 256K 窗口装得下全部历史,主动压缩仍能带来收益。给 Agent 配置上下文管理策略时,应该按任务阶段清理而不是按长度清理。
// next.txt ›

Some outbound links in this post are affiliate links — see disclosure.