tiktoken:OpenAI 开源的高速 BPE 分词器

OpenAI 开源的 BPE 分词器 tiktoken,目前获得了 18,389 个 Star:

正文顶部截图

README区域截图

tiktoken 是一款专为 OpenAI 模型设计的快速 BPE 分词器。它的核心任务是将文本转换为模型可理解的 token 序列,同时也支持将 token 无损解码回原始文本。

语言模型看到的不是文字,而是一串数字,也就是 token。BPE(Byte Pair Encoding)是一种将文本转为 token 的算法,有几个实用特性:它是可逆且无损的,编码后的 token 可以完整还原为原文;它能处理任意文本,包括训练时从未见过的内容;它对文本有压缩效果,平均每个 token 对应约 4 个字节;它能让模型频繁接触到常见子词,比如英语中的 “ing”,这有助于模型在不同上下文中理解语法规律。

性能是 tiktoken 的一个亮点。在 1GB 文本的基准测试中,使用 GPT-2 分词器进行对比,tiktoken 的速度达到同类开源分词器的 3 到 6 倍。测试对比了 tokenizers 0.13.2、transformers 4.24.0 和 tiktoken 0.2.0 三个版本。

安装通过 pip 直接完成:

pip install tiktoken

基础用法很简洁,两行代码即可完成编码和解码:

import tiktoken

# 获取指定编码
enc = tiktoken.get_encoding("o200k_base")
assert enc.decode(enc.encode("hello world")) == "hello world"

# 获取特定模型对应的分词器
enc = tiktoken.encoding_for_model("gpt-4o")

tiktoken 的 API 设计很简单。get_encoding 按编码名称返回分词器,encoding_for_model 则根据模型名称自动选择对应的编码。编码名称如 “o200k_base”、“cl100k_base” 等,分别对应不同版本的 OpenAI 模型。

tiktoken 包含一个教育性子模块,适合想深入理解 BPE 细节的人。这个子模块提供了可视化编码过程的代码:

from tiktoken._educational import *

# 在少量文本上训练一个 BPE 分词器
enc = train_simple_encoding()

# 可视化 GPT-4 编码器如何编码文本
enc = SimpleBytePairEncoding.from_tiktoken("cl100k_base")
enc.encode("hello world aaaaaaaaaaaa")

如果需要扩展 tiktoken 支持新编码,有两种路径可以选择。

第一种是直接构造 Encoding 对象,在代码中传递使用。这种方式最灵活,不需要修改 tiktoken 的内部注册表:

cl100k_base = tiktoken.get_encoding("cl100k_base")

enc = tiktoken.Encoding(
    name="cl100k_im",
    pat_str=cl100k_base._pat_str,
    mergeable_ranks=cl100k_base._mergeable_ranks,
    special_tokens={
        **cl100k_base._special_tokens,
        "<|im_start|>": 100264,
        "<|im_end|>": 100265,
    }
)

这里有几个注意点。编码名称要清晰表达行为,如果修改了 special tokens 的集合,务必换一个不同的名字。生产环境中应该直接加载参数,而不是访问私有属性。

第二种是通过 tiktoken_ext 插件机制注册自定义编码。这种方式只在需要 tiktoken.get_encoding 自动识别你的编码时才用得上,否则第一种方式更简单直接。

实现插件时,要在 tiktoken_ext 下创建命名空间包,包内模块需包含 ENCODING_CONSTRUCTORS 字典,将编码名映射到无参构造函数。setup.py 需使用 find_namespace_packages 并指定 include=['tiktoken_ext*'],依赖项中要包含 tiktoken。安装时使用普通模式,不要加 editable 参数。

对于需要精确计算 token 数量、控制 API 调用成本、集成 OpenAI 模型推理管道、或学习 BPE 内部机制的场景,tiktoken 是一个直接可用的基础工具。它在 OpenAI 的 API 调用、模型微调、文本预处理等流程中都有广泛应用。由于 OpenAI 的 API 按 token 计费,准确统计输入输出的 token 数量对成本控制很有必要,这也是 tiktoken 最常见的使用场景之一。

enAI 的 API 按 token 计费,准确统计输入输出的 token 数量对成本控制很有必要,这也是 tiktoken 最常见的使用场景之一。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐