tiktoken 源码编译实战:从 BPE 分词器构建到 3 步安装验证
【免费下载链接】tiktokentiktoken is a fast BPE tokeniser for use with OpenAI's models.项目地址: https://gitcode.com/GitHub_Trending/ti/tiktoken
你在做大模型应用时,如果需要对齐 OpenAI API 的 token 计费,就会用到 tiktoken——一个 Rust 编写的 BPE 分词器。本文带你完成从源码编译到安装验证的完整流程,并说明如何扩展自定义编码表,解决"装不上、跑不通、不能改"三个常见卡点。
tiktoken 的分工:Python 薄层 + Rust 核心
性能来自核心下沉:encode/decode 的计算全部在 Rust 侧完成,Python 层只负责编码表的加载、缓存与对象管理。
src/lib.rs 定义了CoreBPE核心,接收合并表与特殊词表后执行实际的 BPE 合并;tiktoken/core.py 中的Encoding类把它包装成对外的encode、decode接口,并在构造时一次性完成词表校验。get_encoding走注册表惰性加载并缓存实例,同一编码名第二次调用直接命中缓存,不会重复读文件。
准备 tiktoken 构建环境
源码编译分两条工具链:Python 侧负责打包,Rust 侧负责编译tiktoken._tiktoken扩展。
| 名称 | 版本/取值 | 验证命令 |
|---|---|---|
| Python | >=3.9 | python --version |
| Rust 工具链 | 需含 cargo | cargo --version |
| setuptools | >=62.4(构建期自动拉取) | pip show setuptools |
| setuptools-rust | >=1.5.2(构建期自动拉取) | pip show setuptools-rust |
| pyo3 | 0.28.3(Rust 依赖,见 Cargo.toml) | 无需手动验证 |
⚠️ 如果你不修改源码,直接pip install tiktoken获取预编译 wheel 即可,完全不需要 Rust 工具链;只有做定制化构建时才需要按下表准备环境。
源码安装与最小示例
先克隆仓库并安装。构建依赖声明在pyproject.toml的[build-system]中,pip 会在构建隔离环境里自动处理,你只需要执行:
# 克隆源码 git clone https://gitcode.com/GitHub_Trending/ti/tiktoken cd tiktoken # 编译 Rust 扩展并安装(自动调用 cargo) pip install .安装成功后,用最小示例确认扩展模块可被导入:
import tiktoken enc = tiktoken.get_encoding("o200k_base") # 加载 OpenAI 编码表 print(enc.encode_ordinary("hello world")) # [31373, 995] print(enc.decode([31373, 995])) # hello world能打印出 token 列表即说明tiktoken._tiktoken扩展加载成功,编解码链路已经打通。
3 步验证安装正确
依次执行以下检查,全部通过即可投产:
- 版本确认:
pip show tiktoken应显示 0.13.0,与仓库当前版本一致。 - 模型映射:确认模型名到编码表的映射符合预期,例如
gpt-4o对应o200k_base。 - 往返测试:编码再解码应与原文完全一致,这是 BPE 无损性的直接体现。
import tiktoken print(tiktoken.__version__) # 0.13.0 enc = tiktoken.encoding_for_model("gpt-4o") # <Encoding 'o200k_base'> assert enc.decode(enc.encode("hello world")) == "hello world"性能方面,官方在 1GB GPT-2 文本上的测量结果是 tiktoken 比同类开源分词器快 3-6 倍,仓库根目录的perf.svg即该对比图;如需自测吞吐,可参考 scripts/benchmark.py(依赖 transformers 与 blobfile)。
排错清单:编译与导入问题
| 症状 | 原因 | 处理 |
|---|---|---|
error: could not find Rust compiler | cargo 不在 PATH | 安装 Rust 工具链后重新打开终端再执行安装 |
ImportError: cannot import tiktoken._tiktoken | 扩展未编译或被 editable 安装跳过 | 改用pip install --no-cache-dir . |
Unknown encoding xxx | 编码名不存在或插件未注册 | 先查内置编码,自定义编码见下节 |
✅ 三步都没报错但速度不及预期时,先确认pip show tiktoken安装的是编译版而非纯 Python 回退。
扩展自定义 BPE 编码表
两种扩展方式按需求复杂度选择:只想换个行为就手工构造Encoding对象;需要get_encoding能自动发现才走插件机制。
第一种方式参照 tiktoken_ext/openai_public.py 中各编码的参数定义,基于现有编码表派生一个新对象:
import tiktoken base = tiktoken.get_encoding("cl100k_base") enc = tiktoken.Encoding( name="cl100k_custom", pat_str=base._pat_str, mergeable_ranks=base._mergeable_ranks, special_tokens=base._special_tokens, )第二种方式是在tiktoken_ext命名空间包下新建模块,暴露一个ENCODING_CONSTRUCTORS字典(编码名到构造函数的映射),注册与去重逻辑见 tiktoken/registry.py。
要点回顾
- 不定制就装 wheel:
pip install tiktoken一步到位,源码编译仅用于自定义构建。 - 编解码计算在 Rust 侧,
Encoding对象可缓存复用,get_encoding命中缓存后不再读文件。 - 自定义编码表优先手工构造
Encoding,需要全局可用时再上tiktoken_ext插件。
进阶方向:如果只想弄清 BPE 训练与合并的过程,tiktoken/_educational.py 提供了一个可教学用的简化实现,支持对小语料训练编码并可视化 BPE 步骤。
【免费下载链接】tiktokentiktoken is a fast BPE tokeniser for use with OpenAI's models.项目地址: https://gitcode.com/GitHub_Trending/ti/tiktoken
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考