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 系统消息。
可以把过程理解为下面这条链路。这张图表达公开行为,不对内部函数、阈值或实验特性作保证。
压缩减少的是模型当前能直接读到的内容,不等于删除本地会话记录。会话 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 还提供两种部分总结:“从这里开始总结”和“总结到这里”。当前后阶段仍有某一段原文需要保留时,这比对整段会话做全量压缩更精确。
六、避免压缩失真的工作流
压缩失真通常不是摘要少了一句话,而是任务状态从未被结构化。一套更稳定的长任务工作流如下:
- 开始时把目标、验收条件和不可触碰的边界写清。这些内容决定摘要时的取舍。
- 让命令输出可控。先用过滤、分页、统计和针对性搜索,不要一次把整份日志或大文件塞进对话。
- 使用计划文件或任务清单记录当前状态。不要让“哪些已完成”只存在模型的对话记忆里。
- 在阶段边界手动
/compact,并指定要保留的决策、错误和下一步。 - 压缩后先核对目标、已改文件和测试状态,再继续实现。发现摘要错了,应立即纠正。
如果压缩之后立刻又满,根因往往是单个输入过大,或固定加载的工具和指令过多。此时反复压缩只会损失信息。应运行 /context 确认占用来源,精简大型 CLAUDE.md、停用无关 MCP 服务,或把支线工作交给子 Agent。
七、可调整的开关
自动压缩默认开启,多数使用者不需要改。官方文档公开了下面几个环境变量:
| 环境变量 | 作用 | 使用边界 |
|---|---|---|
CLAUDE_AUTOCOMPACT_PCT_OVERRIDE | 按指定百分比提前触发压缩 | 提前触发会增加压缩次数,也增加摘要失真机会 |
CLAUDE_CODE_AUTO_COMPACT_WINDOW | 改变用于自动压缩计算的有效容量 | 不会扩大模型的真实上下文窗口 |
DISABLE_AUTO_COMPACT | 禁用自动压缩,保留手动 /compact | 窗口将满时需要用户自己处理 |
DISABLE_COMPACT | 禁用自动和手动压缩 | 适合受控试验,不适合一般长会话 |
不建议根据网络文章里某个版本的 token 常量去“卡点”调参。模型窗口、保留预算和内部策略都会变化,/context 展示的当前会话状态比固定阈值更值得信任。
结语
上下文管理的目标不是把一次会话拖得尽可能长,而是让当前窗口只保留能影响下一步决策的信息。压缩只是其中一种手段;更稳定的做法是控制输入、外置任务状态、在阶段边界主动交接,并用子 Agent 隔离高噪声支线。
参考资料
- Explore the context window - 上下文的组成、压缩过程与恢复规则
- How Claude Code works - Agent 循环、自动压缩与上下文管理
- Manage sessions -
/compact、/clear、/context和会话存储 - Checkpointing - 回退与部分总结
- Environment variables - 压缩相关环境变量
- Hooks reference -
PreCompact、PostCompact和SessionStart事件
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时








