CliffCompaction: Cost-Efficient Compaction for Long-Horizon Coding Agents
在解决长程 coding agent 的上下文会涨到几百万 token,如何压缩上下文,既不丢关键信息、又不让每一步都重新 prefill 而烧钱。
结论机制可信、值得抄,但 headline 数字普遍被说大了:省钱扎实,「性能不降反升」在种子噪声内,「匹配 Opus 4.7」「超专用方法 25%」都是跨 harness / 跨模型比较。
AgentInference
发表2026-09-22 · arXiv 2609.26779 · 代码
精读于2026-09-23
可信度机制 高 / 成本 中高 / 性能提升 低-中
阅读范围Full LaTeX source, all 22 files incl. appendix and tables, read end to end; figures via captions only. Cross-checked by an independent Gemini 3.1 Pro full read.
精读Claude(Gemini 3.1 Pro 交叉核对 / cross-checked)
1. 一句话结论
机制可信、值得抄,但 headline 数字普遍被说大了。 核心贡献是一个很简单的规则:上下文涨到阈值才压缩,压缩只截断/丢弃、不改写,且每次丢掉上一次的压缩块。成本下降(cache read 省 80%)是扎实的;「性能不降反升」在 Terminal-Bench 上落在种子噪声内;「匹配 Opus 4.7」「超专用方法 25%」都是跨 harness / 跨模型的比较。可信度:机制 高 / 成本 中高 / 性能提升 低-中。
2. 核心机制 + mental model
触发:LLM() 抛 ContextWindowExceeded 时才做(Alg. 1)。压缩时对旧轮次逐条处理:
- system prompt + 第一条 user(任务描述)原样保留
- 最近 K 轮原样保留
- 更早的轮次:
- assistant thinking 截到 300 字符
- tool call 缩成签名(工具名 + 路径等关键参数,≤150 字符;写文件时内联的文件内容删掉)
- tool result ≤500 字符保留,>500 字符整条删除
- 上一次的压缩块直接丢弃,不嵌套进新压缩块
- 新上下文 = [system, task, 本次压缩块] + 最近 K 轮
Mental model(论文证据 + 我的推断):
- 成本侧:agent 的账单大头是 cache read(未压缩时占 78%,Terminal-Bench/GLM 5.1),因为每一步都要重读整个前缀。只在「悬崖」处改一次前缀 → 中间整段保持 prefix cache 命中;sliding window 和 microcompaction 几乎每步都改前缀,cache 反复失效。所以「什么时候压」比「压成什么」更决定成本。
- 质量侧:删掉的东西留下明显的空洞(签名还在、结果没了),agent 知道自己不知道,会重新
cat文件拿到真值;LLM 摘要留下的是看似完整的转述,agent 以为自己都知道了,不再回源 → 上下文漂移。作者称之为「高 compaction precision、低 recall」。
3. 关键数字核实表
| 摘要/正文说法 | 出处 | 实际条件 | 成立? | 备注 |
|---|---|---|---|---|
| 成本降低最多 50% | Tab. terminal-bench; Tab. real-cost | Kimi K2.6, Terminus-2, 16K: $0.40→$0.19(真实计费 -53%);GLM 5.1 8K 真实 -72% | ✅ | 但 SWE-bench 上 Kimi K2.6 32K 0%、16K -8%、8K +1%(Tab. real-cost)。省多少强烈依赖模型 cache 命中率和 scaffold |
| Terminal-Bench 性能「维持或提升」 | Tab. terminal-bench | Kimi 59.16±3.41 → 61.42±4.25(32K/16K) | ⚠️ 噪声内 | 89 题,差 2.26 点 ≈ 2 题;两边 std 3–4 点。种子数未报告。更实在的对比是同 16K 下对 Terminus-2 原生摘要:55.45→61.42 |
| cache read 省 90% | 引言 | 效率节只报了 80%($0.427→$0.087/task,GLM 5.1 TB) | ⚠️ | 引言的 90% 在正文没找到对应数字 |
| 3 次 rollout +10.5 点、成本 1.9× | Tab. terminalbench-scaling | Kimi 16K + SGV 选择器, k=3: 69.7 vs 单次全上下文 59.2 | ✅ 数字对得上 | 10.5 点里约 5.7 点来自 Cliff 相对「无压缩 + SGV」(64.0);同样 89 题,单次选择器结果,无置信区间 |
| 匹配 Opus 4.7、超 GPT-5.3 Codex / Opus 4.6 | 同上 | Opus 4.7 的 69.4 取自 system card,非 Terminus-2 harness;GPT-5.3/Opus 4.6 是 Terminus-2 榜单数字、k=1 | ⚠️ | 表 caption 说「超过同 harness 下所有专有 baseline」——Opus 4.7 本就不在同 harness。且是 k=3+选择器 对 k=1;而且 k=3 花 $58.01,比 Opus 4.6 的 $44.53 还贵,「更低成本」对 k=3 只相对 GPT-5.3 Codex($64.63)成立,同时胜过 Opus 4.6 且更便宜的只有 k=2(65.9% / $38.67) |
| KernelBench 200 步 2.23×、400 步 3.58× | Tab. kernel-bench | Kimi K2.7(不是正文 TB/SWE 用的 K2.6),L40S,CUDA,atol=rtol=1e-2 | ✅ | 同一 Kimi K2.6 在 RTX Pro 6000 上只有 1.87×/2.48× |
| 「对齐设置下」超专用方法 25% | 引言 | 25% = 2.23/1.78,即 Kimi K2.7 + Cliff vs GPT-5-mini + AdaExplore | ❌ 不对齐 | 真正同模型(GPT-5-mini)是 2.09 vs 1.78 = +17%;基线全是「原论文报告值」;CUDA-Agent 的 1.80× 是只算正确解的几何均值、H20 硬件 |
| 优于其它压缩法且唯一又好又便宜 | Tab. compaction-cost | KernelBench: Cliff 3.58×/$8.32 vs 摘要 3.47×/$8.10;SWE-bench: 四种方法相差 ≤2.6 点,sliding window 最高 | ⚠️ | 摘要法在 KernelBench 上几乎打平且更便宜;这张表换了模型(Kimi K2.7、GLM 5.2),单次运行 |
4. 领域检查发现(Agent 清单 B)
- B1 评测有效性:SWE-bench Verified / Terminal-Bench 2.0 (89 题) / KernelBench L3 (50 题) 都是执行判定,OK。
- B2 稳定性:有 ± std 但种子数未报告;TB 上的「提升」在 std 内。Claude Code 实验里 Cliff std 1.41 vs 原生 3.72,这是个值得注意的正面信号(方差更小)。
- B3 控制变量:主表同模型同 scaffold 比较是干净的。但模型版本在不同实验间漂移:TB/SWE 主表 Kimi K2.6/GLM 5.1,压缩法对比表 Kimi K2.7/GLM 5.2,KernelBench Kimi K2.7。与 Claude Code 原生压缩的对比是「按平均峰值上下文 ~45K 对齐」的,合理。
- B4 serving 混杂:成本严重依赖 provider 的 prefix cache 行为(Kimi 命中率 96–98%,GLM 58–91%)。主表 Cost 列是理想化完美缓存估算,真实计费在附录另一张表,两者对不上(如 GLM 5.1 TB 全上下文:主表 $0.54 vs 实付 $0.89)。
- B5 成本:报得很全(真实计费、cache 命中率、wall-clock -23%/-34%),这是论文最扎实的部分。
- B6 泛化:SGV 选择器用另一个模型在同一批 89 题上的 rollout 训练,主结果用 100% 题目训练的版本。附录的「25% 训练题也一样」只部分缓解(评测仍含训练题)。SWE-bench 特征里还有
repo_code(仓库身份)这种先验特征。 - B7 失败分析:有一个好的行为分析——re-read 次数(附录 Fig. extra-steps)支撑了 precision 论点。8K 阈值明显掉点,作者承认。
5. 摘要没说的
- SWE-bench 上 test-time scaling 反而不帮忙:无压缩 Kimi + SGV k=3 = 78.0% @ $284,Cliff 16K k=3 = 76.4% @ $264(附录 Tab. swebench-scaling)。摘要只挑了 Terminal-Bench。
- Kimi 在 SWE-bench 上几乎不省钱(cache 已经 96% 命中,短轨迹)。收益集中在长轨迹 + cache 命中率不理想的场景。
- 只对 medium-to-long horizon 有意义(Limitations 明写)。
- 自托管 vLLM 实测(附录 Tab. glm-flash-time,GLM-4.7-Flash,vLLM,RTX PRO 6000 Blackwell,SWE-bench Verified):LLM 调用总时间 234.2h → 146.0 / 111.6 / 88.9h,即 32K/16K/8K 下 1.60× / 2.10× / 2.62×。但同模型的准确率(Tab. swe-bench)是 43.20 → 43.60 / 41.20 / 30.70——2.62× 是拿 12.5 个点换的,16K 才是划算档。附录只报了加速。
- 主表成本用的是「完美缓存模型」(§A.1):只要 prompt 比上一次长就当作前缀全命中,一旦变短就当作整段失效重算。这对全上下文基线偏乐观(真实 provider 命中率 58–98%),对 Cliff 的重 prefill 偏保守(system+task 前缀其实还能命中)。真实计费在另一张表。
- 成本拆解(Tab. cost-attribution,GLM 5.1 TB):省下的钱几乎全来自 tool results(−61%)和 tool calls(−58%);thoughts 只省 11%,system+task 反而 +22%(重 prefill)。OpenHands 下的签名规则见 Tab. openhands-signatures(command ≤120 字符、old_str ≤60 字符、task_tracker 整条丢弃)。
- LaTeX 源码里被注释掉的旧稿(非正式内容,我的观察):
- 一段被删的 limitation:专有模型轨迹短得多——Opus 4.8 在 TB 2.1 上约 0.5M tokens/22 轮,Kimi K2.7 约 1.7M/35 轮——即收益主要落在开源模型上。这句在正式版里没了。
- 旧版压缩法对比里 baseline 更弱(sliding 2.76×、Anthropic 式 2.71×),并声称两者「按美元算不如不压缩」;正式版 baseline 数字变高(2.86×/3.33×/3.47×),这个说法也删了。
6. 启发(我的推断)
- 「压缩时机」是 inference 成本问题,不只是 agent 设计问题:cache 命中率决定账单。任何改前缀的上下文管理(包括 Claude Code 的 microcompaction)都在跟 prefix cache 打架。这把 agent 和 serving 两条线直接连起来了——值得和 Hot-Cold KV 分层(2609.25782)、PatchKV(2609.26219,编辑中间上下文后修复 KV)放一起看。
- 「留空洞」优于「填转述」:让 agent 清楚知道自己丢了什么、并且有签名能取回,比给它一段看似完整的摘要更可靠。这是一个可迁移的 harness 设计原则,和今天的 DTOC(占位符 + 按需取回)是同一思路。
- 对你自己的 Claude Code 用法:它的 proxy 可以直接挂在 Claude Code 前面。但 Claude 模型轨迹本来就短、cache 命中高,按论文自己被删掉的那段话,收益可能不大——更适合长时间跑的开源模型 agent。
7. 下一步
- 值得读代码(proxy 很小),看 tool-call 签名规则在 Claude Code 的 schema 下具体怎么做。
- 想验证的问题:种子数?TB 上 Cliff vs 全上下文在多少种子下显著?
- 对比阅读:Anthropic context editing (
clear_tool_uses)、DTOC (2609.26121)、PatchKV (2609.26219)。
8. 交叉核对:Gemini 3.1 Pro 独立精读
把全部 22 个源文件(去掉注释掉的旧稿)交给 Gemini 3.1 Pro(经 agy,无工具)独立精读,不给它这份笔记。以下每条都已回原文核实:
- 它补上、我原先漏掉的:k=3 比 Opus 4.6 贵(已并入核实表);我原先未通读的附录部分(wall-clock、签名规则、价格表)。
- 我有、它漏掉的:「对齐设置下 +25%」其实是跨模型比较(它判为成立);Opus 4.7 分数来自 system card、非同 harness;SWE-bench 上 test-time scaling 反而不帮忙;KernelBench 上摘要法与 Cliff 基本打平;自托管加速背后的 8K 掉点。
- 它说过头的:称选择器「在自己的训练数据上评测」。实际上选择器是用另一个模型的轨迹训练的,重叠的是题目而非轨迹——是题目层面的重叠,不是直接的标签泄漏。
- 两边一致的:「cache read 省 90%」在正文找不到(实为 80%);种子数未报告、TB 提升在标准差内;各实验间模型版本漂移;8K 下成本可能不降反升。