【Claude Code-上下文实测】不要等上下文爆炸:Claude Code 长会话的可控压缩策略指南
非线智能API经验 [Claude Code-上下文实测] 第22篇
摘要
可控压缩策略的目标不是把历史变短,而是在长会话中保住任务状态。Claude Code 这类 coding agent 会不断积累 system prompt、项目上下文、工具定义、文件内容、工具结果、错误日志和历史对话;如果只依赖 auto-compact,压缩触发时机、摘要质量和失败恢复都不可控。
本文给出一套可落地的压缩策略:提前触发、分级保留、结构化摘要、工具结果外置、压缩后检查、用实验验证。核心原则是区分“必须保留原文”的高价值上下文和“可以摘要 / 清理”的低价值上下文,并让每次 compact 都可追踪、可复盘、可恢复。
数据来源:非线智能Nonlinear 官网
适用范围
这套策略适用于:
• 长时间运行的 Claude Code / coding agent 会话。
• 多轮调研、实现、测试、审查任务。
• 工具调用频繁、测试日志较大、MCP 输出较多的项目。
• 需要跨模型路由、prompt cache 或服务端 compaction 的 agent runtime。
它不假设某个固定 auto-compact 阈值,也不把 compaction 当成无损历史存储。
压缩触发策略
不要等上下文接近上限再压缩。建议设置多级触发:
| 触发条件 | 动作 |
|---|---|
| 单次工具输出超过预算 | 进入上下文前摘要 / 分页 |
| live tool window 超过预算 | 清理旧工具结果,保留摘要和 raw_ref |
| 会话进入阶段边界 | 生成阶段摘要 |
| 上下文使用率达到软阈值 | 主动 compact dynamic history |
| cache miss 连续上升 | 检查是否动态内容污染前缀 |
| 子任务完成 | 把子任务结果写入决策账本 |
软阈值要按模型和 provider 校准。一个保守起点是 65% 到 75% 使用率触发主动整理,而不是等到 90% 以上。
内容分级
压缩前,先把上下文分成四类:
| 类别 | 处理方式 | 例子 |
|---|---|---|
| 原文保留 | 不摘要、不改写 | 用户硬约束、权限边界、关键 API 契约 |
| 结构化摘要 | 用固定字段压缩 | 决策、已验证事实、测试状态 |
| 外置引用 | 原文离开上下文,保留 ref/hash | 完整日志、截图、大文件片段 |
| 丢弃 | 不再进入上下文 | 重复日志、已过期探索、无关输出 |
这个分级应由 agent runtime 执行,而不是让模型自由判断所有历史的重要性。
必须保留原文的内容
以下内容不应只靠摘要保留:
| 内容 | 原因 |
|---|---|
| 用户硬约束 | 摘要可能弱化“不要做”的边界 |
| 安全和权限要求 | 错误压缩会导致外部写入或危险命令 |
| 外部 API 契约 | 字段、类型、错误语义不能随意改写 |
| 当前 diff 的关键片段 | 后续修改依赖精确代码 |
| 未闭合工具调用状态 | 关系到协议状态机 |
| 测试失败根因的最小证据 | 修复方向依赖原始断言 |
原文保留不意味着无限保留全文。可以保留最小原文片段,并记录完整原文引用。
可以摘要的内容
适合摘要的内容:
| 内容 | 摘要应保留 |
|---|---|
| 已解决错误日志 | 错误、修复方式、验证状态 |
| 重复测试输出 | 失败测试名、退出码、关键 stack |
| 探索性讨论 | 最终结论和被排除方案 |
| 长搜索结果 | 命中路径、关键片段、选择理由 |
| 大文件阅读过程 | 读过哪些范围、发现什么 |
| 子代理调研 | 结论、证据等级、引用 |
摘要要区分“已验证事实”和“推测”。很多上下文腐烂来自把早期假设压缩成确定结论。
压缩摘要模板
推荐固定模板:
## Compact Checkpoint
### Current Goal
- ...
### Hard Constraints
- ...
### Verified Facts
- [current] ...
- [stale] ...
### Decisions
- Decision: ...
Rationale: ...
Rejected alternatives: ...
### Code State
- Changed files:
- Critical locations:
- Current diff summary:
### Tool State
- Tests:
- Failed commands:
- Archived outputs:
- Truncated results:
### Open Issues
- ...
### Next Steps
- ...
字段顺序固定有两个好处:人能快速检查遗漏,系统也能用 prefix diff 归因摘要变化。
压缩过程控制
一次可控压缩应包含以下步骤:
1、冻结当前工具状态,确认没有未闭合工具调用。
2、提取用户硬约束和安全边界,作为原文或高优先级字段保留。
3、把大工具结果外置,生成摘要、hash 和 raw_ref。
4、生成结构化 compact checkpoint。
5、检查摘要是否覆盖目标、约束、事实、决策、文件状态、下一步。
6、如果使用 pause_after_compaction,在继续前注入补充状态。
7、记录 compact event:时间、token 前后、触发原因、摘要 hash。
带 tools 的摘要阶段应明确约束:只输出文本摘要,不调用工具。
compact event 记录
每次压缩都应写一条事件:
{
"event_type": "compact",
"event_id": "compact_20260618_001",
"trigger": "context_usage_soft_limit",
"before_tokens": 142000,
"after_tokens": 42000,
"model": "claude-opus-4-7",
"preserved_constraints_hash": "hmac:...",
"summary_hash": "hmac:...",
"archived_artifacts": [
{
"type": "tool_result",
"path": "artifacts/test.log",
"sha256": "..."
}
]
}
这条记录用于复盘:压缩后如果模型遗忘约束,可以追查是摘要遗漏、注入失败,还是后续上下文污染。
验证实验
设计三类任务:
| 任务 | 压缩风险 |
|---|---|
| 调研型 | 来源多,容易丢证据等级 |
| 实现型 | diff 和约束容易丢 |
| 调试型 | 失败根因和日志状态容易混淆 |
对每类任务比较三种策略:
| 策略 | 说明 |
|---|---|
| 无主动压缩 | 只靠 auto-compact |
| 自由摘要 | 让模型自然总结 |
| 结构化可控压缩 | 使用模板、artifact、检查清单 |
记录任务成功率、token 成本、约束遗漏、compact 后恢复轮数、cache 命中变化。
失败模式
| 失败模式 | 触发原因 | 修复策略 |
|---|---|---|
| 摘要丢约束 | 没有硬约束字段 | constraints 原文保留 |
| 压缩后重复工作 | 已排除方案没记录 | decisions 记录 rejected alternatives |
| 根因漂移 | 失败日志摘要过粗 | 保留最小原始断言和 raw_ref |
| 无法复盘 | 只保留摘要 | compact event + artifact store |
| 压缩触发太晚 | 依赖 auto-compact | 软阈值主动压缩 |
| cache 被打碎 | compact 改写稳定前缀 | 只压缩 dynamic history |
工程结论
可控压缩是 agent runtime 的核心能力,不是一次性 prompt 技巧。压缩策略要提前触发、分级保留、结构化摘要、外置原文、记录事件、压缩后检查。真正的目标不是“少 token”,而是让长会话在变短之后仍然能正确继续。
参考链接
• Anthropic Compaction
• Anthropic Cookbook: Automatic context compaction
• Anthropic Cookbook: Context engineering, memory, compaction, and tool clearing
• anthropics/claude-code #28728
• anthropics/claude-code #26220
• Claude Code MCP Docs
• AkitaOnRails: Claude Code source analysis
本文由非线智能API Claude Code 行业专家整理编写