摘要
本文解读ISSTA 2026论文《AttnCompress: Dynamic Attention-Guided Trajectory Compression for Software Engineering Agents》。该论文提出AttnCompress,一个免训练的软件工程 Agent 轨迹压缩中间件,通过融合PPL 尖峰结构分块、代理模型注意力打分与滚动窗口动态维护三种机制,在不改动后端大模型的前提下压缩长程交互历史,其特别之处在于把「保留什么」从固定规则变成由小模型注意力实时给出的相关性打分。实验表明在 SWE-bench Verified 上取得压缩方法中最高的 53.17% 通过率,同时把输入 token 降低 21.6%、总成本降低 33.6%,并在七种编程语言与五个代理模型上保持稳定,为长程代码 Agent 的上下文管理与成本控制提供了重要借鉴。
视频讲解:点击观看 B 站视频
- 摘要
- 论文基本信息
- 背景与动机
- 研究主线:从问题到结论
- 基准/方法设计
- 分类全景
- 方法细节
- 实验设计与结果
- 结果对比总结
- 关键发现
- 局限性
- 常见问题(FAQ)
- AttnCompress 需要训练或微调吗?
- 为什么不直接用大模型摘要历史?
- 压缩会不会把 Agent 需要的代码切碎?
- 代理模型换成别的模型还有效吗?
- 压缩率设成多少合适?
- 参考链接
论文基本信息
| 项目 | 内容 |
|---|---|
| 标题(英文) | AttnCompress: Dynamic Attention-Guided Trajectory Compression for Software Engineering Agents |
| 标题(中文) | Agent 轨迹太长怎么办:用代理模型的注意力做动态上下文压缩 |
| 作者 | Zhengran Zeng, Yixin Li, Rui Xie, Wei Ye, Shikun Zhang |
| 机构 | 北京大学软件工程国家工程研究中心 / 知识计算实验室(KCL) |
| 会议 | ISSTA 2026(PACMSE Vol.3, ISSTA058) |
| arXiv | 2609.08318 |
| 论文 DOI | 10.1145/3832149 |
背景与动机
自主软件工程(ASE)Agent 以 ReAct 循环解题:给定 GitHub issue,模型先产生思考与动作,环境执行后返回观测,如此往复直到通过测试。问题在于这条轨迹会迅速变长——论文统计显示,交互轨迹里观测(Observation)token 占用 62.6%,远高于动作的 24.8%、思考的 8.6% 与任务输入的 4%。观测之所以膨胀,是因为工具输出动辄包含整份文件内容、完整日志与错误栈,而这些内容里真正与当前 bug 相关的往往只有几十行。
已有上下文压缩方法大致分三类,各自解决了一半问题:
- 启发式掩码:
ObsMask直接丢弃较旧的观测输出,SlidingWindow只保留固定 token 预算内的最近内容。它们便宜、快,但假设「旧信息一定不重要」,删除不可回滚。 - 选择式压缩:
LLMLingua-2用一个小分类器在 token 级别判断去留,RECOMP、Provence一类需要训练专门的打分模块。它们精度尚可,但 token 粒度的删除会破坏代码语法与 JSON 日志结构,训练依赖也削弱了即插即用性。 - 摘要式压缩:
LLMSummary与前一任 SOTAAgentDiet用另一个大模型把历史重写成更短的文本。它们保留高层语义,但改写会抹掉精确的路径、行号与变量名,甚至引入幻觉,而且每步都调用大模型会带来明显的延迟与成本。
论文进一步指出两个具体的失败模式,并用真实数据把它们钉死。其一是粒度失配:在django-11133实例中,Agent 读取response.py得到七百多行输出,其中真正有用的只有make_bytes方法约十五行;消息级剪裁会保留整段噪声,token 级剪裁则会把函数与 JSON 结构切碎。其二是调试焦点漂移:Agent 在第 1 至 10 轮全仓浏览,第 11 至 20 轮把注意力转向auth_service.py,直到第 21 轮才发现根因是被剪掉的utils.py里一个错误的正则表达式——静态压缩已经把这条线索永久删除。作者随机抽取 100 条摘要式轨迹,用 LLM 辅助审计加人工复核,发现其中40 条存在焦点漂移问题。
这两张图把上述挑战画成了具体的时间线:一张显示大段输出里只有一小段函数是有效信息,另一张显示调试焦点如何在多个文件之间迁移,而静态压缩会在迁移过程中丢弃后来才变关键的证据。
图 1:粒度失配(Granularity Mismatch)——一次文件读取吐出的大部分内容都是低信息量噪声,只有 make_bytes 一小段有用。
图 2:焦点漂移(Focus Shifting)——Agent 的调试焦点在多个文件间迁移,静态压缩会永久丢弃 utils.py 中后来才关键的线索。
ReAct 工作流的完整闭环与轨迹 token 构成如下:观测是上下文膨胀的主因,因此压缩的收益几乎全部来自对工具输出的处理。
图 3:ReAct Agent 工作流(左)与轨迹 token 分布(右),Observation 占 62.6%,是上下文膨胀的主因。
研究主线:从问题到结论
图 7:研究主线——从轨迹爆上下文的问题,到静态压缩不可回滚的动机、PPL 分块与注意力打分设计,再到 SWE-bench Verified 53.17% 的结论。
基准/方法设计
AttnCompress 的定位是一个插在轨迹管理器与后端大模型之间的中间件,不需要训练、不修改 Agent 的任何参数。给定原始轨迹 $T={(a_1,o_1),\dots,(a_t,o_t)}$,其中 $a_t$ 是 Agent 的动作、$o_t$ 是环境观测,目标是实时维护一份压缩轨迹 $T'$,使 $|T'| \ll |T|$ 的同时尽量保留与当前推理步 $s_t$ 相关的语义信息。
三段流水线各解决一个具体问题:
- 结构感知分块:解决粒度失配。用一个小的代理模型监测工具输出的困惑度波动,在语义边界处切分,得到语义连贯的「块」,而不是按 token 硬切。
- 代理注意力打分:解决「保留什么」。把当前上下文、新观测与一个生成起始 token 拼接后前向一次,取注意力权重作为历史块与当前需求的相关性度量。
- 动态滚动维护:解决不可回滚。历史被拆成长时归档、短时缓冲与最近若干轮三段,短时区每轮重估,缓冲满时触发全局刷新,被丢弃的深历史有机会复活。
效率上的关键设计是:困惑度分块与注意力打分来自同一次前向,长时归档文本保持不变,因此可以最大化前缀缓存命中率——这直接决定了压缩开销能否被接受。
分类全景
图 8:上下文压缩方法分类——启发式掩码(ObsMask / SlidingWindow)、选择式压缩(LLMLingua-2 / RECOMP)、摘要式压缩(LLMSummary / AgentDiet)与注意力引导的动态压缩(AttnCompress)。
方法细节
阶段一:PPL 尖峰结构分块。对工具输出按行计算困惑度 $PPL(l_i)=\exp\left(-\frac{1}{|l_i|}\sum_{x\in l_i}\log P(x \mid x_{ \tau$ 处即切分为边界,长度仅一行的小块并入前一块。这样切出的块在语法与语义上相对自洽,避免了把函数体或 JSON 对象从中间劈开。
阶段二:代理注意力打分与贪心选择。对每个候选块计算 $Score(b_i)=\frac{1}{|b_i|}\sum_{t\in b_i}A(q_{gen},t)$,即生成起始 token $q_{gen}$ 投射到块内所有 token 的平均注意力。给定压缩率 $\rho$,token 预算为 $L_{budget}=\rho\sum_i |b_i|$;把所有块按分数降序排序后贪心填入,直到用满预算,未选中的块直接丢弃。这里有一个容易被忽略的设计点:打分用的不是「当前思考」的文本,而是生成起始 token 的注意力,因为在因果语言模型里,只有必须回看前文才能生成的 token,才无偏地代表「下一步要看什么」。
阶段三:三段式滚动窗口与全局刷新。上下文被切分为三类:最近 $k$ 轮保持原始(保证文件名、行号等可执行细节不丢),中间的短时缓冲每轮重估重压,最早的区间作为固定归档。缓冲未满时执行增量更新,只重压短时区,长时区文本不变;当短时缓冲累计超过 $M$ 轮时触发全局刷新,把长时归档与短时缓冲合并做一次全局选择,于是先前被丢弃的深历史可以重新被召回,代价是前缀缓存失效,因此低频执行。
图 4:AttnCompress 框架总览——拦截原始轨迹,做结构感知分块,用代理模型注意力打分,再用滚动窗口动态维护压缩上下文。
实现上,代理模型选用Qwen3-4B-Instruct:参数小、开销低,同时对代码语法与上下文有足够理解力。默认超参为尾部轮数 $k=2$、压缩率 $\rho=0.2$、分块阈值 $-2$、注意力层取最后一层、滚动窗口 $M=10$,这些取值由 100 例验证集上的预实验确定。
实验设计与结果
评测用两个互补基准。SWE-bench Verified包含 500 例人工验证任务,论文沿用 AgentDiet 的实例划分:100 例作为验证集用于调参与消融,200 例测试集严格保留给主对比与代理模型泛化实验。Multi-SWE-bench-Flash包含 300 例、覆盖 Rust、TypeScript、JavaScript、Java、Go、C、C++ 七种语言,多数任务需要先修环境构建错误。所有方法统一集成在Trae-Agent框架内比较,尾部轮数对齐为 $k=2$,摘要类基线使用与 Agent 相同的 LLM 骨干,成本按真实的前缀缓存折扣计算。
主对比结果(三种后端 LLM 的均值)如下:
| 方法 | Pass (%) | Input (k) | 总成本 ($) | Step |
|---|---|---|---|---|
| Original(全上下文) | 55.17 | 1118.16 | 0.1189 | 45.93 |
| ObsMask | 47.17 | 628.93 | 0.0443 | 63.47 |
| SlidingWindow | 49.83 | 588.06 | 0.0968 | 51.21 |
| LLMSummary | 50.83 | 810.52 | 0.1126 | 52.54 |
| AgentDiet | 51.17 | 822.44 | 0.1429 | 48.12 |
| AttnCompress | 53.17 | 644.66 | 0.0949 | 52.43 |
消融实验把三条组件的贡献排序得很干净:
| 变体 | Pass (%) | Input (k) | 总成本 ($) | Step |
|---|---|---|---|---|
| AttnCompress(完整) | 42.0 | 547.27 | 0.0557 | 45.89 |
| 去掉 PPL(token 级剪裁) | 39.0 | 622.37 | 0.0635 | 50.48 |
| 去掉注意力(随机选块) | 35.0 | 566.81 | 0.0567 | 47.38 |
| 去掉滚动窗口(固定压缩) | 37.0 | 514.36 | 0.0619 | 48.44 |
跨语言泛化(Multi-SWE-bench-Flash,七种语言):
| 方法 | Pass (%) | Input (k) | 总成本 ($) | Step |
|---|---|---|---|---|
| Original | 20.33 | 1629.38 | 0.1057 | 52.83 |
| ObsMask | 15.72 | 719.77 | 0.0376 | 72.05 |
| AgentDiet | 18.33 | 1014.70 | 0.1132 | 58.45 |
| AttnCompress | 19.67 | 879.77 | 0.0826 | 62.38 |
超参敏感性方面,尾部轮数从 2 加到 10 可把通过率提到 44.0%,但成本从 0.0557 涨到 0.0821 美元;压缩率提到 0.3 时通过率微升至 43.0%,降到 0.1 则掉到 40.0%;分块阈值越小(切得越细)越好,$-2$ 与 $0$ 都能拿到 42.0%,粗粒度 $2$ 掉到 39.0%;注意力层位从首层到末层结果接近(41.0% / 43.0% / 42.0%),说明相关性信号对层不敏感;窗口从 2 加到 10 把通过率从 35.0% 提到 42.0%,而对 token 开销影响很小,因为窗口内的内容本身已经压缩过。
延迟拆解显示,AttnCompress 平均端到端耗时 366.7 秒,其中压缩只占 66.6 秒;作为对比,AgentDiet 平均需要 498.5 秒(摘要开销 248.1 秒),而 ObsMask 与 SlidingWindow 分别只要 303.6 秒与 284.7 秒,但通过率明显更低。AttnCompress 恰好落在「启发式的快」与「摘要式的好」之间。
图 5:端到端延迟拆解——AttnCompress 平均 366.7 秒,比 AgentDiet 的 498.5 秒快 26.4%。
图 6:Multi-SWE-bench-Flash 各语言通过数——AttnCompress 在 Java、Rust、C++ 上与全上下文持平,并优于其他压缩方法。
结果对比总结
图 9:结果对比总结——通过率从 AgentDiet 的 51.17% 提升到 AttnCompress 的 53.17%,同时总成本降低 33.6%。
关键发现
- 压缩方法中通过率最高:AttnCompress 在 SWE-bench Verified 上取得53.17%的平均通过率,高于 AgentDiet 的 51.17%、LLMSummary 的 50.83%、SlidingWindow 的 49.83%、LLMLingua 的 48.67%、ObsMask 的 47.17% 与 Random 的 48.17%,相对前一任 SOTA 提升约 3.9%。
- 效果与成本同时改善:总成本降到0.0949 美元,比 AgentDiet 的 0.1429 美元低33.6%,比全上下文的 0.1189 美元低 20.2%;输入 token 从 822.44k 降到644.66k,降幅 21.6%。
- 三条组件缺一不可且有排序:去掉注意力打分(改成随机选块)通过率掉到 35.0%,损失7.0 个点;去掉滚动窗口掉到 37.0%,损失 5.0 个点;把 PPL 分块换成 token 级剪裁掉到 39.0%,损失 3.0 个点。
- 注意力在过滤噪声而非单纯砍 token:注意力模块把平均步数从 50.48 压回45.89,而 Random 与 LLMLingua 分别要 61.42 与 58.31 步,说明破坏语义连贯会让 Agent 反复做冗余动作。
- 跨语言接近全上下文:在 Multi-SWE-bench-Flash 七种语言上通过率19.67%,对全上下文的 20.33% 达到 96.7% 的相对性能,输入 token 从 1629.38k 降到 879.77k。
- 跨模型族可迁移:把代理模型换成 Qwen3-1.7B/8B、Gemma3-4B、Llama3.2-3B,通过率只在 44.5%–46.5% 之间波动;块级注意力排序与 Qwen3-Coder-30B 的 Spearman 相关系数为 0.56–0.64,前 20% 重叠率稳定在 0.62–0.66。
局限性
- 失败模式仍然存在:作者人工检查失败样例后指出,压缩依然可能删掉「后来才变重要」的信息,例如早期的文件路径、辅助函数或错误信息;一旦后续推理依赖这些被删证据,Agent 可能做出错误决策且无法在剩余步数内恢复。
- 评测面偏窄:主对比与消融都在 SWE-bench Verified 上完成,跨框架只验证了
Trae-Agent一个实现。作者以算力成本解释这一取舍,并强调中间件式设计理论上可迁移,但未给出实测。 - 分块方案是工程简化:论文采用无重叠分块。作者明确写到,在相邻块之间引入重叠区域是可以进一步改善跨边界连贯性的工程改进,但会带来额外超参(如重叠长度),因此留作未来工作。
- 超参仍需定档:尾部轮数、压缩率、分块阈值、注意力层位与窗口大小共五个超参,都是在一百例验证集上选定的,属于成本与性能的折中;论文没有给出跨任务族的自动配置方案。
常见问题(FAQ)
AttnCompress 需要训练或微调吗?
不需要。它是一个免训练的推理期中间件,不增加可训练参数、不改动后端 Agent 的参数,只用一个 4B 级的小代理模型在每一步做一次前向,同时取出困惑度与注意力两类信号。
为什么不直接用大模型摘要历史?
摘要式方法(如 AgentDiet)用另一个 LLM 重写历史,既会把精确的文件路径、行号、变量名抹掉,又会在每一步引入额外的推理开销。论文的测量显示,AgentDiet 的摘要开销平均达 248.1 秒,而 AttnCompress 的压缩开销只有 66.6 秒,端到端总时间也更快。
压缩会不会把 Agent 需要的代码切碎?
这正是 PPL 尖峰分块要解决的问题。它按语义边界切块而不是按 token 切,消融显示:把结构分块换成 token 级剪裁,通过率从 42.0% 掉到 39.0%,平均步数也从 45.89 升到 50.48,说明语法结构确实在起作用。
代理模型换成别的模型还有效吗?
有效。论文在 Qwen3-1.7B/4B/8B、Gemma3-4B 与 Llama3.2-3B 五个代理模型上做了实验,在 Qwen3-Coder-30B 后端上通过率为 43.5%–46.5%,在 Gemini-3-Flash 后端上为 68.5%–72.5%,说明区分信号与噪声的注意力模式在不同模型族之间可以迁移。
压缩率设成多少合适?
论文默认取 $\rho=0.2$。实验显示 0.3 能再涨 1 个点通过率、0.1 会掉 2 个点,而 0.2 在成本与效果之间提供了较好的性价比,也保留了显著的上调空间。
参考链接
- 论文 arXiv 摘要页:https://arxiv.org/abs/2609.08318
- 论文 DOI(ACM PACMSE, ISSTA 2026):https://dl.acm.org/doi/10.1145/3832149
- H2O: Heavy-Hitter Oracle(注意力作为重要性信号的源头工作,NeurIPS 2023):https://arxiv.org/abs/2306.14048
- LongCodeZip(基于困惑度的代码长上下文压缩,本文 PPL 分割依据):https://arxiv.org/abs/2510.00446
- SWE-bench: Can Language Models Resolve Real-world Github Issues?(ICLR 2024):https://arxiv.org/abs/2310.06770
给大家推荐一款自用写文献综述、无虚构文献的 AI:
🌟复旦大学 FudanNLP 团队自研 切问学术
官网:qiewenpaper.com
覆盖3.6 亿篇可溯源真实中英文文献,能自动整合文献观点生成规范综述
还能挖掘研究创新点、复现实验,配合视频教学,新手快速上手文献综述写作
🍀后记🍀
博客的关键词集中在编程、算法、机器人、人工智能、数学等等,持续高质量输出中。
🌸讨论QQ群:白拾的小屋 (750365700)
⭐B站账号:白拾的物理AI组会(活跃于知识区和动画区)
✨GitHub主页:YhbCode000(工程文件)