新智元报道
(资料图)
就在刚刚,Anthropic发了一篇博客。
核心信息就是:各位,别再烧冤枉token了,我们都看不下去了!
为此,官方详细列举了六条省钱心法,先贴为敬:
1. 任务做完就/clear。修完一个bug就清掉当前对话,别让上一个任务读过的文件和命令输出拖进下一个任务里,白白占着上下文。
2. 开局就定好模型和推理强度(effort level)。中途切换的话,之前积累的提示缓存会全部失效,整段对话历史要按全价重新计算一遍。
3. 用@引用文件,别手打路径。用@直接把文件附到消息里,Claude不用再花一次工具调用去读。如果你只打文件名,Claude可能先搜一圈再打开好几个文件试探,这些操作全部会进入对话历史,之后每一轮都带着。
4. 给输出多的命令加静默参数(quiet flag)。在CLAUDE.md里写一句类似--reporter=dot的配置,让测试输出只打印几行摘要,不是几百行详情。输出越短,占的上下文越少。
5. /compact在休息前做。对话还在缓存里的时候压缩,成本只有正常的十分之一。等你回来缓存过期了再压,就得按全价重新读一遍再压缩。
6. 大输出任务扔给子Agent。子Agent在一个独立的上下文窗口里运行,做完只把结论传回来,过程中读的文件和跑的命令输出不会进入你的主对话。
一个token的前世今生
用Claude Code干活,API按量走,订阅制月费从20美元到200美元分三档。
根据官方推算,开发者日均消耗13美元token,月均花在150到250美元之间。
这还只是平均水平。同样修一个bug,问法不同,花费能差出好几倍。
而且每一轮对话都在拖着前面所有轮的全部内容重新发送,会话越长,每一轮就越贵。
这些钱花在哪,得从token的计价逻辑说起。
每次你在Claude Code里输入一条指令,背后发生两件事。
第一件叫预填充(prefill),也就是模型一口气读进你的整个请求,包括系统提示词、CLAUDE.md、你的消息,以及之前对话里积累的一切。这些都是输入token。
第二件叫解码(decode),也就是模型一个字一个字往外写的过程,包括它的思考、工具调用和你最终看到的文字。这些都是输出token。
关键区别在这里。
预填充是并行的,一次性把所有输入token过一遍GPU。解码是串行的,每吐一个token都要跑一次模型。200个token的回复,就是200次独立运算。
所以也就不难理解,为什么输出token要比输入token贵5倍了。
在这个基础上,最终账单取决于两件事。
第一是模型,决定每个token的单价。
Opus 5,输入5美元/百万token,输出25美元。
Sonnet 5,输入2美元,输出10美元。
Haiku 4.5,输入1美元,输出5美元。
第二是推理强度,决定token的数量。
一个会话里大部分输出token都是思考token,推理强度控制的就是这个量。推理强度越高,模型想得越久,输出的思考token越多。max和low之间能差好几倍。
简单活用Sonnet,硬骨头才上Opus。牛刀杀鸡的钱,花得最冤。
提示缓存,是最大的省钱利器
token定价里还有一个巨大的变量,就是缓存。
Claude Code的每次请求都从相同的前缀开始,也就是系统提示词、工具定义、CLAUDE.md和对话历史。
如果这次请求的前缀和上次逐字节一样,服务器就不重新算,直接加载上次的计算结果。
缓存读取只要正常输入价的0.1倍,直接省掉90%。
写入缓存贵一点,最高2倍。但写入只发生一次,后面每一轮都享受0.1倍读取。
举个例子。
假设你的对话历史有5万个token。不走缓存的话,每一轮光是重读这5万token就得付全价。但只要命中缓存,同样的5万token只需要花十分之一的钱。
一个会话跑二三十轮,缓存命中攒下来的折扣是天文数字。
这是你最大的薅羊毛杠杆。
但缓存有个致命弱点。它必须从请求的第一个字节开始连续匹配,中间任何地方变了,从那里往后全部作废。
具体来说,一共有六种情况:
1. /model切模型:每个模型的缓存独立。从Sonnet切到Opus,整个对话历史按Opus的价格重新预填充,没有折扣。
2. /effort切推理强度:推理强度也是cache key的一部分,切换之后整个对话历史都要重新计算。
3. 开关Fast mode:效果和前两种一样,缓存直接失效。
4. /compact压缩对话:对话被重写成摘要,原来的内容全部对不上,旧缓存直接作废。
5. 时间过期:订阅用户的缓存保活1小时,API用户默认5分钟。超时后下一轮全量重算。
6. 恢复旧会话:隔了太久缓存早就没了,几乎100%要全价重新计算。
坏消息是,只要中一个就意味着整个对话历史从0.1倍打回原价。
好消息是,当你知道什么会让缓存失效时,就能知道怎么保住它。
比如,会话开头就锁定模型和推理强度,全程不切。不在缓存还热的时候做/compact,等到准备休息的时候再跑。
这里,还有个隐藏坑。
opusplan模式每次进出plan都切模型。进一次,缓存失效一次。出来,又失效一次。来回跳的话,每跳一次都是一笔全价prefill。
你的会话,正在偷偷变胖
缓存帮你把重复发送历史的成本压到十分之一。
但有一件事它帮不了。你的历史本身在一轮一轮地膨胀。
每次Claude读一个文件,文件内容追加到对话里。每次Claude跑一个命令,输出也追加进去。从追加那一轮起,后面每一轮都带着。
第40轮对话在重新发送第1到39轮的全部累积内容。
这种增长,是接近平方级别的O(n²)。
CClaude Code有个兜底机制。
命令输出超过30000字符,就不往对话里塞了,而是写到一个临时文件里,对话里只放一句摘要。但30000以下的输出没人管。
比如一个测试框架跑完,打印400行通过记录,每行几十个字符,总量不到3万,够不上这个阈值。
于是这400行就原封不动地留在了对话历史里,后面每一轮都跟着重新发送一遍。
对此,Anthropic博客里给了几招很实用的瘦身方法。
1. @引用文件。
不要手动输入路径让Claude自己去找。@引用会把文件直接附到消息里,省掉一次读取操作。
你只说文件名的话,Claude可能先grep搜一圈,打开好几个文件看哪个对。然后这些试探就会全部进入对话历史,徒增成本。
2. 给noisy命令加quiet flag。
在CLAUDE.md里写一句「run tests with npx vitest run --reporter=dot」,以后每次跑测试只输出几行点状结果,不是几百行详情。一分钟的配置,以后每个会话省几百行上下文。
3. subagent隔离大输出任务。
subagent在自己独立的上下文窗口里跑,做完只传答案回来,过程中读的文件和命令输出全部丢弃。适合「去翻翻日志有什么异常」「帮我过一遍这个大文件」这种活。你只要结论,不要过程。
还有最重要的一条。
4. /clear切任务。
修完一个bug就/clear,开始下一件事。上一个bug的文件、命令输出、中间探索,全部和下一个任务无关,但如果不清,它们在后面每一轮都占着位置、吃着token。
不想彻底清空的话,/compact可以把对话压成摘要。一万到两万个token能压到一千到三千。
此外,博客里还提了一个冷门但免费的操作,/rewind。
如果最后几轮跑偏了,/rewind直接砍掉那几轮,前面的缓存完全不动。
管token,也是一种开发者素养
上面这些操作拆完,你会发现一个规律。写代码的人正在长出一套新技能。
跟框架和语言没关系,而是知道该选什么模型、怎么管上下文、怎么保住缓存、推理强度开多高合适。
这些能力一年前并不存在。但它现在却决定了你在同一个任务上,是花3美元还是30美元。
Anthropic自己就是最好的例子。
他们80%的代码靠AI写,代码合并量一年翻了8倍,基准测试加速52倍。AI用到这个强度,如果没人管token,光推理成本就能把预算吃穿。
从这个角度看,与其说这篇博客讲的是省钱技巧,不如说是AI时代写代码的人需要长出来的一种新本能——
知道你的每一个操作在消耗什么,知道怎么让同样的预算干出更多的活。
读懂它的人,薅到的不只是几美元的token。
参考资料:
https://claude.com/blog/maximizing-the-value-of-your-claude-code-sessions
编辑:摩西