第 12 章 Context 管理
上下文窗口是有限资源
模型能"看到"的内容有上限。对话历史、读进来的文件、工具调用结果、memory 文件、skill 定义——这些都在消耗这个上限。用完了,就没法继续了。
Claude Code 把这个资源的管理做成了显式功能,而不是让用户自己猜"为什么它突然忘了之前说的话"。
你能看到上下文花在哪里
/context 会显示当前上下文的使用分布:多少在对话历史里,多少在 memory 文件里,多少在 MCP tool 定义里,多少在 skill 里,还有多少剩余。
这个可视化的价值不是帮你优化 token 用量,而是让系统行为变透明。如果 agent 好像没注意到某件事,你可以看看那件事是不是已经被压缩掉了;如果上下文快满了,你知道该做什么,而不是等到突然报错。
Compact 是怎么工作的
Compact 有两种触发方式:
- 手动:
/compact立即触发,你可以在觉得上下文太乱的时候主动清理。 - 自动:当上下文 token 数接近有效窗口上限时(大约在上限前 13,000 tokens 的位置),系统自动触发一次 compact,然后继续对话。你会在消息流里看到一条提示,说明刚才发生了压缩——不是悄悄进行的。如果不想要自动 compact,可以在设置里关掉。如果 compact 连续失败 3 次,系统也会自己停下来,不再反复尝试。
压缩的逻辑不是随机丢弃,而是有优先级的:
- 最近几轮对话完整保留,不压缩
- 工具调用结果保留摘要,原始输出可以丢
- 被后续对话引用的内容保留,没有被引用的可以丢
- 纯文本的中间回复,多轮合并成摘要
被压缩的内容会打上标记,界面上能看到"这里有内容被摘要了",不是悄悄消失。
Context Collapse
Context collapse 比 compact 更激进:把多轮内容(包括工具调用链)折叠成一个 summary block。适合长任务的阶段切换点——当前阶段完成了,折叠历史,清空空间,新阶段开始时只保留一个简短的"之前做了什么"的摘要。
Context collapse 没有用户命令,完全自动触发:系统在每次 API 调用前判断是否需要折叠,也会在遇到上下文溢出错误时自动触发。Collapse 和 auto-compact 是独立的机制,可以同时运行——前者专门压缩 Read/Search 工具的输出,后者摘要整体对话历史,各管各的。手动 /compact 不受影响,仍然可用。
为什么压缩要可见
Compact 可以做成完全静默的——自动触发,不通知用户,对话继续。很多系统就是这样做的。
问题是:你不知道压缩发生了,也不知道什么被丢掉了。如果因此出了问题——agent 忘了一个重要约束,或者重复做了已经做过的事——你很难判断是 agent 的问题还是上下文压缩导致的问题。
Claude Code 选择让压缩可见:自动触发时会在消息流里留下记录,被压缩的内容会打上标记,/context 能看到上下文花在哪里。代价是多了一些需要了解的概念,好处是出了问题你知道从哪里查。