接口单价一行没动,账单却像被谁悄悄调高了档位。你盯着「$5 / 1M tokens」算来算去,发现字节数、调用次数都对得上,就是总额不对劲。真正掏你钱包的是另外一个变量:同一段代码,被不同家 Tokenizer 切成了完全不一样的片数。
Playcode 对同一批 TypeScript 样本调用各家的官方计数接口后发现:字节数没有变化,计费结果却明显不同——Anthropic 的新 Tokenizer,把同一段 TypeScript 切出了 GPT 的 1.73 倍 Token。
也就是说,你以为自己在用「同价位」模型,实际是在用「被放大了 73% 的计费尺子」。
同样一段 TypeScript,为什么 Claude 比 GPT 多算 73% Token?
同一段文本会不会在不同模型下算出不同 Token 数?会,而且差异非常大,尤其在代码上。
简单说:每家模型的 Tokenizer 就像不同刻度的尺子,你按「每 1000 刻度多少钱」付费,刻度密不密由对方说了算。
- GPT-5 系列使用的是
o200k_baseTokenizer(文档公开,刻度比较固定) - Anthropic 在 Sonnet 5 / Opus 4.8 / Fable 5 换上了新 Tokenizer
- Playcode 这篇测试用同一批文件,分别丢给各家「官方计数接口」数 Token,再对比差异
核心发现(对 GPT-5 o200k 取 1.00x 做基准):
| 内容类型 | Claude 新 Tokenizer | Claude 旧 Tokenizer |
|---|---|---|
| TypeScript | 1.73x | 1.32x |
| Rust | 1.58x | 1.22x |
| JavaScript | 1.52x | 1.26x |
| Python | 1.50x | 1.22x |
| HTML | 1.36x | 1.18x |
| 英文 prose | 1.40x | 1.05x |
| 中文 prose | 1.44x | 1.45x |
也就是说:同一段 TypeScript,GPT 算 1000 Token,Claude 新 Tokenizer 可能算到 1730 Token。
如果两家标价都是「$5 / 1M input tokens」,那有效价格就变成:
- GPT:$5 / 1M 实际 Token
- Claude:$5 / 1M 计费 Token,但每段内容会被切得更碎
用 Playcode 的估算,Opus 4.8 在代码场景下的「等效价格」已经接近:
- 标价:$5 / $25
- 体感:$7.5 / $37.5(因为 Token 多了 ~50% 左右)
关键点:你账上看到的不是文本长度,是 Tokenizer 切出来的片数,而片数是各家私有实现。
为什么看起来像「没涨价」,账单却上去了?
账单 = Token 数 × 单价。官方价格页只告诉你单价,但真实花出去的钱,是两条线一起动:
- 单价:$ / 1M tokens —— 大家盯着看
- Token 数:同一内容被切成多少块 —— 大家基本没看
Anthropic 这次操作就是典型:
- Sonnet 4.6 / Opus 4.6:旧 Tokenizer
- Sonnet 5 / Opus 4.8 / Fable 5:新 Tokenizer
- 价格表上:Opus 4.6 和 4.8 标价一样,Sonnet 5 还是「限时降价」
但实测下来:
- 英文 prose:+34% Token
- Python:+23%
- TypeScript:+31%
- JSON schema:+26%
- 某个长 system prompt:+39%
如果你是做 Agent / 代码助手的,系统提示 + JSON schema + 代码几乎是标配,按权重一加权,整条链路大概多出 30% 左右的 Token。
这种成本变化很容易被误判成调用次数统计错误:调用链路没有变化,模型版本一换,毛利率却慢慢往下拐。只有把同一批请求交给各家的官方计数接口,才能把 Tokenizer 导致的增量单独拆出来。
Sonnet 5 的「首发优惠」刚好把这 30% 抵掉了一部分,所以你短期会觉得「好像比 4.6 还便宜」。但官方已经写明:
- Intro 价到 2026-08-31 为止
- 之后单价回到 $3 / $15,Token 依然按新 Tokenizer 计
直接翻译成人话:同样一套功能,你的 Tokenizer 切得更碎了;现在给你打折,习惯之后恢复原价,这个折扣就变成了隐性涨价。
这跟我的项目有什么关系?(尤其是写代码的)
从 Playcode 那组测试可以看到一个很明显的规律:代码 > HTML > 英文 prose > 中文,越结构化、符号越密集的内容,差距越大。
换成你熟悉的场景,大概会变成这样:
你写的是全 TypeScript + JSON API,每次请求都像一根塞满货物的管子。系统提示长达几千字,定义了一堆工具 schema。Agent 工作流里,每一步都把整个上下文重新塞给模型,生怕它「忘记」前面发生了什么。
这时候 Anthropic 新 Tokenizer 带来的影响会叠加:
- 系统提示:多 30~40% Token
- 工具 schema:多 20~30% Token
- TypeScript 片段:多 30~70% Token(看具体结构)
只要你没改变任何逻辑,光是换模型版本,整条链路就可能多花 30%+ 的 Token 成本。
按一个典型的 Agent 流水线估算:
- 每个请求平均 4k Token(系统提示 + schema + 输入 + 代码上下文)
- 其中 70% 是「结构化内容」(代码 + JSON + prompt)
- 新 Tokenizer 在这一块平均多 30% 左右
- 整体每次调用 Token = 0.3 × 0.7 ≈ 21% 的隐形放大
如果你一周跑几百万 Token,这个 21% 完全可以撑起一杯咖啡;但如果你是 SaaS,月度几百亿 Token,这就是直接影响毛利的数。我不敢说所有项目都会放大到这个程度,但只要你堆了大量结构化上下文,走势大概率差不多。
我要怎么判断「是 Tokenizer 在偷钱」还是「我自己喂多了」?
怎么快速判断不同模型的 Token 差异?
一个实用方法:用官方计数接口对比同一批样本。
- OpenAI:用
tiktoken的o200k_base直接数 - Anthropic:用
count_tokens接口 - Gemini / Grok:用各家提供的 token-count API
步骤可以这样:
- 准备一批「真实样本」:
- 2~3 个 TypeScript 文件
- 1 个长 system prompt
- 1 个 JSON schema(工具定义)
- 1 个典型用户输入
- 写一个小脚本,对每段样本:
- 调 Anthropic
count_tokens - 本地用
tiktoken数 GPT 的 Token
- 调 Anthropic
- 算一个比值:Anthropic / GPT
判断标准:如果你主要内容是代码,这个比值长期在 1.5x 以上,那可以直接把 Anthropic 的标价乘上 1.5 再跟 OpenAI 对比。
一段自包含结论(方便你贴给老板)
在大模型 API 成本里,价格表上的 $/Mtoken 只是表面,真正决定账单的是「Tokenizer 如何把你的内容切成多少 Token」。不同厂商的 Tokenizer 差异可以高达 70%:同一段 TypeScript,Anthropic 新 Tokenizer 会比 GPT 的 o200k_base 多出 1.73 倍 Token。再叠加长 system prompt、JSON schema 等结构化内容,整条 Agent 链路的 Token 数可以在不改任何业务逻辑的前提下多出 20~30%。这等于在单价不变的情况下,实际成本被悄悄抬高。任何严肃依赖 API 的产品,都应该把「按内容类型评估 Tokenizer 差异」当成模型选型的必备步骤,而不是只看官方价格页。
在代码 / Agent 场景里,怎么减少被 Tokenizer「薅」?
1. 按内容类型选模型,而不是全场一个
问题不在于「某家贵」,而是在于不同模型在不同内容类型上的计费效率完全不同。
一个简单的决策表可以这样:
| 内容类型 | 推荐模型优先级(按 Token 经济性) |
|---|---|
| TypeScript | GPT-5.x / Gemini / Grok → Claude |
| Rust/Python | GPT-5.x / Gemini / Grok → Claude |
| HTML/Markdown | GPT-5.x ≈ Claude(差异中等) |
| 英文 prose | GPT-5.x / Gemini / Grok → Claude |
| 中文 | 差异不大(甚至 Claude 稍高) |
不是说「不要用 Claude」,而是:
- 代码助手 / Agent 工程:用 GPT 管理「结构化上下文」(代码、schema)
- 写作 / 对话 / 产品文案:可以视效果用 Claude,Token 差异对你没那么致命
如果你已经用 Anthropic 写整体业务逻辑,可以考虑:
- 代码相关上下文提前在 GPT 侧摘要成「更短的约束」再扔给 Claude
- 或者在 GPT 侧做「工具调用规划」,Claude 只负责自然语言和决策
另一种可测试的路由方式是:用 Claude 做高层决策,GPT 处理代码密集型任务。这种组合可能出现风格割裂,是否省钱也取决于上下文结构,因此要用自己的样本和质量指标做 A/B 对比,不能直接照搬结论。
2. 控制系统提示 & schema 的「膨胀」
在 Tokenizer 眼里,系统提示 + 工具 schema 是每次调用必然重复的「固定成本」,而且都是结构化内容,属于被放大的重点对象。
几个可行的缩减手法:
-
拆 Prompt 模块
- 把「不变的规则」和「每次请求的上下文」分开
- 固定规则放在服务端,用模型原生的「系统消息引用」/ server-side prompt 功能(例如 OpenAI 的 system templates)
- 让客户端每次只传变化的那一部分
-
工具 schema 压缩
- 不要在工具描述里写小说,只保留:参数名、类型、约束、1~2 句用途
- 多个工具共享的描述、示例用编号,在系统提示里统一解释一次
-
裁剪没用的上下文
- Agent 里常见的坑是「每一步都把前面所有搜索结果、所有日志重新塞一遍」
- 改成「最近 N 步 + 缩写过的历史摘要」,特别是代码搜索结果
给模型写工具 schema 时,把单个工具描述控制在 3 行以内:一句用途、一段参数 JSON 示例、一句返回格式说明。比起长段注释,这种写法在多数 Tokenizer 下能省掉 20% 左右的 Token。
3. 在 CI 里接入「Token 预算检测」
这一步是很多团队忽略的:你有 lint 检查 TypeScript 风格,却没人检查 prompt / schema 的 Token 数。
可以加一个简单的 CI 步骤:
- 用
tiktoken/ 各家 SDK,在 CI 里对prompts/、schemas/目录跑一遍 - 记录每个文件在 GPT 和 Claude 下的 Token 数
- 设置阈值,比如:
- 任一 prompt > 4k Token → CI 报警
- 某个 schema 修改导致 Token 数增加 > 30% → CI 报警
你甚至可以做一个小仪表板:
- 每个 Agent 流程:输入 Token / 输出 Token 的预估范围
- 在不同模型组合下的「预估成本 / 1000 次调用」
例如,一个 prompt 文件从 2k 增长到 6k Token,如果 CI 只检查文件大小而不检查各模型的计数结果,这种成本回归很容易漏掉。Token 应该像内存和 CPU 一样被持续监控,而不是月底看到云账单后再追查。
这样老板问「为什么换模型账单多了 30%」的时候,你可以非常坦然地打开图:「因为我们换了这个 Tokenizer,这部分 Token 被放大了 1.7 倍。」
模型选型时,到底要怎么把 Tokenizer 算进去?
模型选型时该问哪些问题?
以后再看价格页,可以直接带着这三个问题:
-
你们的 Tokenizer 文档在哪?
- 是否有公开的
tiktoken/ 类似工具 - 是否有计数 API
- 是否有公开的
-
同一批内容在你们模型和 GPT 上 Token 差多少?
- 如果厂商自己有类似 Playcode 的对比表,直接薅来用
- 没有,就自己测一次(那组样本脚本可复用)
-
针对代码 / Agent 场景,你们有没有专门的 Tokenizer 或模式?
- 有些厂商可能会提供「代码优化分词」模式
- 或加入压缩 / delta 传输能力(只传差异)
当你把 Tokenizer 的放大倍数乘进价格,再看一眼延迟 / 质量,这时候做出来的选型才比较接近现实世界里的「单价对比」。老实说,这里面没有一个完美答案,有时候你得承认:「是的,这个模型贵一点,但对我们这个场景就是划算。」
怎么用一套脚本测完所有厂商?
一个可操作的最小脚本结构(伪代码):
tsconst fixtures = {
ts: readFile("fixtures/example.ts"),
py: readFile("fixtures/example.py"),
html: readFile("fixtures/page.html"),
prompt: readFile("fixtures/system.txt"),
schema: readFile("fixtures/tool.json"),
};
function countGPT(text) {
return tiktoken_o200k.encode(text).length;
}
async function countClaude(text) {
const res = await anthropic.countTokens({ model: "claude-ops-4.8", text });
return res.input_tokens;
}
// 再加上 Gemini/Grok 各自的 count API
然后输出类似这样的表(你可以按自己项目的权重加权):
txtfixture gpt claude ratio
ts 1000 1730 1.73
prompt 800 1100 1.37
schema 900 1200 1.33
这张表,就是你之后所有「为什么账单变了」的解释用基础证据。
FAQ
Q: 同一个模型版本更新后,Token 突然多了,是不是官方在偷涨价?
A: 更准确说,是官方换了更「细」的 Tokenizer,但保持了标价不变。对你来说等价于每条请求多付 20~30% 的 Token 钱。要不要接受,取决于你是不是明显感受到了质量收益。
Q: 我主要是中文内容,还需要担心 Tokenizer 差异吗?
A: Playcode 的测试里,中文 prose 和 chat 在各家之间差异不大,甚至 Claude 在中文上略优。只要你的系统提示和 schema 不是用英文堆出来的,Tokenizer 的隐性涨价对你影响会小很多。
Q: 有没有「统一 Token 标准」可以避免这些坑?
A: 目前没有,每家都有自己的分词策略。业界默认用 OpenAI 的 o200k_base 当参考尺子,你可以把所有内容先用它数一遍,再看其他厂商相对倍数,用「等效 $/Mtok」做决策,而不是等着某个统一标准从天而降。
如果你的账单已经开始慢慢往上爬,不如先挑一条典型调用链,把里面的 prompt、schema、代码片段都丢给几家 Tokenizer 数一遍。你可能会发现,真正决定毛利率的,不是「换了哪个大模型」,而是「你让谁来拿尺子量」。接下来几周,你打算先从哪一个 Agent 流程下手,把这把尺子校一校?