本页目录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 分钟)
实操建议:
什么决定一个会话发送了多少 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)。
代价是:子代理看不到主会话的对话历史,可能会重复读取一些主会话其实已经知道的内容。
优化时该先看哪里
文章给出了按影响程度排序的四个优化重点:
- 会话长度(轮数)
- 模型 / effort 中途切换的频率(缓存失效)
- 上下文整体大小
- 命令输出体积
命令速查
| 命令 / 操作 | 作用 |
|---|---|
/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 再离开。