在我最近与 Claude Code 用户的交流中,有一个主题反复出现:100 万 token 的上下文窗口是一把双刃剑。
它让 Claude Code 能够更长时间地自主运行,更可靠地处理任务,但如果你在管理会话时不刻意为之,也会导致上下文污染。
会话管理比以往任何时候都更重要,而且似乎有很多相关问题:你是在一个终端保持一个会话,还是两个?每次提示都重新开始?什么时候使用 compact、rewind 或 subagents?什么会导致一次糟糕的压缩?
这其中有大量细节可以真正塑造你使用 Claude Code 的体验,而且几乎所有这些都与管理你的上下文窗口有关。
上下文、压缩与上下文腐化的快速入门

上下文窗口是模型在生成下一个回复时能”看到”的所有内容。它包括你的系统提示词、迄今为止的对话、每次工具调用及其输出,以及已读取的每个文件。Claude Code 的上下文窗口为 100 万 token。
不幸的是,使用上下文是有代价的,这通常被称为上下文腐化。上下文腐化是指这样一个现象:随着上下文增长,模型性能会下降,因为注意力被分散到更多的 token 上,更旧的、不相关的内容开始干扰当前任务。对于我们的 100 万上下文模型,我们在约 30-40 万 token 时会看到一定程度的上下文腐化,但它高度依赖于任务——不是一个快速的规则。
上下文窗口是硬性截止的,所以当你接近上下文窗口末尾时,你需要将你一直在处理的任务总结成一个更小的描述,并在新的上下文窗口中继续工作,我们称之为压缩。你也可以自行触发压缩。

每个回合都是一个分支点
假设你刚刚让 Claude 做了一件事,它完成了,你的上下文中有了一些信息(工具调用、工具输出、你的指令),对于下一步该做什么,你有很多选择:
- 继续 — 在同一会话中发送另一条消息
- /rewind(esc esc) — 跳回到之前的一条消息并从那里重新尝试
- /clear — 开始一个新会话,通常带有一个你从刚才学到的东西中提炼出来的简要说明
- Compact — 总结迄今为止的会话,并在此基础上继续
- Subagents — 将下一块工作委托给一个有自己干净上下文的 Agent,只把结果拉回来
虽然最自然的是继续,但其他四个选项是为了帮助管理你的上下文而存在的。

何时开始新会话
新的 100 万上下文窗口意味着你现在可以更可靠地做更长时间的任务,例如让它从头构建一个全栈应用。但即使你的模型还没有用完上下文,也不意味着你不应该开始一个新会话。
我们的一般经验法则:当开始一个新任务时,你也应该开始一个新会话。
一个灰色地带是你可能想做相关任务,其中一些上下文仍然是必要的,但不是全部。
例如,为你刚刚实现的功能写文档。虽然你可以开始一个新会话,但 Claude 需要重新读取你刚实现的文件,这会更慢且更贵。由于文档可能不是一个高度智力敏感的任务,多出来的上下文可能值得为不必重新读取相关文件的效率提升而付出。
用 Rewind 而不是纠正

如果我必须选择一个能表明良好上下文管理的习惯,那就是 rewind。
在 Claude Code 中,双击 Esc(或运行 /rewind)让你跳回到任何之前的消息并从那里重新提示。那之后的消息会从上下文中删除。
Rewind 通常是更好的纠正方法。例如,Claude 读取了五个文件,尝试了一个方法,但不生效。你的本能可能是输入”那个不生效,试试 X”,但更好的做法是 rewind 到文件读取之后,用你学到的东西重新提示。“不要用方法 A,foo 模块没有暴露那个——直接走 B。”
你也可以用*「从现在开始总结」*让 Claude 总结它的学习并创建一个交接消息,有点像是来自未来的 Claude 给过去的 Claude 的一条消息,告诉他尝试了什么但不生效。

压缩与全新会话
一旦一个会话变长,你有两种减重方式:/compact 或 /clear(重新开始)。它们感觉相似但行为非常不同。
Compact 要求模型总结迄今为止的对话,然后用那个摘要替换历史。它是有损的,你信任 Claude 决定什么是重要的,但你不需要自己写任何东西,而且 Claude 在包含重要学习或文件方面可能更彻底。你也可以通过传递指令来引导它(/compact 聚焦在 auth 重构上,放弃测试调试)。

用 /clear 你写下重要的内容(“我们正在重构 auth 中间件,约束是 X,重要的文件是 A 和 B,我们已经排除了方法 Y”)然后干净地开始。这需要更多工作,但最终的上下文是你决定的相关内容。
什么导致糟糕的压缩?

如果你运行了很多长时间会话,你可能已经注意到有时候压缩会特别糟糕。在这种情况下,我们经常发现糟糕的压缩可能发生在模型无法预测你工作方向的时候。
例如,autocompact 在一个漫长的调试会话后触发,总结了调查,你的下一条消息是”现在修复我们在 bar.ts 中看到的另一个警告”。
但因为会话专注于调试,其他警告可能被从摘要中删除了。
这特别困难,因为由于上下文腐化,模型在压缩时处于其智力最低点。有了 100 万上下文,你有更多时间主动地 /compact,并描述你想做什么。
Subagents 与全新上下文窗口

Subagents 是上下文管理的一种形式,当你提前知道一块工作会产生大量你不再需要的中间输出时,它很有用。
当 Claude 通过 Agent 工具生成 subagent 时,那个 subagent 得到它自己全新的上下文窗口。它可以做尽可能多的工作,然后综合它的结果,这样只有最终报告返回给父级。
我们使用的心理测试:我会再次需要这个工具输出,还是只需要结论?
虽然 Claude Code 会自动调用 subagents,但你可能想告诉它明确地这样做。例如,你可能想告诉它:
- “启动一个 subagent 来根据以下规格文件验证这项工作的结果”
- “派生一个 subagent 来阅读这个其他代码库并总结它如何实现 auth 流程,然后你自己用相同的方式实现它”
- “派生一个 subagent 来根据我的 git 变更为这个功能写文档”
总结
总之,当 Claude 结束了一个回合,你准备发送一条新消息时,你有一个决策点。
随着时间的推移,我们期望 Claude 本身会帮助处理这个,但目前这是你可以引导 Claude 输出的方式之一。
