命令都在本机跑过,输出原样贴

报价单只告诉你单价

要估「发一篇 1500 字的稿子,输入多少钱」,缺的是中间那一步:这 1500 字到底是多少 token。

报价单不会说。它只写每百万 token 多少钱。

所以这篇写的就是那一步。装包、数、换算,三步。命令都是我本机跑出来的,输出原样贴。

一台开着盖的笔记本、一本合着的本子和一支笔
一台开着盖的笔记本、一本合着的本子和一支笔

一、装

`pip install tiktoken`。

我这台机器上跑完是这样:

C:\> pip install tiktoken Requirement already satisfied: tiktoken in C:\Program Files\Python312\Lib\site-packages (0.14.0) Requirement already satisfied: regex in C:\Program Files\Python312\Lib\site-packages (from tiktoken) (2026.9.29) Requirement already satisfied: requests in C:\Program Files\Python312\Lib\site-packages (from tiktoken) (2.34.2)

显示 already satisfied 是因为我早装过了。你第一次装会多几行下载信息,结尾一样。

顺手确认版本,0.14.0。

二、数

最小能用的版本就三行:

import tiktoken enc = tiktoken.get_encoding("cl100k_base") print(len(enc.encode("你好")))

换成文件跑也没区别,把 `enc.encode(...)` 里的字符串换成 `open(...).read()` 就行。

我实际跑的那版多打印了两个东西:两个分词器都数一遍,另外把 token 的 id 号也打出来。

真实运行输出:同一句话在两个分词器下分别是 23 和 18 个 token
真实运行输出:同一句话在两个分词器下分别是 23 和 18 个 token

id 号本身没什么用。但想看清一个汉字到底被切成几块,它是唯一的证据。上一篇里那个「六个字切成九个 token」,就是靠这串数字拆出来的。

三、换算

有 token 数,剩下是乘法。价格我用的是 DeepSeek V4.1 Flash 官网标的三档:输入命中缓存 0.02,输入未命中 1.00,输出 4.00,单位都是元每百万 token。

价格是 2026 年 9 月页面上的。我只看了标价,没有实际调用接口验证过。

1500 字,按 1.575 token/字 算,2,362 个 token。

发过去、没命中缓存,¥0.0024。命中了,¥0.00005。让它吐同样长度,¥0.0094。

一篇 1500 字稿子的三笔账
一篇 1500 字稿子的三笔账

同样的字数,最贵和最便宜差 200 倍。差别只在两件事:缓存有没有命中,你是「发」还是「收」。

所以省钱的动作也就两个。一是把固定不变的长提示词放在最前面,让它更容易命中缓存。二是别让模型把已有的原文再抄一遍输出。

第一条我没法验证。缓存怎么算命中,官方只说「前缀相同」,具体边界我测不出来。

一张经验表,省得每次都跑代码

十五种写法的字符数与 token 数
十五种写法的字符数与 token 数

这张表是我挨个测的,每种只有一小段样本,所以它是「手感」,不是「标准」。

拿它估的时候注意一件事:别拿字符数当 token 数。

中文一个 token 装 1.2 到 1.6 个字符,英文单词能到 4.8,Python 代码 2.6,纯小写字母串 26。混着来的时候,估出来的误差会很难看。

反过来,最吃亏的是生僻字和表情符号。十个生僻汉字能吃掉 26 个 token,五个 emoji 在 cl100k 里是 11 个。

顺手测的一件事:中文是不是天生比英文贵

这句话我听了很多年。这次拿三组提示词试了一下,任务说明、输出格式、角色设定,各写一版中文一版英文,意思尽量贴近。

cl100k 底下:中文 151 个 token,英文 100 个。中文是英文的 1.51 倍。

o200k 底下:中文 108,英文 100。1.08 倍,基本拉平了。

所以「中文更贵」这句只在老分词器时候成立。词表里收了中文词之后,这个差距自己就消掉大半。

这三组是我自己写的一对一对译,不保证语义完全等价,样本也只有三组。当参考,别当结论。

几个我没验证的地方

接口返回的 usage。

各家接口一般都会返回 `prompt_tokens`、`completion_tokens` 这类字段,按理说那个数最准,比我这样本地数强。但我这次没有调接口,也没读返回,所以这段我没有实测,只能说到这儿。手上有 key 的话,跑一次就知道。

图片的 token。

我只测了纯文本。同一张图在不同模型里折算成多少 token,我没测,也不知道。

上下文里还有别的。

system prompt、历史对话、工具定义,这些全要占位置。这篇只算了正文。具体占多少,取决于你的框架怎么拼,我没法替它算。

tiktoken 只对 OpenAI 系准。

国内模型的分词器没公开,用它数出来的只能当参考。上一篇我比过两个公开分词器的差:同样的中文,能差 26%。国内模型的差多少,我不知道。

最后

装个包,三行代码,比猜准。

真要严谨,还是得以接口返回的 usage 为准,本地这步只是让心里有个数:到底是几百 token,还是几万。

你项目里是怎么数 token 的?我到现在还没接过接口,想先看看别人一般把这个计数放在哪一步。