编程 上下文压缩只有两个真问题:何时触发,以及丢掉的内容能否按 ID 精确取回

2026-09-11 00:05:58

上下文压缩只有两个真问题:何时触发,以及丢掉的内容能否按 ID 精确取回

长时 agent 的轨迹是累积型的:reasoning traces、actions、tool observations 一轮轮叠上去,最终必然撞上固定 context window。现有做法无非丢弃、摘要、检索,共同点是压缩之后那段信息就不再可寻址——要么细节被删,要么只能靠相似度碰运气捞回来。下面几篇工作分别从归档结构、触发时机、理论下界三个方向切这个问题。

问题:阈值触发与不对称代价

SelfCompact(代码:tianjianl/selfcompact)把现有 scaffold 的毛病说得很直接:固定 token 阈值触发 compaction,不看 trajectory 结构。它可能在一次推导中途或一次搜索中途开火,把模型接着要用的中间结果压掉。

这个代价是不对称的。时机好,丢的是 stale work;时机差,丢的是模型下一步必需的输入。阈值本身不携带任何关于「子任务是否已解决」「轨迹是否收敛」的信息,所以它无法区分这两者。

ARC 从另一个方向提问题:靠丢弃、摘要、检索旧信息,可能删掉任务关键细节,或者删掉之后无法可靠恢复。注意后半句——「无法可靠恢复」和「删掉」是两个独立故障。

机制一:ARC 把归档存储与活跃呈现拆开

ARC 的核心动作是解耦:tool observations 写进 append-only、ID 可寻址的 log,压缩时用一个 compact citation 替换旧 observation。agent 之后拿这些 id 请求原始内容,不需要重跑对应的工具,也不依赖相似度检索。

active view 被切成 5 个部分,各有固定 token 预算:immutable task prefix、deterministic summary、recent suffix、一页 external citation catalog、recalled content。约束是 K ≤ L,其中 L = 上下文上限 − 最大 completion 预留,每次模型调用前强制检查。

恢复路径上有个明确禁令:绝不用 head–tail 截断来恢复大 observation,因为那会不可逆地丢掉中间 token。替代方案是用不超过 q 个 payload token 的非重叠 recall chunks 精确重建,⌈|O|/q⌉ 次取完。结果是系统级 observation-lossless,且 active view 无论跑多少轮都保持均匀有界。

评估设置:Qwen3-8B/16k、Qwen3-32B/32k,completion cap 4096。Needle-in-a-Haystack 精确答案 99.40%,最好基线 88.12%;LongBench-v2 Hard 29.97% 对 28.25%。在硬件成本模型下,估计的 serving time 和 HBM 流量都下降——这一点值得注意,因为「无损」通常被默认要拿吞吐换。

机制二:SelfCompact 让模型自己决定何时压

SelfCompact 不换存储结构,换的是触发者。两个推理期要素:

  • 模型可调的 compaction tool,负责做摘要;
  • 轻量 rubric,规定何时 fire(子任务已解决、轨迹收敛),何时 suppress(推导中、卡住)。

两者缺一不可,消融结果很清楚:只给工具,开源权重模型调用时机不均匀,常在不该调的时候调,或者根本不调;只有 rubric,又没有执行动作的手段。rubric judge 和 summarizer 是同一个模型,无微调、无外部监督。

数字:6 个 benchmark、7 个模型,每问成本比固定间隔摘要低 30–70%;相比不压缩基线,数学上最高 +18.1 点,agentic search +5–9 点。

论文把这归为「元认知缺口」:未被提示的模型无法可靠判断自己的上下文是否在腐烂。轻量 rubric 补上这一层,等于把「何时压缩」从模型固有能力变成 scaffold 可以提供的能力。这是个有用的定位——它解释了为什么单纯给更强的模型并不能自动解决触发时机问题。

机制三:ACM 的两个工具

ACM(代码:lixiaochuan2020/agentic-context-management)模仿人脑短期/长期记忆交互,只加两个工具:

  • manage_context:把之前轮次压成简洁摘要,并把原始消息 offload 到磁盘外部文件;
  • query_memory:按 id 查询存储的原始消息,精确取回。

每次摘要分配唯一 id,映射到外部记忆里的原始消息。两个性质:压缩无损——被丢弃的消息留在外部存储,agent 随时可回看,工作上下文保持短而干净;压缩由 agent 主动发起,而非固定调度或外部触发,能跟随推理状态与任务进度,同时缓解 peak token 压力。

ACM 和 ARC 在「可寻址」上思路一致,差别在 ACM 把 offload 目标放在磁盘文件、接口收敛成两个工具,ARC 则在 active view 里显式留出 citation catalog 和固定预算分区。

边界一:固定阈值,还是模型自决

阈值触发的问题是结构盲,模型自决的问题是模型不自知。SelfCompact 的答案是加一层 rubric 做桥,代价是引入一个判定环节和它自身的误判率。ACM 选择让 agent 主动调用,把决定权放到轨迹里,但这也意味着压缩频率取决于 agent 的策略质量。

ARC 走的是第三条路:不改变触发者,改变压缩后的可恢复性。触发时机依然可以粗糙,因为压错了还能按 id 取回来。这提示两件事不必捆在一起——触发策略和回收机制可以分别优化。

边界二:有损摘要,还是可寻址无损

摘要的本质是有损。ARC 的 observation-lossless 是把无损性限定在 tool observation 上,用 append-only log + 精确 chunk 重建保证;摘要仍然存在,但只出现在 deterministic summary 这一格里。ACM 同理,摘要用于工作上下文,原文留在外部存储。

纯摘要方案的问题在 TRACE(代码:nokia-applied-research/Trace)里有具体表现:recurrent context compression 会削弱最近交互的影响,导致 blocked actions、重复探索、跨 run 不稳定。

TRACE 的测量方式值得借用:在每个 compaction 边界做 paired closed-loop continuation,同一环境状态下比较压缩前后的行为,测出压缩额外引入的 blocked/重复探索,然后只优化自然语言压缩模板,模型全部冻结。

它和 Acon(代码:microsoft/acon)的差别在反馈粒度:Acon 用「全上下文成功、压缩后失败」的轨迹级反馈,无法把压缩导致的错误与 agent 固有波动分开;TRACE 在边界处局部评估,噪声更小。Acon 的路线是在自然语言空间迭代改 compressor prompt,不动模型参数,因此对 API 模型可用,再蒸馏到小模型。在 AppWorld / OfficeBench / Multi-objective QA 上 peak token 降 26–54%,任务成功率提升,让小模型当长时 agent 最高 +46%。

边界三:选择与生成,差一个 Θ(log n)

Context Compaction Theory 把 compaction 形式化成两个游戏:Context Selection Game,从已有内容里选子集保留;Context Generation Game,用有界长度的消息做摘要。结论是生成游戏等价于单向通信复杂度,选择游戏对应受限协议类,且在存在查询集上生成比选择省 Θ(log n) 预算。

文中给了一个具体对照:Anthropic 的 context compaction endpoint 在 set membership 查询上,错误率明显高于同尺寸 Bloom filter。

这条界不是工程建议,但它划出了摘要类方案的预算上限——省 Θ(log n) 是渐近意义上的,落到具体查询分布上会不会兑现,取决于查询集是不是那类「存在查询」。用 Bloom filter 做对照也提示:当查询可以结构化表达时,表达能力更强的自然语言摘要反而可能不如专门的位数组结构。

失败分类

Survey: Context Compression for LLM Agents 把失败分成三类:F1 压缩前决策错误、F2 压缩中信息丢失、F3 压缩后访问失败。论文合集在 YerbaPage/Awesome-Context-Compression

这三类和上面的机制一一对得上:F1 对应阈值触发和 rubric 判定,F2 对应摘要模板的质量(Acon/TRACE 的优化目标),F3 对应有没有 append-only 可寻址 log 和按 id 取回的通道(ARC/ACM 的前提)。ARC 那组数字——99.40% 对 88.12%、29.97% 对 28.25%——说明 F3 修好之后,剩下的差距主要落在 F2 上。

推荐文章

程序员茄子在线接单