主题色
250
壁纸模式
壁纸设置
特效设置
固定导航栏
字体选择
文章列表布局
2902 字
7 分钟
Claude Code 上下文窗口管理与自动压缩
2026-06-23

Claude Code 的上下文窗口不只装着对话。系统提示词、工具定义、CLAUDE.md、自动记忆、Skill 说明、文件内容和命令输出,都会占用同一窗口。长任务的难点因此不是“对话太多”,而是如何在有限空间里保留目标、决策和当前状态。

Claude Code 在窗口接近容量时会自动压缩历史,也提供 /compact、/context 和 /clear 让用户主动管理。这篇不把某个版本的内部实现当作稳定契约,而是聚焦公开文档保证的行为,以及这些行为对实际工作流的影响。

一、先看上下文装了什么#

一次会话的上下文可以分成四类。它们的加载时机和可控程度不同,优化方法也不同。

类别典型内容增长方式主要管理手段
固定开销系统提示词、内置工具、已启用的 MCP 工具名称会话启动时已存在只启用当前需要的 MCP 服务
持久指令CLAUDE.md、.claude/rules/、自动记忆启动或匹配路径时加载精简全局规则,其余改为按路径加载
可复用能力Skill 说明和已调用的 Skill 内容说明随会话加载,正文按需注入缩短说明,只在必要时调用
任务历史用户消息、模型回复、文件内容、工具输入输出随每轮交互持续增长控制输出量、分派子 Agent、压缩或开新会话

最容易撑大窗口的通常是任务历史,特别是大文件、冗长日志和反复搜索的结果。不过,固定开销也不能忽略:同时连接多个、各自暴露大量工具的 MCP 服务,可能在第一条消息前就占去可观的空间。Claude Code 默认按需加载 MCP 工具的完整 Schema,但在部分第三方提供商或代理配置下可能退回全量加载。

/context 是排查的第一站。它会展示当前窗口的类别分布和优化建议。如果占用主要来自 MCP 工具,手动压缩历史并不会解决根因;如果占用来自一次过大的命令输出,则应先改变命令和读取方式。

二、自动压缩实际做了什么#

公开文档给出的可依赖行为是:当窗口接近容量时,Claude Code 会先清理较早的工具输出,再把较早的会话历史改写成结构化摘要,保留近期交互和关键决策。在 Agent SDK 的消息流中,完成压缩时会出现 compact_boundary 系统消息。

可以把过程理解为下面这条链路。这张图表达公开行为,不对内部函数、阈值或实验特性作保证。

flowchart LR A["对话和工具输出累积"] --> B["窗口接近容量"] B --> C["清理较早的工具输出"] C --> D["总结较早的对话历史"] D --> E["恢复必要的持久上下文"] E --> F["从摘要和近期交互继续"]

压缩减少的是模型当前能直接读到的内容,不等于删除本地会话记录。会话 transcript 仍保存在 ~/.claude/projects/<project>/<session-id>.jsonl 下,也可以通过 /export 导出。但对当前模型而言,压缩前的细节已经变成有损摘要,后续推理不能再依赖逐字原文。

为什么不应固定内部“四级流水线”#

历史版本的构建产物和分析资料里,曾出现 Snip、Micro Compact、Context Collapse、Reactive Compact 等内部名称。这些名称有助于研究某个版本,却不是面向用户的稳定接口:它们可能只存在于内部构建、受实验开关控制,或随版本改名和替换。

对工程使用者来说,更稳定的边界是:窗口将满时会自动压缩,/compact 可以手动压缩,压缩后会按公开规则重新注入指令和少量近期文件。围绕这些边界设计工作流,比依赖内部类名和硬编码阈值更稳妥。

三、压缩后什么会留下#

压缩之后,不同来源的指令处理方式不同。这是长任务中最需要记住的边界。

内容压缩后的行为设计建议
系统提示词和输出样式不属于会话历史,不因压缩而改变无需额外处理
项目根目录 CLAUDE.md 和非路径规则从磁盘重新注入放必须全程生效的约束
自动记忆从磁盘重新注入存稳定的项目事实和经验
带 paths: 的规则再次读取匹配文件时恢复;压缩后重读近期文件也可能连带恢复不要承担跨目录的强制约束
子目录 CLAUDE.md再次读取该目录文件时恢复;压缩后重读近期文件也可能连带恢复用于局部约定
压缩前近期读取或编辑的文件压缩后会自动重读少量近期文件,具体数量以当前版本为准不要把它当作完整状态持久化机制
已调用的 Skill 内容会重新注入,但受单个和总体预算限制把最重要的指令放在 SKILL.md 前部
只在对话中说过的要求只能依赖摘要保留重要约束要落到文件,不要只留在聊天里

这张表解释了一个常见现象:压缩后仍然记得项目根规则,却暂时忘了某个子目录的约定。后者并非丢失,而是需要再次读取匹配路径才会加载。

CLAUDE.md 是指令,不是强制执行的安全策略。“禁止修改生产配置”这类不能被违反的规则,应放进权限规则或 PreToolUse Hook,不应只期待模型在压缩前后都正确理解文本。

四、主动压缩比等系统触发更可控#

日常交互可以用 /autocompact 调整当前会话的自动压缩容量;需要在脚本或网关里统一控制时,再使用环境变量。/compact 也可以带一段聚焦指令。与其只输入 /compact,更好的写法是明确哪些内容必须进入摘要:

/compact 保留当前目标、已修改文件、接口决策、未通过测试及下一步;删除已否定的尝试。

这条指令把摘要从“对话缩写”变成“任务交接”。它尤其适合三个时点:探索结束准备实现、一个里程碑完成后、任务目标发生明显转换时。

如果项目对摘要有长期要求,可以把要求写进项目根目录的 CLAUDE.md。标题名没有特殊语义,关键是说清要保留的信息。下面这段可作为项目级模板:

# Summary instructions
When summarizing this conversation, always preserve:
- The current objective and acceptance criteria
- Files changed and the reason for each change
- Test results and unresolved errors
- Decisions, rejected alternatives, and the next action

这类指令应短而稳定。如果把临时任务细节都写进 CLAUDE.md,它会在每次请求中持续占用窗口,还可能干扰其他任务。

Claude Code 还支持 PreCompact 和 PostCompact Hook。前者可以在压缩前记录或审查状态,后者可以接收生成的摘要并做外部归档。SessionStart 也会在压缩后以 compact 作为来源触发,适合重新注入需要动态获取的环境信息。

五、什么时候应该清空或拆分任务#

压缩不是所有长任务的默认答案。/compact、/clear 和子 Agent 解决的是三类不同问题。

选择适合场景代价
/compact任务目标没变,但历史过长细节被改写成有损摘要
/clear已经切换到无关任务,旧历史只会制造噪声当前窗口重置,需要重新提供任务上下文
子 Agent搜索、广泛阅读、独立审查等支线会产生大量中间过程主会话只得到最终摘要,需要明确交付格式

子 Agent 的价值不只是并行,更是上下文隔离。它不继承父会话的完整消息历史,完成后只把结果返回主会话。把“阅读二十个文件并归纳”交给子 Agent,比让主会话吞下所有文件和搜索输出更节省窗口。

Checkpointing 还提供两种部分总结:“从这里开始总结”和“总结到这里”。当前后阶段仍有某一段原文需要保留时,这比对整段会话做全量压缩更精确。

六、避免压缩失真的工作流#

压缩失真通常不是摘要少了一句话,而是任务状态从未被结构化。一套更稳定的长任务工作流如下:

  1. 开始时把目标、验收条件和不可触碰的边界写清。这些内容决定摘要时的取舍。
  2. 让命令输出可控。先用过滤、分页、统计和针对性搜索,不要一次把整份日志或大文件塞进对话。
  3. 使用计划文件或任务清单记录当前状态。不要让“哪些已完成”只存在模型的对话记忆里。
  4. 在阶段边界手动 /compact,并指定要保留的决策、错误和下一步。
  5. 压缩后先核对目标、已改文件和测试状态,再继续实现。发现摘要错了,应立即纠正。

如果压缩之后立刻又满,根因往往是单个输入过大,或固定加载的工具和指令过多。此时反复压缩只会损失信息。应运行 /context 确认占用来源,精简大型 CLAUDE.md、停用无关 MCP 服务,或把支线工作交给子 Agent。

七、可调整的开关#

自动压缩默认开启,多数使用者不需要改。官方文档公开了下面几个环境变量:

环境变量作用使用边界
CLAUDE_AUTOCOMPACT_PCT_OVERRIDE按指定百分比提前触发压缩提前触发会增加压缩次数,也增加摘要失真机会
CLAUDE_CODE_AUTO_COMPACT_WINDOW改变用于自动压缩计算的有效容量不会扩大模型的真实上下文窗口
DISABLE_AUTO_COMPACT禁用自动压缩,保留手动 /compact窗口将满时需要用户自己处理
DISABLE_COMPACT禁用自动和手动压缩适合受控试验,不适合一般长会话

不建议根据网络文章里某个版本的 token 常量去“卡点”调参。模型窗口、保留预算和内部策略都会变化,/context 展示的当前会话状态比固定阈值更值得信任。

结语#

上下文管理的目标不是把一次会话拖得尽可能长,而是让当前窗口只保留能影响下一步决策的信息。压缩只是其中一种手段;更稳定的做法是控制输入、外置任务状态、在阶段边界主动交接,并用子 Agent 隔离高噪声支线。

参考资料#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

赞助
Claude Code 上下文窗口管理与自动压缩
https://blog.souloss.cn/posts/ai/agents-decoded/claude-code/claude-code-context-window/
作者
Tsukimi
发布于
2026-06-23
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时