第 5 章 / 共 12 章
上下文是唯一稀缺资源
5.1 为什么聊得越久它越笨
第 1 章给过那句统一约束:上下文窗口会很快填满,填满后表现下降。这一章讲怎么管它。
先理解一件事:每一轮对话,整个会话历史都会被重新发送一遍。这意味着:
- 会话越长,每一轮的开销越大(这是额度掉得快的主要原因之一);
- 会话里的旧内容不会自动”过期”,包括你早就纠正过的错误尝试;
- 当有效指令被大量无关内容包围时,模型对它的注意力会被稀释。
官方文档给这种状态起了个很形象的名字:厨房水槽式会话(kitchen-sink session)——什么都往里扔,最后什么都捞不出来。

5.2 四个动作,各管一段
| 动作 | 做什么 | 什么时候用 |
|---|---|---|
/context | 显示当前上下文被什么占满了 | 感觉变慢、变笨时的第一诊断 |
/compact | 把会话总结压缩,释放空间 | 当前任务还没做完,但对话已经很长 |
/clear | 清空对话历史(项目记忆仍在) | 切换到一个无关的新任务 |
/rewind | 回退对话状态、代码状态或两者 | 走错了方向,需要回到岔路口 |
/compact 可以带指示,让总结偏向你关心的部分:
/compact 只保留和 session 中间件相关的结论,丢掉前面失败的三次尝试
/clear 和 /compact 有一个容易被忽略的成本差异:压缩本身是一次很大的请求,而清空几乎不花钱。所以当任务确实结束时,清空优于压缩。
5.3 两次纠正规则
这是本书最值得贴在显示器上的一条经验法则,来自官方最佳实践页:
同一个问题纠正两次仍未解决,就
/clear,然后带着你刚学到的东西重写提示。
它背后的逻辑很直接。你的两次纠正在上下文里留下的,不只是”正确答案”,还有两次错误示范。第三次尝试是在一个已经被污染的环境里进行的。而一个干净会话加一句包含了你新认知的提示,起点比它高得多。
官方的原话是:一个干净的会话配上更好的提示,几乎总是胜过一个积累了大量纠正的长会话。
5.4 把探索工作外包出去
有些任务天生就吃上下文:在一个大仓库里找”所有调用了某个废弃 API 的地方”,可能要读三十个文件。如果这些文件全部进入你的主会话,后面的实现工作就没空间了。
解决办法是让子代理去读:
用一个子代理去调查:仓库里还有哪些地方在用旧版的 formatDate,
只把文件清单和调用方式的摘要返回给我,不要贴文件内容。
子代理在独立的上下文窗口里工作,只把结论回传。Anthropic 的工程博客把这称为上下文工程的核心技术之一——用子代理承担大量读取,主会话只接收压缩后的结果。第 8 章会讲怎么把常用的调查任务固化成可复用的子代理。
5.5 会话像分支一样管理
长任务不需要挤在一个会话里:
claude -c # 继续这个目录下最近的一次会话
claude -r # 从列表里挑一个会话恢复
一个实用习惯:在 /clear 之前先给会话起个名字,这样它就像一条可以随时切回来的分支。做法上,把”一个任务一个会话”当默认,而不是”一天一个会话”。
5.6 关于回退的一个重要限制
/rewind 的检查点只记录 Claude 通过文件编辑工具做的改动。它通过 Bash 命令造成的改动(比如跑了一个生成脚本、删了一个目录、执行了数据库迁移)不在其中。
所以真正的安全网仍然是 git:
git add -A && git commit -m "wip: before claude session"
在把自动化档位调高之前先做这一步,代价是三秒钟,收益是你可以随时 git reset --hard 回到干净状态。
5.7 常见坑
5.8 本章练习与检查点
你现在的成果:你不再被动等待”它今天状态不好”,而是有了诊断(/context)、有了阈值(两次纠正)、有了动作(清理与外包)。