最近我和 Claude Code 用户沟通时,一个话题反复出现,100 万 token 的上下文窗口是一把双刃剑。
它让 Claude Code 能更长时间自主工作,也能更稳定地完成任务,但如果你不刻意管理会话,也会更容易把上下文污染。
现在会话管理比以前更重要,大家关于这件事的问题也很多。你是只在一个终端里保留一个会话,还是开两个?每次提问都重新开始吗?什么时候该用 compact、rewind 或 subagent?为什么会出现质量很差的 compact?
这里面其实有不少细节,真的会影响你使用 Claude Code 的体验,而几乎所有问题都和你如何管理上下文窗口有关。
上下文、压缩与上下文腐化速览

上下文窗口,就是模型在生成下一条回复时一次性能“看到”的全部内容。它包括系统提示词、到目前为止的对话、每一次工具调用及其输出、以及读取过的所有文件。Claude Code 的上下文窗口是 100 万 token。
可惜使用上下文会有一点代价,通常叫做上下文腐化(context rot)。它指的是,随着上下文变长,模型性能会下降,因为注意力被分散到更多 token 上,较早且无关的内容开始干扰当前任务。对我们的 100 万上下文模型来说,通常在大约 30 到 40 万 token 时会出现一定程度的上下文腐化,但这高度依赖具体任务,不是硬规则。
上下文窗口有硬上限,所以当你接近末尾时,需要把当前任务总结成更小的描述,再在新的上下文窗口继续,这个过程叫压缩(compaction)。你也可以手动触发压缩。

每一轮都是一个分叉点
假设你刚让 Claude 做完一件事,现在你的上下文里已经有了一些信息(工具调用、工具输出、你的指令),接下来你其实有很多选择:
- Continue,继续在同一个会话里发下一条消息
- /rewind(esc esc),跳回之前某条消息,从那里重试
- /clear,开始新会话,通常带上你刚提炼出来的简报
- Compact,总结当前会话并在总结之上继续
- Subagents,把下一段工作委托给有独立干净上下文的代理,只把结果拉回来
最自然的做法通常是直接继续,但另外四个选项就是为管理上下文准备的。

什么时候该开启新会话
新的 100 万上下文窗口意味着你现在可以更稳定地完成更长任务,比如从零搭一个全栈应用。但模型没跑满上下文,不代表你就不该开新会话。
我们的一条通用经验是,当你开始一个新任务时,也应该开启一个新会话。
有个灰区是,你可能在做相关任务,其中一部分旧上下文还有用,但不是全部都需要。
例如,你刚实现完一个功能,接着去写文档。你当然可以开新会话,但 Claude 就得重新读取你刚改过的文件,速度更慢、成本更高。因为写文档未必是对智能性特别敏感的任务,所以保留一些额外上下文,换取不必重复读文件的效率,往往是划算的。
与其纠错,不如回退

如果只能选一个最能体现上下文管理水平的习惯,我会选 rewind。
在 Claude Code 里,连按两下 Esc(或运行 /rewind)可以跳回任意一条之前的消息,然后从那里重新提示。该位置之后的消息会从上下文里移除。
在做纠错时,rewind 往往是更好的办法。比如 Claude 读了 5 个文件,尝试了一种方案,但没成功。你的本能可能是输入“这个不行,试试 X”。但更好的做法通常是回退到“读完文件之后”的位置,再带着新信息重提一次,比如“不要用方案 A,foo 模块并不暴露那个能力,直接走 B”。
你也可以用“summarize from here”让 Claude 总结已学到的东西并生成交接消息,有点像未来的 Claude 给过去那个尝试失败版本写的一封交接信。

Compact 和 Fresh Session 的区别
当会话变长后,你有两种减重方式,/compact 或 /clear(然后重开)。它们看起来类似,但行为差别很大。
compact 会让模型先总结到目前为止的对话,再用这份总结替换原历史。它是有损的,你在把“什么重要”的判断交给 Claude,但你不需要自己写总结,而且 Claude 可能更全面地带上关键结论和文件。你还可以通过指令引导它(例如 /compact focus on the auth refactor, drop the test debugging)。

而 /clear 是你自己写下重点(“我们在重构 auth middleware,约束是 X,关键文件是 A 和 B,方案 Y 已排除”),然后从干净上下文重启。工作量更高,但最终上下文只包含你认定相关的内容。
什么会导致糟糕的 Compact?

如果你经常跑很长的会话,可能已经见过某些场景里 compact 特别差。我们常见的一种情况是,模型无法预测你的工作接下来要往哪里走。
比如自动 compact 在一段很长的调试后触发,刚总结完你的排查过程,下一条消息你却说,“现在去修我们在 bar.ts 里看到的另一个 warning。”
但因为这段会话主要在调试主问题,那个“另一个 warning”可能已经被摘要丢掉了。
这点尤其棘手,因为受上下文腐化影响,模型在做 compact 时往往正处在智能状态最差的阶段。好在有 100 万上下文,你有更多时间主动 /compact,并附上你希望它保留的方向说明。
Subagent 与干净上下文窗口

Subagent 本质上也是一种上下文管理手段,适合那种你提前知道会产生大量中间输出、而这些输出以后不太会再用到的工作块。
当 Claude 通过 Agent 工具拉起 subagent 时,这个 subagent 会获得自己独立且全新的上下文窗口。它可以完成所需工作,然后把结果综合成最终报告,只把报告返回给父会话。
我们常用的判断题是,我之后还需要这些工具输出吗,还是只需要结论?
虽然 Claude Code 会自动调用 subagent,但你也可以明确要求它这么做。例如你可以这样说:
- “启动一个 subagent,基于下面这份规范文件验证这次工作的结果”
- “启动一个 subagent,去读另一个代码库并总结它是怎么实现 auth flow 的,再按同样方式在当前代码库里实现”
- “启动一个 subagent,根据我的 git 改动为这个功能写文档”
总结
简而言之,当 Claude 完成一轮、你准备发下一条消息时,其实正处在一个决策点。
我们预计随着时间推移,Claude 会更好地帮你自动处理这些事。但在现在,这仍然是你可以主动引导 Claude 输出质量的重要方式之一。
