上下文压缩从"到点就砍"到"自己判断":让Agent决定何时给自己做减法
你有没有遇到过这种情况——一个长链推理的 Agent,跑着跑着就开始犯轴。明明前面已经查到了正确答案,绕了几圈之后又把自己绕回了错误结论。或者更典型的:你盯着它一步步推导,眼看就要出结果了,结果系统"啪"地一下触发了上下文压缩,把刚验证好的中间结论给抹掉了,模型只能重新瞎猜。
这事儿在做长程 Agent 的人应该都不陌生。今天聊的这篇论文,恰恰就是冲着这个"砍错时机"的问题去的。
它的核心命题特别朴素:与其用一个固定的 token 阈值机械地触发压缩,不如让模型自己判断当下时机适不适合压。听起来像废话,但真正把它做成一个不需要训练、即插即用的方案,并且在六个 benchmark、七个模型上验证有效——这就不简单了。
核心摘要
长链 Agent 轨迹(一连串思维链 + 工具调用)会不断堆积陈旧内容,这些"垃圾"会锚定后续生成,最终撑爆上下文窗口。现有做法是固定间隔压缩:到了某个 token 阈值就触发摘要。问题在于,这种触发器对轨迹结构一无所知,很可能在模型推导到一半、或搜索进行中的时候动手,把模型还需要的中间结果给砍了。
这篇论文提出 SelfCompact,一个让模型自己决定何时以及如何压缩的脚手架。它把两个推理期组件配在一起:一个模型自己调用的压缩工具,加一个轻量级评判量表(rubric),量表规定了什么时候该压(子任务已解决、轨迹正在收敛)、什么时候别压(推导进行中、卡住了)。两者缺一不可——光给工具,不同开源模型的使用行为参差不齐,要么在没用的时机乱调,要么干脆不调;光有量表,又没有执行手段。合在一起,无需任何微调或外部监督,就能引出有效的自适应压缩。
效果上,数学竞赛任务最高比无压缩基线涨 18.1 个点,Agentic 搜索任务涨 5 到 9 个点,而每道题的 token 成本反而降低 30% 到 70%。论文还点出一个有意思的"元认知缺口":模型自己其实分不清上下文什么时候"烂掉"了,但一段轻量的量表就能补上这个缺口。
论文标题:Self-Compacting Language Model Agents 作者:Tianjian Li, Jingyu Zhang, William Jurayj, Xi Wang, Chuanyang Jin, Mehrdad Farajtabar, Eric Nalisnick, Daniel Khashabi 机构:Johns Hopkins University、Apple arXiv:2606.23525
先说清楚问题:长轨迹的"上下文腐烂"到底有多要命
我们现在让模型啃的问题越来越难、链路越来越长。一道竞赛数学题,Qwen3.5 能产出 8.1 万 token 的思考,Kimi-K2.5 能飙到 9.6 万。Agentic 系统更夸张,编排搜索结果、代码执行输出、中间计划,动辄上百轮。论文里提了个数据:Qwen3-Coder-Next 在 SWE-rebench 上平均每道题消耗 800 万 token、154 轮交互。
"想得越多、交互越多,答案越好"这个赌注确实赢了。但长轨迹有个隐藏成本。
随着轨迹变长,里面会堆积各种垃圾:早期一个判断失误的分类讨论、一个模型早就翻篇的搜索结果、一段走进死胡同的候选程序。这些残留不是静静躺在那儿——它们会锚定后续的所有生成。论文里有句话我觉得说得挺到位:一个从干净起点出发能解出问题的模型,喂回它自己当初那段错误推理之后,往往就崩了。这个现象学界叫 context rot(上下文腐烂)。
现在工业界怎么应对?两种套路,都挺糙的。
一种是响应式(reactive)压缩,等上下文快撑爆 token 预算了才动手,纯粹把压缩当成"防溢出"。问题是等到这会儿,陈旧、错误的 token 已经污染了好多步生成了。
另一种是周期式(periodic)压缩,固定每 k 轮或每 k 个 token 就压一次,不管轨迹里装的是啥。Claude Code 的 /compact、各种学术脚手架、还有 WebExplorer 那种"token 用量超过最大上下文 30% 就触发"的策略,本质都是这一类。
这两种都有个共同的盲区:它们对轨迹此刻的状态一无所知,而且是往相反方向翻车。响应式压得太晚,周期式则不分青红皂白地砍——经常在一个活跃子目标进行到一半时摘要,把模型还要用的信息抹掉了。
这里的代价是不对称的。一次时机恰当的压缩,砍掉的是陈旧工作,赚了;一次时机糟糕的压缩,砍掉的却是模型继续推下去所必需的中间结果,亏大了。
一张图看懂三种策略的差距
论文开篇这张 teaser 图,把问题讲得特别直观。

图1:三种压缩策略在一道 BrowseComp 难题上的对比。这道题要求验证四个事实(Agaricus 属、Bon 在 1983 年命名、Clash 电影 1981 年、Harryhausen),才能拼出最终答案"Medusa mushroom"。Baseline(无压缩)把预算烧在一段没产出的独白上,最后什么答案都没给出。Fixed-interval(固定间隔)每两条搜索轨迹就压一次,完全不看推理状态,结果在推理中途把已验证的事实抹掉了,模型只能瞎猜,给了个错误的"Morel Mushroom"。SelfCompact 则用量表门控压缩,每次都在验证完一个事实之后才动手,四个事实全部保留,模型答对了。
这张图的杀伤力在于:同样是"压缩"这个动作,时机不同,结果天差地别。固定间隔策略不是不想帮忙,它是真的在"帮倒忙"——在模型刚验证完事实、还没来得及用的节点上,一刀切掉。
论文提的研究问题,浓缩成一句话就是:
LM Agent 能不能在不训练的前提下,自己识别出"我的上下文正在腐烂",并据此做压缩?
方法核心:一个工具 + 一段量表,缺一不可
SelfCompact 的设计其实很克制,就两个推理期组件,而且都不动模型参数。
第一个组件:压缩工具(compaction tool)。给模型暴露一个摘要工具 \(\mathcal{S}\),它接收原始问题 \(x\) 和当前(可能只到一半的)轨迹 \(y_{1:t}\),产出一个浓缩版本 \(\tilde{y}\)。之后生成就从新的上下文 \((x, \tilde{y})\) 接着往下走。关键点是——这个摘要器就是模型自己,不需要外部验证器、不需要辅助模型。模型想压缩时就发一个 <summarize> 信号,脚手架执行摘要,然后从压缩后的前缀恢复生成。
第二个组件:量表(rubric)。一段轻量级的判断标准,在周期性的探测点上决定"工具该不该现在开火"。它把"一个子任务已经解决了"、"轨迹没有卡在推导中途"这种模糊直觉,翻译成模型能逐条对着轨迹核验的、可引用证据的具体条件。
为什么两个都得要? 这是全文最有意思的判断之一。
论文做了消融:如果只给工具、让模型自己随心所欲地发 <summarize>,结果在七个开源模型上参差不齐——有的模型反射性地在没用的时机乱压,有的几乎从不调用。光有工具,行为不可控。反过来,光有量表又没用,因为量表本身没有执行能力,它只是个"判断",得有工具去落地这个判断。
合在一起,才能在零微调的情况下引出可靠的自适应压缩。
算法长什么样
把整个流程拆开看,其实是一个很干净的循环:
输入:问题 x;模型 π;探测间隔 N;步数预算 T;量表提示 P_R;摘要提示 P_S
C ← x # 整体上下文及其 KV 缓存
for t = 1 ... T:
y_t ~ π(· | C); C ← C ∘ y_t # 正常生成一步
if y_t 是最终答案: return y_t
if t mod N == 0: # 到探测点了
C ← C ∘ P_R # 附上量表探针(KV 前缀复用)
r_t ~ π(· | C), r_t ∈ {压缩, 继续}
if r_t == 压缩:
C ← C ∘ P_S # 附上摘要提示
ỹ ~ π(· | C) # 生成摘要
C ← x ∘ ỹ # 硬重置,从摘要恢复
else:
pop(C, r_t); pop(C, P_R) # 撤销,轨迹原封不动
return y_T
注意几个工程上的精巧设计:
量表探针和摘要提示都采用追加而非替换的方式。它们以 user 角色消息的形式追加到 \((x, y_{1:t})\) 后面,这样 \(y_{1:t}\) 的 KV 缓存在调用过程中被完整保留——探针只需要为追加的那段指令付 prefill 成本,而不是为整条轨迹重新编码。这是后面成本能降下来的关键。
量表判定撤销得很干净。如果量表判"继续",就把刚追加的判定结果 \(r_t\) 和量表提示 \(P_R\) 都 pop 掉,轨迹回到一字未动的状态。换句话说,量表的"思考"不会污染主轨迹。
量表是任务特定的。数学竞赛的判断条件和 Agentic 搜索的不一样。
数学任务的量表长这样
论文附录给了数学任务的量表原文,值得贴出来感受一下它的"可核验性"设计——每个问题都要求模型从轨迹里引用原文证据,没有证据的回答一律判 N:
- Q1 ANSWER:最新一轮是否给出了具体的最终答案(一个
\boxed{}表达式或"Final Answer: ..."),而不只是部分结果?如果是 Y,逐字引用答案;如果是 N,说明还有什么未知。 - Q2 STUCK:最近两轮是否没增加任何非平凡事实——只是换了说法或放弃了尝试?如果是 Y,点名这两轮并写"无新事实";如果是 N,从最近两轮里点出一个非平凡事实。
- Q3 HAS-NEXT:你能不能写出确切的下一步(分类讨论、代换、验证、待证引理)?如果是 Y,用一个祈使句写出这一步;如果是 N,写"NONE"。
这个设计我挺喜欢的。它没有让模型去做"我现在该不该压缩"这种高度抽象的元认知判断,而是拆成三个具体、可对照原文核验的小问题。模型不擅长直接回答"我的上下文烂了吗",但它能回答"最近两轮我有没有产出新的方程或反例"。把难的元认知问题,降维成几个可核验的事实判断——这是整篇论文最聪明的地方。
实验:数学最高涨18.1个点,搜索成本砍掉一大半
数学竞赛:12个格子里赢了11个
数学这边用了 Qwen 家族四个不同规模的模型(Qwen3-4B-Instruct、Qwen3-30B-A3B-Instruct、Qwen3.5-4B、Qwen3.5-9B),三个 benchmark(IMO-Answerbench、HMMT Nov 2025、HMMT Feb 2026),每题并行采 16 个样本取均值。
公平性这块论文做得比较到位:固定间隔摘要每 16k token 触发一次,并且持续压缩到 token 用量和 SelfCompact 接近,确保两者在同等 token 预算下比。
| 模型 / 方法 | IMOBench | HMMT Nov25 | HMMT Feb26 | Avg. |
|---|---|---|---|---|
| Qwen3-4B-Instruct | ||||
| 无压缩 [16k] | 38.9 | 40.8 | 36.5 | 38.7 |
| 固定间隔 [44k] | 41.4 | 44.0 | 39.2 | 41.5 |
| SelfCompact [48k] | 45.5 | 47.8 | 42.1 | 45.1 |
| Qwen3-30B-A3B | ||||
| 无压缩 [16k] | 45.2 | 54.7 | 51.9 | 50.6 |
| 固定间隔 [26k] | 48.7 | 57.3 | 58.7 | 54.9 |
| SelfCompact [29k] | 52.1 | 59.4 | 57.6 | 56.4 |
| Qwen3.5-9B | ||||
| 无压缩 [16k] | 25.0 | 38.2 | 34.2 | 32.5 |
| 固定间隔 [90k] | 33.4 | 42.1 | 44.9 | 40.1 |
| SelfCompact [93k] | 41.4 | 48.2 | 52.3 | 47.3 |
| Qwen3.5-4B | ||||
| 无压缩 [16k] | 16.9 | 26.4 | 22.5 | 21.9 |
| 固定间隔 [64k] | 27.4 | 35.5 | 29.1 | 30.7 |
| SelfCompact [67k] | 34.1 | 37.4 | 30.0 | 33.8 |
表中括号内是每题平均 token 数。
在 12 个"benchmark × 模型"的格子里,SelfCompact 赢了 11 个。增益最猛的是 thinking 模型:Qwen3.5-9B 上,相比无压缩基线分别涨了 16.4、10.0、18.1 个点。唯一翻车的是 Qwen3-30B-A3B 在 HMMT Feb 上,固定间隔反超了 1.1 个点——但在另外两个 benchmark 上 SelfCompact 还是领先。
说实话,这个 18.1 个点的数字我第一反应是有点怀疑——压缩这种"减法"操作怎么能带来这么大的正向收益?往下看 headroom 分析才明白过来。
一个戳中要害的 headroom 分析
论文追踪了 Qwen3-4B-Instruct 在 IMO-Answerbench 上、12 次固定间隔摘要调用前后的答案变化:
| 答案变化 | 次数 |
|---|---|
| 错 → 对 | 1486 |
| 对 → 错 | 1009 |
也就是说,固定间隔摘要虽然净收益为正,但有 40.4% 的变化是把答案搞坏的。每次到点就砍,砍对了一些,也砍错了一大批。
那如果有个"先知",只在当前答案已经正确时跳过摘要呢?论文做了个 oracle 分析:
| 方法 | 准确率 (%) |
|---|---|
| 无压缩 [16k] | 38.9 |
| 固定间隔 [44k] | 41.4 |
| SelfCompact [48k] | 45.5 |
| Oracle(答案对就跳过)[44k] | 52.9 |
这个 oracle 拿到 52.9%,比固定间隔高 11.5 个点、比基线高 14.0 个点。而且论文特意强调:这个 oracle 只是决定"在每个固定间隔上要不要压",还没动"该在什么时机压"这个更大的自由度。换句话说,自适应策略的天花板比这还高。
这就把 SelfCompact 的动机坐实了:不是压缩本身有问题,是乱压有问题。能避开那 40% 的坏压缩,收益自然就上来了。
Agentic 搜索:又准又省
搜索这边换了三个不同规模、不同家族的部署级 Agent:GLM-4.7-Flash(30B 总参/3B 激活)、MiniMax-M2.5(230B/10B)、Mimo-V2-Flash(309B/15B),跑 BrowseComp、BrowseComp-Plus、DeepSearchQA 三个任务。除了固定间隔,还加了 Delete-all(到 30% 全删)和 Keep-last-N(只留最后 3 轮)两个 baseline。成本用每题美元数衡量。
主表(Overall 列汇总):
| 模型 / 方法 | BrowseComp Acc/Cost | BrowseComp-Plus Acc/Cost | DeepSearchQA Acc/Cost | Overall Acc/Cost |
|---|---|---|---|---|
| GLM-4.7-Flash | ||||
| 无压缩 | 30.1 / 0.14 | 45.6 / 0.12 | 34.2 / 0.13 | 36.6 / 0.13 |
| 固定间隔 | 35.4 / 0.06 | 50.0 / 0.04 | 39.1 / 0.05 | 41.5 / 0.05 |
| Delete-all | 31.6 / 0.03 | 47.3 / 0.02 | 35.8 / 0.03 | 38.2 / 0.03 |
| Keep-last-N | 33.5 / 0.05 | 51.4 / 0.03 | 38.8 / 0.04 | 41.2 / 0.04 |
| SelfCompact | 41.2 / 0.10 | 54.1 / 0.04 | 44.0 / 0.07 | 46.4 / 0.07 |
| MiniMax-M2.5 | ||||
| 无压缩 | 47.2 / 0.19 | 62.0 / 0.19 | 52.0 / 0.19 | 54.6 / 0.19 |
| 固定间隔 | 55.3 / 0.07 | 65.9 / 0.04 | 56.7 / 0.06 | 59.3 / 0.06 |
| Delete-all | 52.7 / 0.05 | 65.0 / 0.03 | 54.9 / 0.04 | 57.5 / 0.04 |
| Keep-last-N | 54.5 / 0.06 | 67.4 / 0.05 | 57.0 / 0.06 | 59.6 / 0.06 |
| SelfCompact | 59.3 / 0.09 | 71.2 / 0.07 | 61.3 / 0.08 | 63.9 / 0.08 |
| Mimo-V2-Flash | ||||
| 无压缩 | 42.7 / 0.27 | 57.6 / 0.24 | 46.5 / 0.25 | 48.9 / 0.25 |
| 固定间隔 | 51.6 / 0.14 | 60.2 / 0.14 | 52.3 / 0.14 | 54.7 / 0.14 |
| Delete-all | 45.5 / 0.08 | 61.2 / 0.11 | 49.7 / 0.09 | 52.1 / 0.09 |
| Keep-last-N | 49.8 / 0.06 | 63.5 / 0.15 | 53.0 / 0.10 | 55.4 / 0.10 |
| SelfCompact | 57.9 / 0.11 | 62.9 / 0.16 | 56.8 / 0.13 | 59.2 / 0.13 |
准确率上 SelfCompact 在三个模型上都是最强。在 BrowseComp-Plus 上相比无压缩分别涨了 +8.5(GLM)、+9.2(MiniMax)、+5.3(Mimo)。准确率排序很稳定:基线 < 固定间隔 ≤ SelfCompact。
成本这块是真的香。尽管每个探测点要多发一次 LLM 调用,SelfCompact 的每题成本反而比无压缩基线还低。BrowseComp-Plus 上每题成本:GLM 从 0.12 降到 0.04(降 67%),MiniMax 从 0.19 降到 0.07(降 63%),Mimo 从 0.24 降到 0.16(降 33%)。
为什么多调一次还更便宜?靠的就是前面说的 KV 缓存复用——量表判定只贡献它自己那段短生成,轨迹的缓存保留着。而大头的节省来自压缩之后的阶段:后续每个 token 都只对着浓缩版 \(\tilde{y}\) 做注意力,而不是对着原始的长轨迹 \(y_{1:t}\)。论文还给了个 break-even 条件:当 \(L/\ell \gt 10\)(原轨迹长度是摘要长度的 10 倍以上)压缩就划算,而搜索场景的摘要器能达到 20 到 80 倍的压缩比。
SelfCompact 压得更早

图2:在 BrowseComp-Plus 上,摘要触发时累积的 token 数分布。上排是固定间隔(30% 上下文阈值,红色虚线),所有触发都被构造性地钉在阈值处。下排是 SelfCompact,触发分布明显向左偏移——量表在轨迹消耗到 30% 之前就已经判定"现在该压了"。
这张图说明了一个反直觉的事实:固定阈值通常触发得太晚了。它要等到上下文用满 30% 才动手,而那时陈旧 token 早就在污染生成了。SelfCompact 的量表在子问题刚解决时就开火,把陈旧内容更早地清掉。
难题上拉得最开

图3:BrowseComp-Plus 上按每题难度分箱的准确率。难度用无压缩基线消耗的总输出 token 数衡量,每个模型分成 5 个等量分位(左易右难)。三种颜色分别是无压缩、固定阈值(30%)、SelfCompact。在简单题上三者差距在采样噪声范围内,但在最难的两个箱上,SelfCompact 比固定阈值 baseline 稳定高出 5 到 20 个百分点。
这个结论很合理:越难的题,搜索越深、上下文堆得越大、腐烂越严重,自适应压缩的价值就越突出。简单题本来就没多少垃圾要清,三种策略自然打平。
消融:量表才是灵魂
前面一直在说"量表很关键",这里有硬数据。去掉量表门控、改成让模型自己每步决定要不要摘要:
| 方法 | BrowseComp | BrowseComp-Plus | DeepSearchQA | Avg. |
|---|---|---|---|---|
| 无压缩 | 30.1 | 45.6 | 34.2 | 36.6 |
| 固定间隔 | 35.4 | 50.0 | 39.1 | 41.5 |
| SelfCompact 去掉量表 | 33.6 | 51.9 | 37.6 | 41.0 |
| SelfCompact 完整 | 41.2 | 54.1 | 44.0 | 46.4 |
去掉量表后,GLM-4.7-Flash 的平均分从 46.4% 塌到 41.0%,掉了 5.4 个点,基本退回到固定间隔的水平(41.5%),在 BrowseComp 上甚至还不如固定间隔(33.6 vs 35.4)。数学任务上同样的故事:Qwen3-4B-Instruct 从 45.5% 掉到 40.9%。
这个消融把论文的核心论点钉死了:收益不来自"触发压缩"这个动作本身,而来自量表门控的核验——它决定了哪些推理状态是安全可保留的。没有量表,模型不受约束的摘要会丢掉后续步骤依赖的信息。
一句话:知道"何时压"还不够,量表才是让保留下来的上下文变得可靠的东西。
我的判断:朴素但扎实,价值在于"训练-free"这三个字
聊聊我对这篇论文的看法。
最值钱的地方,是它把一个看似需要训练的能力,证明可以靠推理期脚手架白嫖。 学界主流的做法是用 SFT 或 RL 把"何时压缩"的决策烤进权重里(论文 Related Work 列了一长串)。SelfCompact 反过来说:等等,现在的工具调用模型已经够强了,你只要给它一段写得好的量表,它就能自己判断。这个发现的工程价值很实在——你不用为每个新模型重新训练一个压缩策略,拿一段 prompt 就能即插即用。
那个"元认知缺口"的提法我觉得是点睛之笔。 模型自己分不清上下文什么时候烂了(光给工具行为参差不齐就是证据),但它能回答"最近两轮有没有新方程"这种可核验的小问题。把抽象的元认知,拆解成具体的事实核验——这个降维思路,我觉得能迁移到很多"让模型做自我判断"的场景里去。
但也有几个我会打问号的地方。
第一,量表是任务特定的,得手工设计。 数学一套、搜索一套,附录里那些 Q1/Q2/Q3 都是精心调过的 prompt。论文自己在 limitation 里也承认了,没做领域无关的通用量表。所以"训练-free"省下的训练成本,一部分转移成了 prompt 工程成本。这笔账能不能划算,取决于你的任务域有多稳定。
第二,只在开源模型上验证了。 论文坦诚地说,GPT-5.5、Claude Opus 4.7、Gemini 3 Pro 这些前沿模型元认知更强,可能不靠量表就能感知上下文腐烂。所以 SelfCompact 的定位其实是"补缺口"——它在部署级开源 Agent 这个元认知偏弱的区间最有用。这个定位很诚实,但也意味着它的适用面会随着模型变强而收窄。
第三,和并发工作的关系。 论文提到 LangChain 在 2026 年 3 月也发了个自主上下文压缩的摘要工具,但没引入量表这种"何时压"的判断标准。还有 ReTrac 那篇用前沿模型做外部摘要器、但仍是固定间隔。SelfCompact 跟它们比,差异点确实就在那段量表上——这是它真正的增量。不算颠覆,但是个干净、有效的增量。
总的来说,这篇论文不属于那种底层突破,它是一个把"自适应压缩时机"这件事想清楚、做扎实的工程性工作。方法朴素到你看完会觉得"对啊就该这么做",但能在七个模型上稳定复现、还顺带把成本砍下来,这就够有说服力了。
如果你也在做长程 Agent
几条可以直接试的启发:
如果你现在用的是固定 token 阈值触发压缩,强烈建议先做个 headroom 分析——统计一下压缩前后答案的"对→错"翻转率。如果这个比例不低(论文里是 40%),那你大概率正在被坏时机的压缩拖累,SelfCompact 这套思路值得一试。
设计量表时,别让模型回答抽象问题("上下文该压了吗"),而是拆成几个能对照轨迹原文核验、必须引用证据的小判断。这是让无训练方案稳定工作的关键。
还有,记得把量表探针和摘要提示做成"追加"而非"替换",保住 KV 缓存——不然多出来的 LLM 调用会把成本优势吃掉。
这类"把上下文管理从被动触发升级成主动决策"的方法,我个人觉得会慢慢成为长程 Agent 脚手架的标配。SelfCompact 给出了一个不用训练的起点,往后接 RL 把量表蒸馏进策略,也是论文自己点的一个很自然的延伸方向。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我