清华提出CoACT:Coding Agent总token消耗平均降33%
ICSE 2027|清华提出CoACT:降低Coding Agent 33% Token开销
上下文越长,Coding Agent 每一步调用的开销就越高。能不能在任务照样完成的前提下,把上下文压下来?
Coding Agent 做软件任务时,得反复读代码、改程序、跑测试。每一轮返回的文件内容、搜索结果和日志都会堆在上下文里,下次调用还要整段重新带上。任务越难,上下文越长,每一步处理的 token 越多,花的钱也越多。统计显示,在 SWE-bench Verified 上,这些 observation 占总 token 消耗的 45.7%;在 Terminal-Bench 上最高到 67.8%。
那能不能直接压缩这些 observation?麻烦在于,压缩的时候很难判断删掉的内容后面还会不会用到。
清华大学人工智能学院的团队给出了 CoACT,一种面向 Coding Agent 的 observation 压缩方法。它判断的标准不是压缩结果像不像原文,而是压缩之后 Agent 的下一步动作有没有变化。在 SWE-bench Verified 的 200 个实例、三个 Agent 模型上,CoACT 让总 token 消耗平均少了 33.0%,平均 PASS@1 从 69.0% 升到 71.0%,任务表现和没压缩时接近。这项工作已被 CCF A 类会议 ICSE 2027 直接接收(Top 5%)。
-
论文标题:CoACT: Action-Preserving Observation Compression for Coding Agents
-
论文链接:https://arxiv.org/abs/2607.02911
-
代码地址:https://github.com/THU-Agent/CoACT
一、现有压缩方法的局限
现有做法大体分成两类。一类是直接改写历史:滑动窗口把早先的命令和输出丢掉,AgentDiet 让模型定期回看历史,自行删掉重复或者用不上的内容。可历史一改,原来的 KV Cache 就没办法完整复用,模型得重新预填充改写后的内容——token 是少了,开销却未必跟着降。
另一类是在新的 observation 进入上下文之前就完成压缩。先前历史不动,缓存照常复用。CoACT 走的正是这条对 KV Cache 友好的路线。
沿这条路走,先得把压缩目标定清楚。Agent 是来干活的,压缩效果自然要看任务能不能做完。于是目标就是:任务成功率(PASS@1)与未压缩的 Agent 接近,同时尽量压低总 token 消耗。
这里要两头权衡。删得太狠,Agent 可能丢掉必要信息,任务失败或者反复读取;删得太少,开销又降不下来。
二、核心想法:下一步动作保持(NAP)
最直接的验证方式,是让 Agent 读完压缩结果把任务跑到底。问题是同一份 observation 能有好多种压缩,每种都跑完全程,成本太高;一次任务里压缩次数又多,最终结果究竟由哪一次压缩造成,也说不清楚。
在我们看来,Agent 的执行过程就是一个循环:读输出、执行动作、拿到新输出。假定初始环境一样,环境对相同动作的响应也一样,那么每次压缩之后 Agent 的下一步动作只要不变,环境收到的操作和返回的结果就相同,后续的动作序列乃至最终结果,理论上也不会变。
顺着这个推导,我们提出下一步动作保持(Next-Action Preservation,NAP):任务目标和历史保持一致,分别让 Agent 读压缩前后的 observation,再比对它接下来要做的动作。比如读完一段代码,Agent 原本要去查里面调用的某个函数,换成压缩结果后它还是去查这个函数,这次压缩就算保持了下一步动作。这样一来,每次压缩都能单独检验,不必等任务结束。
三、怎么造训练数据:
基于 NAP 的压缩示范构造
NAP 有了,我们训练了一个轻量压缩器,基座是 Qwen3.5-4B。步骤分几步走:
先由教师模型 Gemini3-Flash 针对同一份 observation 生成 8 份压缩候选;再让 Agent 在原始 observation 下多次采样,得到 8 个参考动作。每份压缩结果引出的动作,逐一与参考动作比对,取最相似的 3 个算平均,得分到 0.6 才算通过。比对不看字符串,而是解析命令的操作类型、目标文件和读取范围——写法不同但读的是同一段代码,会被认成相同操作。
检查通过之后,再从里面挑出更短的版本作为训练示范。要是 8 份候选一个都没过,就把原始 observation 当作目标,让模型学会该保留的时候保留。
四、训练分两步走:先离线引导,再在线对齐
如果只拿未压缩 Agent 的轨迹来造数据,会留下一个隐患。收集数据时,Agent 手里的历史是完整无缺的;可真到了部署阶段,前几步读到的内容已经被压过,它看到的历史跟训练时对不上。
为此,CoACT 分两个阶段推进。第一步先靠离线轨迹做监督微调,拿到一个初始压缩器。第二步把它放进 Agent 的实际运行里,让此前已压缩的历史保留下来,再做一遍动作比较和长度筛选,产出第二批数据。两批数据合到一起,用来训练最终的压缩器。
对照实验里,仅用离线数据训练的压缩器 PASS@1 是 56.0%,比未压缩的 57.0% 略低一点。把第二阶段的在线数据加进来以后,这个数字升到 60.5%,总 token 消耗则大致持平。
五、实验结果:省下三分之一,性能没有变
实验在 SWE-bench Verified 上随机抽了 200 个实例。三个模型都出现了 token 消耗下降:Qwen3.5-35B-A3B 从 3.795M 降到 2.428M,Deepseek-v4-Pro 从 1.068M 降到 0.868M,Gemini3-Flash 从 0.685M 降到 0.422M,平均降幅 33.0%。平均 PASS@1 则从 69.0% 变成 71.0%——Qwen 和 Gemini 各自涨了 3.5 和 4.0 个点,Deepseek 掉了 1.5 个点。平均交互步数同步从 56.5 步减到 51.2 步。
压缩之后,冗长臃肿的 observation 数量下降得很明显。以 Qwen3.5-35B-A3B 为例,长度超过 1K token 的 observation 占比由 32.3% 跌到 9.4%。
拿它跟现有的 observation 压缩方案一比,结果更有看头。还是看 Qwen:LLMLingua-2 压完之后,PASS@1 从 57.0% 掉到 50.0%,总 token 却从 3.795M 升到 10.329M;SWE-Pruner 升到 4.471M;LongCodeZip 降到 3.165M;CoACT 则是 2.428M,PASS@1 为 60.5%。换到 Deepseek 上,三种基线的总 token 都高过未压缩时的 1.068M,CoACT 反而压到 0.868M,在两个评测模型上都是总 token 最低的方法。可见光盯着把 observation 缩短,并不等于整个任务的开销就会跟着降下来。
作为单步压缩方法,CoACT 也能跟历史压缩方法搭配使用。光用 AgentDiet 时,总 token 是少了,估算总费用却从没压缩的 41.26 美元爬到 45.65 美元,问题出在改写历史影响了 KV Cache 复用。在 AgentDiet 流程里先接上 CoACT,估算总费用回落到 25.88 美元,任务成功率相差不大,比单用 AgentDiet 省了约 43.3%。
作者介绍
这项研究出自清华大学人工智能学院 AI Agent 课题组。通讯作者是清华大学人工智能学院助理教授李佳,主要研究方向为 AI + 软件、可信智能体;第一作者陈浩瑞为清华大学人工智能学院 2027 级直博生(拟入学),主攻 Efficient AI。