大模型原理:BPE分词器 tiktoken的介绍、使用

介绍

tiktoken是OpenAI官方推出的高效Token计数库,专门用于计算文本在GPT、Claude等大模型中的Token数量,是开发大模型应用的必备工具。

作用

tiktoken 是OpenAI开源的快速BPE(字节对编码)Tokenizer库,用Rust实现核心逻辑,Python提供调用接口,核心作用是:

  1. 精准计数Token:计算文本转换为大模型可识别的Token数量(直接影响API费用、上下文窗口限制);
  2. 高性能:比传统的transformers库快几十倍,适合大批量文本处理;
  3. 多模型适配:原生支持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和解码后的文本,我们得出了两个重要的观察结果。

  1. <|endoftext|> 词元被分配了一个 较大的词元ID,即50256。事实上,用于训练GPT-2、GPT-3和ChatGPT中使用的原始模型的BPE分词器的词汇总量为50 257,这意味着 <|endoftext|> 被分配了最大的词元ID。

  2. BPE分词器可以正确地 编码 和 解码 未知单词,比如:someunknownPlace。

BPE分词器是如何处理未知词的

BPE算法的原理是将 不在预定义词汇表中的单词 分解 为更小的 子词单元 甚至 单个字符,从而能够处理词汇表之外的单词。
因此,得益于BPE算法,如果分词器在分词过程中遇到 不熟悉的单词,它可以将其表示为 子词词元 或 字符序列,如图:

将 未知单词 分解 为单个字符 的能力,确保用分词器训练的大语言模型能够 处理任何文本

常见问题与注意事项

  1. 编码与模型匹配:必须用对应模型的编码(如gpt-4o用o200k_base),否则计数不准;
    • 可通过print(tiktoken.list_encoding_names())查看所有支持的编码;
  2. 特殊字符处理:Emoji、多语言文本(中文/日文)会按BPE规则拆分为多个Token(如一个中文汉字通常是1-2个Token);
  3. 批量处理优化:大批量文本计数时,复用encoding对象,避免重复创建;
  4. 离线使用:tiktoken下载编码规则后可离线使用,无需联网。

总结

tiktoken的核心要点可总结为3点:

  1. 核心价值:OpenAI官方出品,精准、高速计算大模型Token数量,是大模型应用开发的必备工具;
  2. 核心用法:通过get_encoding/encoding_for_model获取编码,encode转Token后统计长度;
  3. 优势:性能远超传统库,API极简,与OpenAI官方计数完全一致,适配主流大模型。

原文出处:/show_1GW2Y24DjGX1.html