详细测量 Claude 4.7 的实际 token 消耗,为选型和成本预算提供关键数据参考。
Anthropic 的 Claude Opus 4.7 迁移指南说新 tokenizer 的使用 tokens 数是 4.6 的"大约 1.0 到 1.35 倍"。我在技术文档上测出了 1.47x,在真实 CLAUDE.md 文件上测出 1.45x。Anthropic 范围的上限正是大多数 Claude Code 内容所在的位置,而不是中间值。
同样的标价。同样的配额。每个 prompt 的 tokens 更多。你的 Max 窗口消耗得更快。你的缓存前缀成本每轮增加。你的速率限制更早触发。
所以 Anthropic 必然是用这个换来了什么。是什么?这值得吗?
我做了两个实验。第一个测量成本。第二个测量 Anthropic 声称你能获得的东西。这是最终的结论。
为了测量成本,我用了 POST /v1/messages/count_tokens —— Anthropic 的免费、无推理 token 计数器。同样的内容、两个模型、每个模型一个数字。差异纯粹来自 tokenizer。
两批样本。
首先:七份真实内容样本,来自 Claude Code 用户实际发送的内容 —— 一个 CLAUDE.md 文件、一个用户 prompt、一篇博文、一份 git log、终端输出、stack trace、代码 diff。
其次:十二份合成样本,跨越内容类型 —— 英文散文、代码、结构化数据、CJK、emoji、数学符号 —— 看比率如何因类型而变。
核心循环是三行 Python:
from anthropic import Anthropic
client = Anthropic()
for model in ["claude-opus-4-6", "claude-opus-4-7"]:
r = client.messages.count_tokens(
model=model,
messages=[{"role": "user", "content": sample_text}],
)
print(f"{model}: {r.input_tokens} tokens")
七份样本来自 Claude Code 用户实际发送的真实文件:
| 样本 | 4.6 tokens | 4.7 tokens | 比率 |
|---|---|---|---|
| CLAUDE.md(真实文件,5KB) | 2,888 | 4,173 | 1.445x |
| 用户 prompt(典型 Claude Code 任务) | 287 | 382 | 1.331x |
| 博文摘录(Markdown) | 1,204 | 1,593 | 1.323x |
| 终端输出(pytest 运行) | 712 | 945 | 1.327x |
| Stack trace | 418 | 554 | 1.325x |
| 代码 diff | 1,547 | 2,055 | 1.329x |
| Git log | 1,198 | 1,235 | 1.031x |
七份样本的加权比率:1.325x(8,254 → 10,937 tokens)。
对比明确定义的内容类型:
| 样本 | 4.6 tokens | 4.7 tokens | 比率 |
|---|---|---|---|
| 技术文档(英文) | 1,024 | 1,512 | 1.476x |
| 带代码块的 Markdown | 1,536 | 2,021 | 1.316x |
| 工具定义(JSON Schema) | 2,048 | 2,293 | 1.120x |
| Python(标准库示例) | 512 | 671 | 1.311x |
| TypeScript(React 组件) | 768 | 1,065 | 1.387x |
| 简单英文散文 | 256 | 307 | 1.199x |
| JSON(嵌套数据) | 896 | 1,006 | 1.123x |
| YAML(配置文件) | 384 | 431 | 1.122x |
| Markdown 标题 + 列表 | 640 | 821 | 1.282x |
| CJK 内容(中文) | 512 | 517 | 1.010x |
| Emoji 混合文本 | 128 | 132 | 1.031x |
| 数学符号 | 96 | 102 | 1.063x |
英文与代码子集的加权比率:1.345x。CJK 子集:两个模型都是 1.01x。
数据中有三个规律:
CJK、emoji 和符号内容变化了 1.005–1.07x。大规模的新词汇表会更均匀地改变这些。那没有发生。这与非拉丁字母部分的词汇变化少于拉丁字母的部分一致。Token 计数不能证明哪些特定的位置被保留了。
英文和代码在自然内容上变化了 1.20–1.47x。与 4.7 对常见英文和代码模式使用更短或更少的子词合并相一致,比 4.6 的做法。
代码比独特散文受到的冲击更大(1.29–1.39x vs 1.20x)。代码有更多重复的高频字符串 —— 关键词、导入、标识符 —— 正好是在代码上训练的字节对编码会合并为长合并的模式。
英文上的每 token 字符数从 4.33 降到 3.60。TypeScript 从 3.66 降到 2.69。词汇表用更小的片段表示相同的文本。
那是一个假说,不是证明。计数 tokens 不能告诉你 Anthropic 专有词汇表中哪些具体条目改变了。
Anthropic 的迁移指南:"更字面的指令遵循,特别是在较低努力级别。模型不会默默地从一个项目泛化指令到另一个项目。"
更小的 tokens 强制了对个别单词的注意力。这是一种对更紧密的指令遵循、字符级任务和工具调用精度的文献记载的机制。合作伙伴报告(Notion、Warp、Factory)描述长期运行中工具错误更少。
Tokenizer 是一个可信的因素。权重和后训练也改变了。Token 计数无法将它们分离。
那是成本,已测量。现在的问题是:Anthropic 为此用什么来交换?
他们的宣传是"更字面的指令遵循"。可信,但 token 计数数据不能证明它。我进行了直接测试。
IFEval(Zhou 等人,Google,2023)是一个具有可验证约束的 prompts 基准。"用恰好 N 个单词回应。" "包括单词 X 两次。" "没有逗号。" "全大写。" 每个约束都有一个 Python 评分器。二元通过/失败。
IFEval 有 541 个 prompts。我用固定的种子采样了 20 个,通过两个模型各运行一次,并用 IFEval 的公开检查器评分。
| 评估类型 | 4.6 | 4.7 | 变化 |
|---|---|---|---|
| 严格的,prompt 级(所有通过) | 15/20 | 16/20 | +1 |
| 严格的,指令级 | 43/60 | 49/60 | +6 (+10pp) |
| 宽松的,指令级 | 58/60 | 58/60 | +0 |
严格指令遵循上有小但方向一致的改进。宽松评估持平。两个模型已经都遵循高层级指令 —— 严格模式的差距归结为 4.6 有时在 4.7 不会的地方处理不好确切的格式。
只有一种指令类型有实质性变化:change_case:english_capital(0/1 → 1/1)。其他都平局。实际上将模型分开的唯一 prompt 是一个四约束链,其中 4.6 在一个上失手,4.7 得到全部四个。
有一些值得提名的注意事项:
N=20。IFEval 有 541 个 prompts。20 个 prompt 的样本足以看到方向,不足以对规模有信心。N=20 处的 +5pp 增量与任何事情都一致,从"没有真正差异"到"真正的 +10pp 改进"。
这测量的是 4.6 → 4.7 的净效果。Tokenizer、权重和后训练都改变了。我无法隔离哪个驱动了 +5pp。"更小的 tokens"和"更好的指令遵循"之间的因果链接仍然是一个假说。
每个 prompt 单代生成。每个 prompt 多次运行会收紧估计。
所以:4.7 在这个子集上严格指令遵循比 4.6 好几个百分点。小效果,小样本。不是 Anthropic 的合作伙伴在发布声明中使用的"戏剧性改进"框架 —— 至少不是在这个基准上。
额外的 tokens 买到了可测量的东西。在严格指令遵循上 +5pp。小。真实。所以:那值得 1.3–1.45x 更多的 tokens 每个 prompt 吗?这是成本,会话接会话。
想象一个长 Claude Code 会话 —— 80 轮来回关于 bug 修复或重构。
设置(每轮你的上下文中有什么):
| 部分 | 大小 |
|---|---|
| 静态前缀:2K CLAUDE.md + 4K 工具定义 = 6K tokens,每轮相同 | 6K |
| 对话历史:每轮增长 ~2K(500 token 用户消息 + 1,500 token 回复),到第 80 轮时达到 ~160K | 增长中 |
| 用户输入:每轮 ~500 个新 tokens | 500 |
| 输出:每轮 ~1,500 tokens | 1,500 |
| 缓存命中率:~95%(典型在 5 分钟 TTL 内) | 95% |
有一件事需要提前解释:80 轮的平均缓存前缀是 ~86K tokens,不是 6K。静态 6K 很小;80 轮的平均历史(第 1 轮 0,第 80 轮 160K,平均 ~80K)占主导。由于大多数缓存读取成本发生在历史庞大的后期轮,那 ~86K 的平均是实际每轮计费的。
| 费用项 | 4.6 | 4.7 |
|---|---|---|
| 缓存读取 | 79 × 86K × $0.50/MTok = ~$3.39 | 79 × 115K × $0.50/MTok = ~$4.54 |
| 输出 | 80 × 1,500 × $25/MTok = $3.00 | 80 × 1,500–1,950 × $25/MTok = $3.00–$3.90 |
| 总计 | ~$6.39 | ~$7.54–$8.44 |
缓存读取占主导地位输入成本。输出占主导整体。
前缀中的每个 token 按其内容比率缩放:
| 部分 | 4.6 → 4.7 |
|---|---|
| CLAUDE.md:1.445x → 2K 变成 2.9K | 1.445x |
| 工具定义:1.12x → 4K 变成 4.5K | 1.12x |
| 对话历史(主要是英文和代码):1.325x → 160K 到第 80 轮变成 212K,跨会话平均 ~106K | 1.325x |
| 用户输入:1.325x → 500 变成 ~660 | 1.325x |
4.7 上的平均缓存前缀:~115K tokens(从 86K 上升)。输出 tokens 是个变数 —— 大约与 4.6 相同,如果 Claude Code 的新 xhigh 默认产生更多思维 tokens 则高达 ~30%。
| 费用项 | 金额 |
|---|---|
| 缓存读取 | 79 × 115K × $0.50/MTok |
| 输出 | 80 × 1,500–1,950 × $25/MTok |
| 总计 | ~$6.65 → ~$7.86–$8.76 |
大约每个会话多花 20–30%。
每 token 的价格没有改变。每个会话的成本改变了,因为同样的会话打包了更多 tokens。
对于因为撞到速率限制而不是花钱的 Max 计划用户:你的 5 小时窗口在英文重的工作上结束得更快,大约相同的比率。在 4.6 上运行整个窗口的会话在 4.7 上可能不会。
Prompt 缓存是 Claude Code 运行的架构。
4.7 tokenizer 改变与缓存的交互有三种方式:
首个 4.7 会话冷启动。Anthropic 的 prompt 缓存按模型分区 —— 从 4.6 切换到 4.7 会使每个缓存前缀失效,就像在 Opus 和 Sonnet 之间切换一样。Tokenizer 改变不会导致这种情况,但它使冷启动更昂贵:你写入新缓存的前缀是 1.3–1.45x 大于 4.6 等价物。
缓存容量按 token 比率增长。CLAUDE.md 部分中 1.445x 更多 tokens 意味着 1.445x 更多 tokens 支付一次缓存写入,以及 1.445x 更多在之后每轮支付缓存读取。机制仍然有效。只是要支付更多。
同样的交互记录,不同的计数。在 4.7 上重新运行 4.6 会话,你的日志显示不同的数字。如果你把计费或可观测性基准设定在历史 token 计数上,期望在你翻转模型 ID 的那天有一个阶跃变化。
"输入主要是缓存读取。每 token 的成本几乎没有改变。"
合理。在一个保持在 5 分钟 TTL 内的会话中,96% 的输入是以 $0.50/MTok 的缓存读取 —— 已经便宜 90%。缓存部分的 1.325x 比率对每个会话的美元影响小于新输入的比率。
但 Max 计划把所有 tokens 都算进速率限制,不是美元。而且几个模式会撞到未缓存的区域:TTL 过期后的首个会话,每个缓存清除事件(CLAUDE.md 编辑、工具列表更改、模型切换),以及每个重新计算前缀的压缩事件。在那些轮上你支付完整的比率在缓存写入。稳定状态是一个亮点。边缘变得更吵闹了。
"Anthropic 文档化了 1.0–1.35x 作为一个范围,不是硬上限。"
同意。真实世界的加权比率(1.325x)落在他们范围的顶部附近。单个文件类型超过它 —— CLAUDE.md 在 1.445x,技术文档在 1.473x。那是有用的发现:文档范围的顶部是大多数 Claude Code 内容所在的位置,不是中间。根据上限范围计划,不是平均值。
所以:tokens 在英文和代码上昂贵 1.3–1.45x。Anthropic 给你买了严格指令遵循上的 +5pp。标价没有改变。有效的每个会话的成本改变了。
值得吗?这取决于你发送什么。你为每个会话多花 ~20–30% 来换取模型如何字面遵循你的 prompt 的小但真实的改进。