今天我们为 /usage 推出了一项新更新,帮助你更好地了解自己在 Claude Code 中的使用情况。这次更新源于我们与大量用户的深入交流。

在这些对话中反复出现的一个主题是:大家的会话管理方式差异巨大,尤其是在 Claude Code 升级到百万上下文窗口之后。

你是只开一个会话还是在终端里保持两个?你是每次提问都新开一个会话?什么时候用 compact、rewind 或子智能体?什么情况下会导致压缩效果不好?

这些细节的影响远超你的想象,它们真正塑造了你使用 Claude Code 的体验——而这一切的核心,都在于如何管理你的上下文窗口。

上下文、压缩与上下文衰减速览

上下文窗口是模型生成下一个响应时能”看到”的全部内容,包括系统提示词、到目前为止的对话记录、每一次工具调用及其输出,以及所有读取过的文件。Claude Code 的上下文窗口为一百万 token。

不幸的是,使用上下文会带来一定的代价,这通常被称为上下文衰减(Context Rot)。所谓上下文衰减,是指随着上下文不断增长,模型性能会逐渐下降——因为注意力被分散到越来越多的 token 上,而早期那些不再相关的内容开始干扰当前任务。

上下文窗口有一个硬性上限,所以当你接近窗口末端时,你需要把当前任务总结成一段更精简的描述,然后在新的上下文窗口中继续工作——我们把这个过程叫做压缩(Compaction)。你也可以手动触发压缩。

每一轮对话都是一个分叉点

假设你刚让 Claude 做了一件事,它已经完成了。此时你的上下文中已经积累了一些信息(工具调用、工具输出、你的指令),而你接下来有多种选择:

  • 继续 — 在同一个会话中发送下一条消息
  • /rewind(Esc Esc) — 跳回到之前的某条消息,从那里重新开始
  • /clear — 开启一个新会话,通常附带你从刚才的工作中提炼出的简要说明
  • Compact — 总结当前会话内容,然后在摘要之上继续工作
  • 子智能体 — 把下一步工作交给一个拥有全新上下文的智能体,只把最终结果拉回主会话

虽然最自然的做法是直接继续,但后四个选项的存在就是为了帮你管理上下文。

什么时候该新开会话

什么情况下应该保持一个长会话,什么时候应该新开一个?我们的经验法则是:当你开始一项新任务时,也应该开启一个新会话。

百万上下文窗口意味着你现在可以更可靠地完成更长的任务,比如从头构建一个全栈应用。

有时你会做一些相关的任务,其中部分上下文仍然有用,但不是全部。比如为你刚实现的功能编写文档。虽然你可以新开一个会话,但 Claude 就得重新读取你刚写好的那些文件,这会更慢、成本也更高。

用回退代替纠正

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

在 Claude Code 中,双击 Esc(或执行 /rewind)可以跳回到之前的任意一条消息,从那里重新提问。该点之后的所有消息都会从上下文中移除。

回退往往是比纠正更好的选择。举个例子:Claude 读取了五个文件,尝试了一种方案,但没有成功。你的直觉可能是输入”那个方法不行,试试 X 吧”——但更好的做法是回退到文件读取完成之后,带着你学到的经验重新提问:“不要用方案 A,foo 模块没有暴露那个接口——直接用方案 B。”

你还可以使用”从此处总结”功能,让 Claude 总结它的发现并生成一条交接消息——就像是未来的 Claude 给之前那个版本的自己留了一封信,告诉它”我试过了,没用”。

压缩 vs. 全新会话

当一个会话变得很长时,你有两种减负方式:/compact 或 /clear(重新开始)。它们感觉类似,但行为截然不同。

Compact 让模型总结当前对话,然后用这份摘要替换历史记录。它是有损的——你得信任 Claude 来判断什么是重要的——但好处是你不需要自己动手写,而且 Claude 可能会更全面地保留重要的发现或文件信息。你也可以通过传入指令来引导压缩方向(比如 /compact 聚焦认证重构部分,去掉测试调试的内容)。

而 /clear 是由你自己写下重要的内容(“我们在重构认证中间件,约束条件是 X,关键文件是 A 和 B,我们已经排除了方案 Y”),然后从零开始。这需要更多工作,但产生的上下文完全是你认为相关的内容。

什么会导致压缩效果不好?

如果你经常运行长会话,可能偶尔会遇到压缩效果特别差的情况。我们发现,糟糕的压缩往往发生在模型无法预判你下一步工作方向的时候。

举个例子:一次漫长的调试会话后自动压缩触发了,它总结了整个调查过程——然后你的下一条消息是”现在去修一下我们在 bar.ts 里看到的那个警告”。

但由于会话一直聚焦在调试上,那个警告可能已经在摘要中被丢弃了。

这个问题尤其棘手,因为由于上下文衰减的存在,模型在执行压缩时恰恰处于其”最不聪明”的状态。有了百万上下文窗口,你有更充裕的时间来主动执行 /compact,并附上你接下来打算做什么的描述。

子智能体与全新上下文窗口

子智能体(Subagent)是一种上下文管理手段,适用于你提前知道某项工作会产生大量中间输出、而这些输出之后不再需要的场景。

当 Claude 通过 Agent 工具生成一个子智能体时,该子智能体会获得一个全新的上下文窗口。它可以完成所有需要的工作,然后将结果浓缩提炼,只把最终报告返回给主会话。

我们使用的判断标准是:我之后还需要这些工具输出本身,还是只需要结论?

虽然 Claude Code 会自动调用子智能体,但你也可以显式地指示它这样做。比如:

  • “启动一个子智能体,根据这份规格文件验证这次工作的结果”
  • “启动一个子智能体,通读另一个代码库,总结它是如何实现认证流程的,然后你用同样的方式在这里实现”
  • “启动一个子智能体,根据我的 git 变更为这个功能编写文档”

总结

总而言之,当 Claude 完成一轮输出、你即将发送下一条消息时,这就是一个决策点。

随着时间推移,我们期望 Claude 能够自动帮你处理这些决策,但目前来说,这是你引导 Claude 输出质量的重要方式之一。

相关笔记