TikToken是用于OpenAI模型的快速BPE分词器
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/openai/tiktoken
项目名称
tiktoken
相关技术点
- BPE(字节对编码)
- PyPI(Python包索引)
- OpenAI的模型
- GPT-2
- Transformers
- Jupyter Notebook
项目用途
tiktoken是一个快速的BPE分词器,可用于OpenAI的模型。通过将文本转换成tokens序列,让模型可以处理它们,而BPE是一种将文本转换成tokens序列的方式。tiktoken可以将文本转换成tokens序列,同时还有以下特点:
- 可逆且无损,可以将tokens重新转换回原始文本。
- 可以处理任意文本,即使文本不在分词器的训练数据中。
- 压缩文本:tokens序列比原始文本对应的字节要短。平均而言,每个token相当于4个字节。
- 尝试让模型看到常见的子词。例如,在英语中,“ing”是一个常见的子词,因此BPE编码通常会将“encoding”拆分为“encod”和“ing”(而不是“enc”和“oding”)。因为模型将在不同的上下文中再次看到“ing”token,所以它有助于模型更好地理解语法。
此外,tiktoken还包含一个教育子模块,如果您想了解有关BPE的更多细节,包括帮助可视化BPE过程的代码,可以使用此子模块。
通过安装PyPI版本的tiktoken,您可以使用tiktoken的API。
tiktoken还具有可扩展性,您可以使用tiktoken_ext插件机制来注册自己的编码,并使用tiktoken.get_encoding找到您的编码。
⏳ tiktoken
tiktoken是一个快速的BPE分词器,可与OpenAI的模型一起使用。
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
assert enc.decode(enc.encode("hello world")) == "hello world"
# 获取与OpenAI API中特定模型对应的分词器:
enc = tiktoken.encoding_for_model("gpt-4")
tiktoken的开源版本可以从PyPI安装:
pip install tiktoken
分词器API在tiktoken/core.py中有文档。
使用tiktoken的示例代码可以在OpenAI Cookbook中找到。
性能
tiktoken比一个相似的开源分词器快3-6倍:
使用GPT-2分词器,在1GB的文本上进行性能测试,使用tokenizers==0.13.2,transformers==4.24.0和tiktoken==0.2.0。
获取帮助
请在问题跟踪器中发布问题。
如果您在OpenAI工作,请确保检查内部文档或随时联系@shantanu。
BPE到底是什么?
模型看到的不是像我们一样的文本,而是一系列数字(称为标记)。字节对编码(BPE)是一种将文本转换为标记的方法。它有一些理想的属性:
1)它是可逆且无损的,因此您可以将标记转换回原始文本
2)它适用于任意文本,即使不在分词器的训练数据中的文本也可以应用
3)它压缩文本:标记序列比原始文本的字节数短。实际上,在实践中,每个标记平均对应约4个字节。
4)它尝试让模型看到常见的子单词。例如,"ing"是英语中的常见子单词,因此BPE编码通常将"encoding"拆分为像"encod"和"ing"这样的标记(而不是例如 "enc"和"oding")。因为模型接下来会在不同的上下文中再次看到"ing"标记,因此它有助于模型推广和更好地理解语法。
tiktoken包含一个教育子模块,如果您想了解有关BPE的详细信息,包括帮助可视化BPE过程的代码,它更加友好:
from tiktoken._educational import *
# 对少量文本进行BPE分词器训练
enc = train_simple_encoding()
# 可视化GPT-4编码器如何编码文本
enc = SimpleBytePairEncoding.from_tiktoken("cl100k_base")
enc.encode("hello world aaaaaaaaaaaa")
扩展tiktoken
您可能希望扩展tiktoken以支持新的编码。有两种方法可以做到这一点。
按您想要的方式创建Encoding对象,并简单地传递它。
cl100k_base = tiktoken.get_encoding("cl100k_base")
# 在生产中,直接加载参数而不是访问私有属性
# 请参见openai_public.py,其中包含特定编码的参数示例
enc = tiktoken.Encoding(
# 如果要更改特殊标记的集合,请确保使用不同的名称
# 名称应清楚地表明期望的行为。
name="cl100k_im",
pat_str=cl100k_base._pat_str,
mergeable_ranks=cl100k_base._mergeable_ranks,
special_tokens={
**cl100k_base._special_tokens,
"裸": 100264,
"吸氧": 100265,
}
)
使用tiktoken_ext插件机制向tiktoken注册您的Encoding对象。
如果需要tiktoken.get_encoding找到您的编码,则可以使用此选项,否则请使用选项1。
为此,您需要在tiktoken_ext下创建一个命名空间包。
像这样布置您的项目,确保省略tiktoken_ext/__init__.py文件:
my_tiktoken_extension
├── tiktoken_ext
│ └── my_encodings.py
└── setup.py
my_encodings.py应该是一个模块,其中包含名为ENCODING_CONSTRUCTORS的变量。这是一个从编码名称到不带参数的函数的字典,该函数返回可以传递给tiktoken.Encoding以构建该编码的参数。有关示例,请参见tiktoken_ext/openai_public.py。有关详细信息,请参见tiktoken/registry.py。
您的setup.py应该像这样:
from setuptools import setup, find_namespace_packages
setup(
name="my_tiktoken_extension",
packages=find_namespace_packages(include=['tiktoken_ext*']),
install_requires=["tiktoken"],
...
)
然后简单地pip install ./my_tiktoken_extension,您应该可以使用您的自定义编码!请确保不要使用可编辑的安装。