Claude Code 学习站

Claude Code 会话降本指南:让每个 token 都花在刀刃上

官方博文要点摘要:解析 Claude Code 的 token 计价机制与提示缓存原理,给出 /clear、/compact、@-mention 等实操技巧,帮开发者降低长会话的使用成本。

本页目录7
要点速览
  • token 成本由模型选择、输入/输出比例(输出约为输入的 5 倍)、以及提示缓存命中率共同决定,缓存命中仅需 0.1x 输入价格
  • 切换 /model、/effort 或执行 /compact 会破坏提示缓存,导致整段上下文以最高 2x 价格重新预填,应在会话开始前一次性设好
  • 会话越长成本越呈指数上升,因为每一轮都要重新携带此前所有轮次;应善用 /clear 切换任务、/compact 收尾旧任务、/rewind 免费回退
  • 用 @文件名 直接附加文件比让 Claude 用 Read 工具查找更省 token,常用命令应在 CLAUDE.md 里配置安静(quiet)flag 减少噪音输出
  • 子代理(subagent)拥有独立上下文,适合处理产生大量但无需保留的输出(如日志处理),主会话只接收其汇总结果
  • 优化优先级依次为:会话长度 > 模型/effort 切换频率 > 上下文大小 > 命令输出体积

本文是对 Anthropic 官方博文「Maximizing the value of your Claude Code sessions」的中文要点摘要,完整内容以原文为准:https://claude.com/blog/maximizing-the-value-of-your-claude-code-sessions

这篇文章讲的核心问题是:同一个任务,用不同方式跟 Claude Code 交互,花费可能差很多。关键不在于少用 Claude Code,而在于确保消耗的 token 真正用在了你实际需要的事情上。比如同样是修 bug,高效路径是 Claude 直接读对应的测试文件和源文件、改完就结束;低效路径则是反复 grep、打开一堆无关文件,所有中间结果都堆积在会话里,后续每一轮都要重新携带这些内容。

token 价格由什么决定

三个变量共同决定成本:

  • 模型选择:更大的模型处理成本更高。
  • 输入 vs 输出:解码(输出)token 的成本大约是预填(输入)token 的 5 倍。
  • 提示缓存:命中缓存的 token 只需正常输入价格的 0.1x,而新写入缓存的 token 最高要付 2x(但只收一次)。

thinking(思考)token 的多少由 effort 等级控制,effort 越高、思考越多、成本越高。可以用 /model/effort 查看当前设置(系统会记住上次的选择),也可以用环境变量 MAX_THINKING_TOKENS=0 关闭思考(仅对当次会话生效,且 Fable 5 上不适用)。

提示缓存:省钱的关键机制

提示缓存的逻辑是:只要前缀 token 完全相同,就能复用之前的缓存状态,价格只要 0.1x;一旦前缀发生变化,后面所有内容都要重新预填。

以下操作会破坏缓存,导致整段上下文重新计价:

  • 中途执行 /model 切换模型
  • 中途执行 /effort 改变思考等级
  • 切换 fast mode
  • 执行 /compact(会重写整个会话历史)
  • 缓存过期(订阅用户约 1 小时,API key 用户约 5 分钟)

实操建议:

  • 需要回退历史时优先用 /rewind,它只是删掉末尾几轮,不产生额外成本,比 /compact 更便宜。
  • 想换模型或 effort,尽量在新会话开始时或 /clear 之后再改,不要在会话中途改。

什么决定一个会话发送了多少 token

会话里的文件内容和命令输出会在整个对话过程中被反复携带(虽然缓存命中时单价便宜,但依然占用上下文空间)。

会话开始时会预加载:工具定义、系统提示、CLAUDE.md、MCP 工具定义。 运行过程中会新增:Claude 读取的文件、执行命令的输出。

几条控制上下文体积的技巧:

  • /context 查看当前会话预加载了哪些内容。
  • CLAUDE.md 里只放必须遵守的规则,workflow 类的说明应该迁移到 skills 里,避免每次都占用固定预算。
  • 不需要的 MCP 服务器可以用 /mcp 关掉,省下它们的工具定义占用。
  • @文件名 直接把文件挂到消息里,比让 Claude 自己用 Read 工具去找更省一次工具调用;文件内容依然会占空间,但只需 mention 一次。
  • 给常跑的命令加上安静(quiet)输出的 flag,并写进 CLAUDE.md(例如 npx vitest run <file> --reporter=dot),避免噪音日志占满上下文。顺带一提,超过 30,000 字符的命令输出会被自动写入文件,只在会话里展示预览和路径。

会话能撑多少轮

这是最容易被忽视但影响最大的一点:会话越长、成本涨得越快,因为第 40 轮要重新携带前面 39 轮的全部内容。

应对方式:

  • 换任务时用 /clear 清空重来。
  • 一段任务告一段落时用 /compact 做总结压缩,可以在 compact 指令里指定要保留的内容,或者提前写进 CLAUDE.md。
  • 想保留会话方便之后继续,可以先 /rename 命名再 /clear

有个容易踩的坑:如果用 /loop 在原会话里反复触发任务,每次触发都算完整的一轮;要是间隔超过 1 小时,缓存会失效,导致重新预填。更省钱的做法是开一个新的 terminal、新会话来跑 loop。

另外,Claude Code v2.1.221+ 支持 /autocompact 200k 这类阈值设置,自动在合适的时机做 compact。

子代理(Subagents)

子代理有自己独立的上下文(独立的系统提示、工具集、CLAUDE.md),主会话只会收到子代理最终汇总的结果,而不会把它探索过程中的中间内容全部拉进主会话。

适合用子代理的场景:某个工作会产生大量输出,但这些输出本身不需要留在主会话里(比如批量处理日志)。Claude 会自动选择使用子代理,用户也可以显式要求。对于会反复执行的任务,还可以定义专用子代理并指定较便宜的模型(比如用 haiku 而非 sonnet)。

代价是:子代理看不到主会话的对话历史,可能会重复读取一些主会话其实已经知道的内容。

优化时该先看哪里

文章给出了按影响程度排序的四个优化重点:

  1. 会话长度(轮数)
  2. 模型 / effort 中途切换的频率(缓存失效)
  3. 上下文整体大小
  4. 命令输出体积

命令速查

命令 / 操作作用
/clear清空会话,开始新任务
/model切换模型(会破坏缓存)
/effort调整 thinking 等级(会破坏缓存)
/context查看当前预加载的上下文内容
/compact压缩总结历史对话
/rewind免费回退末尾几轮
/rename重命名会话,便于之后 /clear 后找回
/mcp管理 MCP 服务器的开关
@文件名直接附加文件,省去 Read 调用
/loop按间隔循环运行任务
/autocompact 200k设置自动 compact 阈值
MAX_THINKING_TOKENS=0关闭 thinking token

总体来说,这篇文章的建议可以归纳为一句话:任务与任务之间果断 /clear,模型和 effort 在会话开始前定好,善用 @ 挂文件和 quiet flag 控制输出体积,长时间不用就先 /compact 再离开。