Token 计数与分词工具
计费、截断与限流都以 token 为单位,而不是字数:同一段中文与英文的 token 数差别很大,不同模型用的分词表也不一样。OpenAI 系模型可以用 tiktoken 这类开源实现精确计数,先选与目标模型匹配的编码器,再把文本编码后统计长度。其他厂商多用自家分词工具,编码表不通用,跨平台比较必须各算各的。
基本信息
| 计量单位 | token,由分词器把文本切成的片段 |
|---|---|
| 工具 | OpenAI 系可用 tiktoken,其他厂商用其官方分词工具 |
| 编码器选择 | 要与目标模型匹配,选错会算错 |
| 中文特点 | 常见汉字多为一到两个 token,比英文更占额度 |
| 用途 | 成本预估、上下文裁剪、限流与截断判断 |
| 误差来源 | 工具版本与模型实际分词表可能不完全一致 |
常见编码器与适用场景
| 编码器 | 适用 | 说明 |
|---|---|---|
| 较新的通用编码器 | 较新版通用模型 | 中英混排场景常用,覆盖多语言 |
| 上一代编码器 | 较早一代模型 | 老项目与旧代码里仍常见 |
| 厂商官方分词工具 | 非 OpenAI 系模型 | 编码表不通用,必须用对应工具 |
| 粗略估算 | 容量规划早期 | 中文按字近似、英文按字符数折算,仅用于估算 |
典型使用场景
- 成本预估:上线前估算每月输入输出量与费用区间
- 上下文裁剪:判断历史消息该丢几轮才不超窗口
- 限流预估:按每分钟 token 上限倒推并发与批量大小
- 截断排查:确认回答被截断是长度上限还是模型主动停止
- 批处理切分:把长文档按 token 分块,而不是按字符分块
精确计数与粗估对比
精确计数与粗估对比
import tiktoken
enc = tiktoken.get_encoding("o200k_base") # 选与目标模型匹配的编码器
text = "其其网文档中心的加厚示例段落,共 120 个汉字。"
n = len(enc.encode(text))
print(n) # 精确 token 数
print(len(text)) # 字符数,仅作粗估参照
# 中文与英文混排时,用字符数换算的做法误差可达数成,计费判断不要依赖它估算与实测的差异
| 场景 | 误差来源 | 建议 |
|---|---|---|
| 中文为主 | 汉字可能被切成多个 token | 直接实测,别按字数折算 |
| 英文为主 | 常见词多为单 token,长词被切开 | 长文本实测,短文本可粗估 |
| 含代码与符号 | 缩进、标点与符号都占 token | 代码类内容按实测值规划 |
| 含图片 | 图片按分辨率折算 | 按厂商折算规则单独估算 |
工具版本与模型实际分词表可能小有差异:成本预算要留出余量,按 10% 量级的波动准备。
用字数近似 token 数做容量规划是常见事故源:中文文本的误差尤其大,容易在上线后才发现成本与并发都算错了。