← 返回 关于

如何在 Claude Code 中管理会话与百万上下文窗口

2026-04-16 · 原文链接

最近我和 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 做完一件事,现在你的上下文里已经有了一些信息(工具调用、工具输出、你的指令),接下来你其实有很多选择:

最自然的做法通常是直接继续,但另外四个选项就是为管理上下文准备的。

什么时候该开启新会话

新的 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,但你也可以明确要求它这么做。例如你可以这样说:

总结

简而言之,当 Claude 完成一轮、你准备发下一条消息时,其实正处在一个决策点。

我们预计随着时间推移,Claude 会更好地帮你自动处理这些事。但在现在,这仍然是你可以主动引导 Claude 输出质量的重要方式之一。