compaction 与上下文压缩
三种压缩策略的选型逻辑、触发时机,以及 context anxiety 副作用的成因与对策
核心要点:
- compaction = 压缩历史后续跑同一 agent
- 三策略:compaction / context-reset / 全新窗口
- 预压缩把紧急压缩挪到后台,延迟无感
- compaction 有损,丢细粒度数字
- context anxiety:模型临近上限会过早收尾
compaction 是 06-记忆操作生命周期 中 compress 原语 在长任务里的具体工程形态。本文讲它的策略选择、触发机制和副作用。
compaction、context-reset、全新窗口有什么区别?
核心问题:上下文快满了,把历史"压一下"和"开新会话"是一回事吗?
三者机制不同,只有 compaction 是原地压缩续跑[1]。混淆它们会选错策略。
| 策略 | 机制 | 信息损失 | agent 状态 |
|---|---|---|---|
| compaction | 历史被模型压成摘要,同一 agent 以摘要为起点续跑 | 有损,丢细节 | 知道自己被压缩 |
| context-reset | 终止当前会话,用结构化 handoff 文档启动新 agent | 取决于文档设计 | 干净起点 |
| 全新窗口 | 完全空白会话,不传任何历史 | 全部丢失 | 从零开始 |
@tbl-agent-memory-compaction-strategies 上下文满时三种处理策略对比:compaction、context-reset、全新窗口的机制、信息损失与 agent 状态
关键区分:compaction 和 context-reset 都能让工作继续,但前者是"压缩后续跑同一个 agent",后者是"关掉旧 agent、用文档启动新 agent"(handoff 机制详见 04-文件型外置记忆)。全新窗口只适合无需历史的独立子任务。
compaction 怎么触发,丢什么留什么?
核心问题:压缩在什么时候发生,哪些信息能活下来?
默认在输入超过约 150K token 时触发(最低可设 50K),摘要保留高层决策、丢弃细粒度数字[2]。压缩后旧消息被替换为一个 <summary> 内容块,对 agent 透明——它能看到摘要,知道自己经历了压缩。
Anthropic cookbook 的实测对照很直接:
- 存活:高层事实——中位数、关键标识符、百分比。
- 丢失:附录表格的具体数值、效应量、细粒度统计。
陷阱:一个跑数据分析的 agent,压缩后还记得"中位数是 42、用了 A 方案",但忘了附录里每一行的精确数值。如果后续步骤要引用那些精确数,就会出错——所以要把不能丢的精确数据落到文件,而非指望摘要保留。
摘要者就是模型自身,接收完整历史生成结构化摘要,遵循"先最大化召回,再迭代提升精确度"的原则。可传自定义 instructions 保留领域关键信息(如代码变量名、决策链)。这个有损特性正是文件型记忆存在的理由:关键状态写进文件,压缩后能从磁盘重新注入,不随摘要消失。
预压缩怎么把紧急压缩成本降下来?
核心问题:等上下文满了再压缩会卡住任务,能不能提前压?
后台异步预压缩把紧急压缩挪到后台,延迟降到用户无感[2]。这是"超前压缩"思路:不在任务关键时刻临时压。
- 每轮用户交互结束后,后台线程异步压缩历史。
- 对历史上下文用
cache_control加速压缩。 - 主对话触达 token 上限时,最新的后台摘要立即顶替历史,无可感知延迟。
工程上还可以用更廉价的模型(如 Haiku)执行压缩,进一步降本。这条经验可借鉴:把昂贵的同步操作改成廉价的后台预计算,是 agent 工程里反复出现的模式。
什么是 context anxiety,怎么缓解?
核心问题:为什么 agent 接近上下文上限时会"草草收尾"?
context anxiety 指模型临近它认为的上下文上限时过早结束任务[1]。这是 compaction 留下的行为副作用:压缩后模型仍感知到"之前发生了很多",带着这种"已经跑很久"的感觉而提前收工。
Anthropic 的观察很具体:Claude Sonnet 4.5 的 context anxiety 强到"单靠 compaction 不足以支撑长任务",即便压缩续跑仍会过早收尾;对这类模型,context-reset 配 handoff 文档效果更好,因为干净起点消除了焦虑来源。Anthropic 后续更强的模型大幅改善这一行为,可单用 compaction 承载长任务。
这条经验的可借鉴点:记忆策略要随模型能力调整——同一套 harness,在弱模型上需要 context-reset 兜底,在强模型上可以简化为纯 compaction。
Claude Code 的渐进压缩流水线长什么样?
核心问题:生产系统是一次性压缩,还是分级处理?
Claude Code 按成本从低到高分五层惰性降级,而非一刀切[3]。每次模型调用前依次尝试,能用便宜手段就不用贵的。
- Budget Reduction — 裁剪最低优先级上下文。
- Snip — 去除样板和重复模式。
- Microcompact — 对冗长段落内联压缩。
- Context Collapse — 读时投影,非破坏性。
- Auto-Compact — 完整模型摘要,最后手段。
前几层保留细节,后几层以保真度换 token。这种分级让大多数压缩在廉价层完成,只有真正逼近上限时才动用昂贵的完整摘要。
Takeaway
| 知识点 | 核心结论 |
|---|---|
| 三策略区分 | compaction(原地续跑) ≠ context-reset(新 agent + 文档) ≠ 全新窗口 |
| 触发与损失 | 默认 ~150K token 触发;留高层决策,丢细粒度数字 |
| 预压缩 | 后台异步 + cache_control,延迟无感,成本摊到后台 |
| context anxiety | 模型临近上限过早收尾;弱模型需 context-reset,强模型可纯 compaction |
| 渐进压缩 | 五层惰性降级,廉价层优先,完整摘要是最后手段 |
参考资料
- Anthropic. Harness design for long-running application development. 2025. https://www.anthropic.com/engineering/harness-design-long-running-apps
- Anthropic Claude Cookbook. Context engineering: memory, compaction, and tool clearing. 2026. https://platform.claude.com/cookbook/tool-use-context-engineering-context-engineering-tools
- Liu et al. Dive into Claude Code: The Design Space of Today's and Future AI Agent Systems. arXiv:2604.14228, 2026. https://arxiv.org/abs/2604.14228
延伸阅读
- Anthropic. Effective context engineering for AI agents. 2025. https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents
- 04-文件型外置记忆 — compaction 之外的另一条记忆路径