X · 研究者一手

@trq212 使用 Claude Code:会话管理与 100 万上下文

@trq212 Using Claude Code: Session Management & 1M Context

二〇二六年五月十六日 · 英文原文

Anthropic 的 Claude Code 拥有 100 万 token 上下文窗口,但需主动管理以避免上下文污染与衰减(约 30-40 万 token 时性能下降)。每次交互后,用户可选择继续、回退(rewind)、清除(/clear)、压缩(/compact)或委托子代理(subagent)。回退优于纠正,压缩有损且可能因方向不明导致 bad compact,子代理拥有独立上下文窗口。建议新任务开启新会话,并主动使用 /compact 附带指令。

最近与Claude Code用户的交流中,一个主题反复出现:100万token的上下文窗口是一把双刃剑。

它让Claude Code能够更长时间地自主运行,更可靠地处理任务,但如果你不刻意管理会话,它也为上下文污染打开了大门。

会话管理比以往任何时候都更重要,而且似乎有很多相关问题。你是在终端里保持一个会话打开,还是两个?每次prompt都从头开始?什么时候应该使用compact、rewind或subagent?什么导致了bad compact?

这里有很多细节,能真正塑造你使用Claude Code的体验,而几乎所有细节都来自你如何管理上下文窗口。

关于上下文、压缩与上下文衰减的快速入门

上下文窗口是模型在生成下一个响应时能一次性"看到"的所有内容。它包括你的系统提示、到目前为止的对话、每次工具调用及其输出,以及所有已读取的文件。Claude Code拥有100万token的上下文窗口。

不幸的是,使用上下文有一点代价,通常被称为上下文衰减(context rot)。上下文衰减是指,随着上下文增长,模型性能会下降,因为注意力分散到更多token上,而较旧、不相关的内容开始干扰当前任务。对于我们的100万上下文模型,我们观察到大约在30-40万token时会出现一定程度的上下文衰减,但这高度依赖于任务——并非硬性规则。

上下文窗口是一个硬性截断,所以当你接近上下文窗口末尾时,需要将你正在处理的任务总结成一个更小的描述,并在新的上下文窗口中继续工作,我们称之为压缩(compaction)。你也可以自己触发压缩。

每一次交互都是一个分支点

假设你刚让Claude做了一件事,它完成了,现在你的上下文中有了一些信息(工具调用、工具输出、你的指令),而接下来你有数量惊人的选项:

虽然最自然的方式是直接继续,但其他四个选项的存在是为了帮助你管理上下文。

何时开始新会话

新的100万上下文窗口意味着你现在可以更可靠地完成更长的任务,例如让它从头构建一个全栈应用。但仅仅因为你的模型没有耗尽上下文,并不意味着你不应该开始新会话。

我们的一般经验法则是:当你开始一个新任务时,也应该开始一个新会话。

一个灰色地带是,你可能想做相关的任务,其中部分上下文仍然必要,但并非全部。

例如,为你刚实现的功能编写文档。虽然你可以开始一个新会话,但Claude必须重新读取你刚实现的文件,这会更慢且更昂贵。由于文档可能不是一个对智能要求很高的任务,额外的上下文可能值得换取不必重新读取相关文件的效率提升。

回退而非纠正

如果让我选一个能体现良好上下文管理的习惯,那就是回退(rewind)。

在Claude Code中,双击Esc(或运行/rewind)可以让你跳回之前的任何一条消息,并从那里重新prompt。该点之后的消息会从上下文中丢弃。

回退通常是比纠正更好的方法。例如,Claude读取了五个文件,尝试了一种方法,但没成功。你的本能可能是输入"那没成功,试试X代替。"但更好的做法是回退到文件读取之后,用你学到的东西重新prompt。"不要用方法A,foo模块没有暴露那个——直接去用B。"

你也可以使用"summarize from here"让Claude总结它的学习成果并创建一个交接消息,有点像来自未来版本的Claude(它尝试了某事但没成功)给之前迭代的Claude的消息。

压缩 vs. 全新会话

一旦会话变长,你有两种方式来减轻负担:/compact 或 /clear(然后从头开始)。它们感觉相似,但行为截然不同。

Compact要求模型总结到目前为止的对话,然后用这个总结替换历史记录。它是有损的,你信任Claude来决定什么重要,但你不需要自己写任何东西,而且Claude在包含重要的学习成果或文件方面可能更彻底。你也可以通过传递指令来引导它(/compact focus on the auth refactor, drop the test debugging)。

使用/clear时,你写下重要的内容("我们在重构auth中间件,约束条件是X,关键文件是A和B,我们已经排除了方法Y"),然后从头开始。这需要更多工作,但生成的上下文是你认为相关的内容。

什么导致了Bad Compact?

如果你运行了很多长时间运行的会话,你可能注意到有时压缩效果特别差。在这种情况下,我们经常发现,当模型无法预测你工作的方向时,可能会发生bad compact。

例如,自动压缩在一次长时间的调试会话后触发,总结了调查过程,而你的下一条消息是"现在修复我们在bar.ts中看到的那个其他警告。"

但由于会话专注于调试,那个其他警告可能从总结中被丢弃了。

这尤其困难,因为由于上下文衰减,模型在压缩时处于其最不智能的状态。有了100万上下文,你有更多时间主动使用/compact,并附上你想做什么的描述。

子代理与全新上下文窗口

子代理是上下文管理的一种形式,当你预先知道一块工作会产生大量你不再需要的中间输出时,它很有用。

当Claude通过Agent工具生成一个子代理时,该子代理会获得自己全新的上下文窗口。它可以做它需要的任何工作,然后综合其结果,只将最终报告返回给父代理。

我们使用的心理测试是:我还会再次需要这个工具输出吗,还是只需要结论?

虽然Claude Code会自动调用子代理,但你可能想明确告诉它这样做。例如,你可能想告诉它:

总结

总之,当Claude完成一次交互,你即将发送新消息时,你面临一个决策点。

随着时间的推移,我们期望Claude会自己帮你处理这个问题,但就目前而言,这是你可以引导Claude输出的方式之一。

译自 X · 研究者一手 · 录于 二〇二六年五月十六日