介绍
tiktoken是OpenAI官方推出的高效Token计数库,专门用于计算文本在GPT、Claude等大模型中的Token数量,是开发大模型应用的必备工具。
作用
tiktoken 是OpenAI开源的快速BPE(字节对编码)Tokenizer库,用Rust实现核心逻辑,Python提供调用接口,核心作用是:
- 精准计数Token:计算文本转换为大模型可识别的Token数量(直接影响API费用、上下文窗口限制);
- 高性能:比传统的
transformers库快几十倍,适合大批量文本处理; - 多模型适配:原生支持OpenAI全系列模型(gpt-3.5-turbo、gpt-4、gpt-4o等),也兼容Anthropic Claude等主流模型。
为什么需要Token计数?
大模型按Token计费(如gpt-3.5-turbo按每1000Token收费),且有上下文窗口限制(如gpt-4o的128k Token上限),精准计数能避免超量扣费或请求失败。
特点与优势
| 特性 | tiktoken | 传统transformers库 |
|---|---|---|
| 性能 | 极快(Rust核心),批量处理万级文本无压力 | 较慢(Python实现),大批量处理卡顿 |
| 安装体积 | 小(仅依赖Rust扩展) | 大(需安装完整transformers+依赖) |
| 模型适配 | 专注OpenAI/Claude,覆盖主流模型 | 支持全模型,但配置复杂 |
| 易用性 | 极简API,一行代码计数 | 需手动加载Tokenizer,步骤繁琐 |
| 精准度 | 与OpenAI官方计数100%一致 | 部分模型计数有偏差 |
安装
本文安装的是 0.12.0 版本
直接安装:
pip install tiktoken
poetry虚拟环境安装依赖:
poetry add flask
代码
from importlib.metadata import version
import tiktoken
print("查看 version 版本号:", version("tiktoken"))
print("查看所有支持的编码:", tiktoken.list_encoding_names())
# 选择对应模型的编码,不同模型编码规则不同
tokenizer = tiktoken.get_encoding("gpt2")
text = (
"Hello, do you like tea? <|endoftext|> In the sunlit terraces"
"of someunknownPlace."
)
# 使用encode()方法,将文本转Token(返回Token ID列表),指定特殊标记
integers = tokenizer.encode(text, allowed_special={"<|endoftext|>"})
print("将文本转Token---------------------")
print(integers)
# 使用decode()方法,将词元ID转换回文本
strings = tokenizer.decode(integers)
print("将词元ID转回文本---------------------")
print(strings)
执行结果:
查看 version 版本号: 0.12.0
查看所有支持的编码: ['gpt2', 'r50k_base', 'p50k_base', 'p50k_edit', 'cl100k_base', 'o200k_base', 'o200k_harmony']
将文本转Token---------------------
[15496, 11, 466, 345, 588, 8887, 30, 220, 50256, 554, 262, 4252, 18250, 8812, 2114, 1659, 617, 34680, 27271, 13]
将词元ID转回文本---------------------
Hello, do you like tea? <|endoftext|> In the sunlit terracesof someunknownPlace.
结果
通过分析上述词元ID和解码后的文本,我们得出了两个重要的观察结果。
<|endoftext|>词元被分配了一个 较大的词元ID,即50256。事实上,用于训练GPT-2、GPT-3和ChatGPT中使用的原始模型的BPE分词器的词汇总量为50 257,这意味着<|endoftext|>被分配了最大的词元ID。BPE分词器可以正确地 编码 和 解码 未知单词,比如:
someunknownPlace。
BPE分词器是如何处理未知词的
BPE算法的原理是将 不在预定义词汇表中的单词 分解 为更小的 子词单元 甚至 单个字符,从而能够处理词汇表之外的单词。
因此,得益于BPE算法,如果分词器在分词过程中遇到 不熟悉的单词,它可以将其表示为 子词词元 或 字符序列,如图:
将 未知单词 分解 为单个字符 的能力,确保用分词器训练的大语言模型能够 处理任何文本
常见问题与注意事项
- 编码与模型匹配:必须用对应模型的编码(如gpt-4o用
o200k_base),否则计数不准;- 可通过
print(tiktoken.list_encoding_names())查看所有支持的编码;
- 可通过
- 特殊字符处理:Emoji、多语言文本(中文/日文)会按BPE规则拆分为多个Token(如一个中文汉字通常是1-2个Token);
- 批量处理优化:大批量文本计数时,复用
encoding对象,避免重复创建; - 离线使用:tiktoken下载编码规则后可离线使用,无需联网。
总结
tiktoken的核心要点可总结为3点:
- 核心价值:OpenAI官方出品,精准、高速计算大模型Token数量,是大模型应用开发的必备工具;
- 核心用法:通过
get_encoding/encoding_for_model获取编码,encode转Token后统计长度; - 优势:性能远超传统库,API极简,与OpenAI官方计数完全一致,适配主流大模型。
