o200k_base 编码器上手指南:token 原理与 cl100k_base 迁移
【免费下载链接】tiktokentiktoken is a fast BPE tokeniser for use with OpenAI's models.项目地址: https://gitcode.com/GitHub_Trending/ti/tiktoken
同样一句"今天天气不错,let's ship it",用cl100k_base数出来是 12 个 token,换成 o200k_base 通常是 8 个。差出来的这 4 个 token,直接对应你账单上的输入费用和模型能塞下多少上下文。下面带你把 o200k_base 这件事讲透:它是什么、为什么切得更细、怎么跑起来,以及从 cl100k_base 迁过来要留神什么。
先把 token 是什么讲明白
Token 是模型读文本前的最小单位,可以理解为"词的最小碎片"。一个英文词、一个汉字、甚至半个汉字,都可能被切成一个或多个 token。tokenizer 就是负责切分的工具,它先按规则把文本分段,再用一个固定的"词表"(merge 表)把这些段合并成 token。
o200k_base 是 OpenAI 新一代模型(gpt-4o、o1、o3、gpt-5 等)默认使用的编码,对应 tiktoken 里get_encoding("o200k_base")这一句。你可以把它理解成 cl100k_base 的后继:切分逻辑重写过,词表也翻倍了。
它到底比 cl100k_base 强在哪
差异集中在三处,理解了原理就知道钱省在哪。
| 维度 | cl100k_base | o200k_base |
|---|---|---|
| 词表规模 | 100,000 | 200,000 |
| 英文切分 | 基础正则 | 按大小写/撇号分段的 6 段正则 |
| 典型 token 数 | 略多 | 略少(同文本下) |
- 词表翻倍:o200k_base 的 merge 表是 200,000 条,cl100k_base 是 100,000 条。表越大,越长的连续片段能直接命中一个 token,而不是被反复拆开,所以同样文本的 token 总数往往更少。
- 正则重写了分段:cl100k_base 用一条正则把文本切成候选段;o200k_base 用 6 段正则分别处理"以小写为主的词""以大写字母开头的词""数字""标点/符号""换行""空白"。这样英文里的
's、're、've这类缩写能贴着词尾一起切,避免多切一刀。 - 数字单独一段:
\p{N}{1,3}把数字最多按 3 位一组切,对代码里的常量、ID、版本号更友好。
动手跑一个最小例子
先升级依赖,确保带上 o200k_base:pip install tiktoken --upgrade。
import tiktoken # 拿到 o200k_base 编码器(首次会下载并缓存词表) enc = tiktoken.get_encoding("o200k_base") text = "今天天气不错,let's ship it" tokens = enc.encode(text) # 文本 -> token id 列表 back = enc.decode(tokens) # token id 列表 -> 文本 print(tokens) # 例如 [19811, 391, ..., 21124] print("token 数:", len(tokens)) assert back == text # 一致性校验:编解码往返无损失批量场景用encode_batch走多线程:
texts = ["第一句", "second line", "第三句更长一些"] ids = enc.encode_batch(texts, num_threads=4) # 返回列表的列表和 cl100k_base 放在一起比
| 对比项 | cl100k_base | o200k_base |
|---|---|---|
| 词表规模 | 100,000 | 200,000 |
| 服务模型 | gpt-3.5 / gpt-4 系列 | gpt-4o、o 系列、gpt-5 等 |
| 英文缩写切分 | 一般 | 按撇号规则更贴合 |
| 数字处理 | 1-3 位一组 | 1-3 位一组 |
具体省多少 token 取决于文本语言构成:英文占比高、长词多的代码,差异最明显;纯中文或短文本,差距相对小。没有统一的百分比可套,拿你自己的真实语料各跑一遍len(encode())最准。
迁移时容易踩的坑
- 注意 token 数会变,上下文与费用要重算:同一批文本从 cl100k_base 换到 o200k_base 后 token 数通常下降,意味着同样上下文窗口能塞进更多原文、同样长度的输入账单也更低。反过来,别拿旧编码器的 token 数去卡新模型的预算,数字对不上。
- 注意按模型选编码,而不是按习惯:
model.py里已经把 gpt-4o、o1、o3、gpt-5 等映射到 o200k_base。用encoding_for_model("gpt-4o")之类按模型名取编码,比硬编码名字更稳;给旧 gpt-3.5 接口算 token 时仍应留在 cl100k_base。 - 注意别跨编码器混用 token:o200k_base 的 id 空间和 cl100k_base 不通用,同一个数字在两边指向的文本不同。历史日志、缓存、评测脚本里的 token id 不能直接迁移,只能迁移文本本身,再重新 encode。
回到开头那句中英文混排的文本:o200k_base 少切出来的那 4 个 token,就是词表翻倍和正则重写换来的实打实的成本与上下文余量。
【免费下载链接】tiktokentiktoken is a fast BPE tokeniser for use with OpenAI's models.项目地址: https://gitcode.com/GitHub_Trending/ti/tiktoken
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考