【*重要】claude code工程师关于上下文管理经验分享文章
*回退通常是更好的纠错方法。上下文窗口是一个硬性截止点,因此当你接近上下文窗口的末尾时,你一直在处理的任务会自动总结成一个更小的描述,然后模型在新的上下文窗口中继续工作。上下文衰减是指随着上下文增长,模型性能会下降,因为注意力分散到更多的令牌上,而旧的、不相关的内容开始分散当前任务的注意力。这里有惊人的细节可以真正塑造你在 Claude Code 中的体验,而几乎所有细节都来自于管理你的上下文窗口
使用 Claude Code:会话管理、上下文与 100 万上下文
你管理会话、上下文和压缩的方式对 Claude Code 结果的影响可能超出你的预期。以下是一份实用指南,帮助你在每个转折点做出正确的选择。
我们发布了 /usage 这个新的斜杠命令,帮助你了解你在 Claude Code 中的使用情况。这个功能的灵感来自于与客户的大量交流。
在这些通话中反复出现的一个话题是,用户管理会话的方式存在很大差异,尤其是在我们最近将 Claude Code 的上下文更新到 100 万之后。
你是只使用一个会话,还是在终端中保持两个会话打开?你会为每个提示都开启一个新会话吗?你何时使用压缩、回退或子代理?是什么导致了糟糕的压缩或糟糕的会话?
这里有惊人的细节可以真正塑造你在 Claude Code 中的体验,而几乎所有细节都来自于管理你的上下文窗口。
**上下文窗口是模型在生成下一个响应时可以一次性“看到”的所有内容。它包括你的系统提示、迄今为止的对话、每一个工具调用及其输出,以及每一个被读取的文件。**Claude Code 拥有一个 100 万令牌的上下文窗口。
不幸的是,使用上下文会对性能产生轻微影响,这通常被称为 上下文衰减。上下文衰减是指随着上下文增长,模型性能会下降,因为注意力分散到更多的令牌上,而旧的、不相关的内容开始分散当前任务的注意力。
上下文窗口是一个硬性截止点,因此当你接近上下文窗口的末尾时,你一直在处理的任务会自动总结成一个更小的描述,然后模型在新的上下文窗口中继续工作。我们称之为 压缩。你也可以自己触发压缩。
假设你刚刚要求 Claude 做某事并且它完成了——你现在在上下文中拥有一些信息(工具调用、工具输出、你的指令),而你接下来要做的事情有惊人的多个选择:
- 继续 — 只是在现有上下文中继续。
- /compact — 要求 Claude 压缩上下文,保留重要内容。
- /rewind (esc esc) — 跳回到之前的某条消息并从那里重新尝试。
- /clear — 开始一个新的会话,通常基于你从刚刚学到的东西中提炼出的摘要。
虽然最自然的做法是继续,但其他四个选项的存在是为了帮助你管理上下文。
何时保持长时间运行的会话 vs 开始一个新会话?
我们的一般经验法则是:当你开始一项新任务时,你也应该开始一个新会话。
虽然 100 万的上下文窗口意味着你现在可以更可靠地处理更长的任务,例如从头开始构建一个全栈应用程序,但可能会发生上下文衰减。
有时你可能会处理相关的任务,其中一些上下文仍然是必要的,但并不总是如此。例如,为你刚刚实现的功能编写文档。虽然你可以开始一个新会话,但 Claude 将不得不重新读取你刚刚实现的那些文件,这会更慢且成本更高。
回退:回到过去
在 Claude Code 中,双击 Esc(或运行 /rewind)可以让你跳回到任何先前的消息并从那里重新提示。该时间点之后的消息将从上下文中删除。
**回退通常是更好的纠错方法。**例如,Claude 读取了五个文件,尝试了一种方法,但没有成功。你的直觉可能是输入“那没用,试试 X 代替。”但更好的做法可能是回退到文件读取之后,用你学到的东西重新提示。“不要使用方法 A,foo 模块没有暴露那个——直接去 B。”
你也可以使用“从此处总结”或 /rewind 斜杠命令让 Claude 总结其学习成果并创建一个交接消息,有点像来自尝试了某事但没成功的未来自我的、给之前迭代的 Claude 的消息。
压缩 vs 清理
一旦会话变得很长,你有两种方法来剥离多余的上下文:/compact 或 /clear(然后重新开始)。它们感觉相似但行为非常不同。
/compact要求模型总结迄今为止的对话,然后用该摘要替换历史记录。它是有损的,但你不必自己写任何东西,而且 Claude 在包含重要学习成果或文件方面可能更彻底。你也可以通过传递指令来引导它(/compact focus on the auth refactor, drop the test debugging)。/clear你写下重要的内容(“我们正在重构身份验证中间件,约束是 X,重要的文件是 A 和 B,我们已经排除了方法 Y”),然后重新开始。这需要更多工作,但产生的上下文是你认为相关的内容。
何时压缩会出错?
如果你运行了很多长时间运行的会话,你可能已经注意到压缩有时可能特别糟糕。在这种情况下,我们经常发现,当模型无法预测你的工作方向时,可能会发生糟糕的压缩。
在上面的例子中,自动压缩在一个漫长的调试会话后触发,并总结了调查过程,而你的下一条消息是“现在修复我们在 bar.ts 中看到的另一个警告。”
但因为会话重点是调试,另一个警告可能已经从摘要中被删除了。
这尤其困难,因为由于上下文衰减,模型在进行压缩时处于其最不智能的点。有了 100 万上下文,你有更多时间主动使用 /compact 并附上你想做什么的描述。
子代理:外包工作
子代理往往在你预先知道一块工作会产生大量你不再需要的中间输出时效果很好。
当 Claude 通过 Agent 工具生成子代理时,**该子代理会获得自己全新的上下文窗口。**它可以完成所需的所有工作,然后综合其结果,只有最终的报告返回给父代理。
我们在 Anthropic 使用的思维测试是:我将来还需要这个工具输出吗,还是只需要结论?
虽然 Claude Code 会自动调用子代理,但你可能想明确告诉它这样做。例如,你可能想告诉它:
- “使用子代理来运行那些测试。”
- “使用子代理来搜索这些文件。”
综合运用
为了帮助你选择使用哪个上下文管理功能,我们整理了这个有用的表格,概述了常见情况、应该使用什么工具以及原因。
| 情况 | 工具 | 原因 |
|---|---|---|
| 刚刚完成一个任务,准备开始一个相关但不相同的新任务 | /compact |
保持学习成果和文件路径,但为新任务腾出空间。 |
| 刚刚完成一个任务,准备开始一个完全无关的新任务 | /clear 或新会话 |
避免上下文衰减和不相关的文件分散注意力。 |
| Claude 走错了方向,你想纠正它 | /rewind |
回到问题发生之前,用新指令重新开始。 |
| Claude 产生了很多工具输出,但你只需要结论 | 子代理 | 将嘈杂的工作隔离在自己的上下文中,只带回最终结果。 |
| 会话变得很长,感觉“迟钝”或“困惑” | /compact 或 /clear |
重置上下文,摆脱可能累积的噪音或错误。 |
| 你想保留特定文件或学习成果供将来参考 | 在 /compact 或 /clear 中明确说明 |
引导模型或你自己的摘要,确保关键信息被保留。 |
更多推荐



所有评论(0)