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序列,同时还有以下特点:

  1. 可逆且无损,可以将tokens重新转换回原始文本。
  2. 可以处理任意文本,即使文本不在分词器的训练数据中。
  3. 压缩文本:tokens序列比原始文本对应的字节要短。平均而言,每个token相当于4个字节。
  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倍:

image

使用GPT-2分词器,在1GB的文本上进行性能测试,使用tokenizers==0.13.2transformers==4.24.0tiktoken==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,您应该可以使用您的自定义编码!请确保不要使用可编辑的安装。

标签:工具分享