Using Claude Code: Session Management & 1M Context
Using Claude Code: Session Management & 1M Context
作者:Thariq (@trq212) - Anthropic 技术团队成员
来源:https://x.com/trq212/status/2044548257058328723
发布日期:April 16, 2026
浏览量:1.5M Views
引言
在与 Claude Code用户的交流中,一个主题反复出现:1M token 的上下文窗口是一把双刃剑。
它让 Claude Code 能够更长时间地自主运行、更可靠地处理任务,但如果你不刻意管理你的会话,它也为上下文污染敞开了大门。
会话管理比以往任何时候都更重要,围绕它似乎有很多问题:
- 你是保持一个会话在终端中打开,还是两个?
- 每次提示都从头开始吗?
- 什么时候应该使用 compact、rewind 或 subagents?
- 什么会导致糟糕的 compact?
这里有大量细节可以真正塑造你与 Claude Code 的体验,几乎所有这些都来自管理你的上下文窗口。
一、Context、Compaction 与 Context Rot 快速入门
Context Window(上下文窗口) 是模型在生成下一个响应时能够"看到"的所有内容。它包括:
- 你的系统提示(system prompt)
- 到目前为止的对话
- 每个 tool call 及其输出
- 已读取的每个文件
Claude Code 的上下文窗口为 one million tokens。
但使用上下文有一个代价,这通常被称为 Context Rot(上下文腐烂)。
Context Rot 是一种观察:随着上下文增长,模型性能会下降,因为注意力分散到更多的 tokens 上,旧的、不相关的内容开始分散当前任务的注意力。
对于我们的 1M 上下文模型,我们观察到大约在 300-400k tokens 时会出现某种程度的 context rot,但这高度依赖于任务——不是一个硬性规则。
上下文窗口是硬性截止,所以当你接近上下文窗口的末尾时,你需要将你正在进行的任务总结成更小的描述,并在新的上下文窗口中继续工作,我们称之为 Compaction(压缩)。你也可以自己触发 compaction。
二、每个回合都是一个分支点
假设你刚刚让 Claude 做某事,它已经完成了——现在你的上下文中有一些信息(tool calls、tool outputs、你的指令),你接下来有惊人的多种选择:
| 选项 | 说明 |
|------|------|
| Continue | 在同一会话中发送另一条消息 |
| /rewind (Esc Esc) | 跳回到之前的消息,从那里重新尝试 |
| /clear | 开始新会话,通常带上你提炼的简报 |
| Compact | 总结到目前为止的会话,并在总结之上继续 |
| Subagents | 将下一块工作委派给一个有独立 clean context 的 agent,只将其结果拉回来 |
虽然最自然的方式是继续,但其他四个选项的存在是为了帮助你管理上下文。
三、何时开始新会话
新的 1M 上下文窗口意味着你现在可以更可靠地完成更长的任务,例如让它从头构建一个全栈应用。
但仅仅因为你的模型没有用完上下文,并不意味着你不应该开始新会话。
我们的经验法则是:当你开始新任务时,你也应该开始新会话。
一个灰色地带是,你可能想做相关任务,其中一些上下文仍然必要,但不是全部。
例如,为你刚实现的功能编写文档。虽然你可以开始新会话,但 Claude 将不得不重新读取你刚实现的文件,这会更慢且更昂贵。由于文档可能不是一个高度依赖智能的任务,额外的上下文可能值得不必重新读取相关文件的效率增益。
四、Rewinding 而非 Correcting
如果我必须选择一个标志着良好上下文管理的习惯,那就是 rewind。
在 Claude Code 中,双击 Esc(或运行 /rewind)让你跳回到任何之前的消息并从那里重新提示。该点之后的消息会从上下文中丢弃。
例如,Claude 读取了五个文件,尝试了一种方法,但不起作用。你的直觉可能是输入 "that didn't work, try X instead."
但更好的做法是 rewind 到文件读取之后,用你学到的知识重新提示:"Don't use approach A, the foo module doesn't expose that — go straight to B."
你也可以使用 "summarize from here" 让 Claude 总结其学习内容并创建一个 handoff message,就像是未来的 Claude 给之前的 Claude 的消息,告诉它尝试了什么但失败了。
五、Compacting vs Fresh Sessions
一旦会话变长,你有两种方式来减轻重量:/compact 或 /clear(并重新开始)。它们感觉相似,但行为非常不同。
/compact
Compact 要求模型总结到目前为止的对话,然后用该总结替换历史。
- 它是 lossy 的——你信任 Claude 决定什么重要
- 但你不需要自己写任何东西
- Claude 可能在包含重要学习或文件方面更彻底
- 你可以通过传递指令来引导它:
/compact focus on the auth refactor, drop the test debugging
/clear
使用 /clear,你自己写下重要的内容:
- "we're refactoring the auth middleware, the constraint is X, the files that matter are A and B, we've ruled out approach Y"
- 然后 clean 开始
- 更费力,但结果的上下文是你决定相关的内容
六、什么导致糟糕的 Compact?
如果你运行大量长时间运行的会话,你可能注意到 compacting 可能特别糟糕的时候。
在这种情况下,我们经常发现糟糕的 compacts 可能发生在模型无法预测你工作方向的时候。
例如:
- autocompact 在长时间调试会话后触发,总结了调查
- 你的下一条消息是 "now fix that other warning we saw in bar.ts"
- 但因为会话专注于调试,另一个 warning 可能已从总结中丢弃
这特别困难,因为由于 context rot,模型在 compacting 时处于最不智能的状态。
有了 1M 上下文,你有更多时间主动使用 /compact 并附带你想要做什么的描述。
七、Subagents 与 Fresh Context Windows
Subagents 是一种上下文管理形式,适用于你预先知道一块工作会产生大量你不再需要的中间输出时。当 Claude 通过 Agent tool 生成 subagent 时,该 subagent 获得自己的 fresh context window。它可以做任意多的工作,然后合成其结果,只有最终报告返回给 parent。
我们使用的心理测试:我以后需要这个 tool output 吗,还是只需要结论?虽然 Claude Code 会自动调用 subagents,但你可能想告诉它明确这样做。例如:
- "Spin up a subagent to verify the result of this work based on the following spec file"
- "Spin off a subagent to read through this other codebase and summarize how it implemented the auth flow, then implement it yourself in the same way"
- "Spin off a subagent to write the docs on this feature based on my git changes"
八、总结
简而言之,当 Claude 结束一个回合,你即将发送新消息时,你有一个决策点。
随着时间的推移,我们期望 Claude 会帮助你自己处理这个,但目前这是你可以引导 Claude 输出的方式之一。
附录:决策表格
| 场景 | 推荐 | 原因 |
|------|------|------|
| 同一任务,上下文仍相关 | Continue | 窗口中的内容仍在支撑,无需重建 |
| Claude 走错了方向 | Rewind (双击 Esc) | 保留有用的文件读取,丢弃失败的尝试,用学到的知识重新提示 |
| 任务中途,session 充满过时的调试/探索 | /compact | 低费力,Claude 决定重要内容。可附带指令引导 |
| 开始真正的新任务 | /clear | 零 rot,你完全控制什么内容向前传递 |
| 下一步会产生大量只需结论的输出 | Subagent | 中间工具噪音留在子 context,只返回结果 |
图片来源: 本文图片从原推文截图提取
原推文链接:https://x.com/trq212/status/2044548257058328723