openai/tiktoken
GitHub: openai/tiktoken
OpenAI 官方开源的高性能 BPE 分词器,用于将文本快速编码为适用于其大语言模型的 token 序列。
Stars: 18806 | Forks: 1555
# ⏳ tiktoken
tiktoken 是一个快速的 [BPE](https://en.wikipedia.org/wiki/Byte_pair_encoding) tokeniser,适用于
OpenAI 的模型。
```
import tiktoken
enc = tiktoken.get_encoding("o200k_base")
assert enc.decode(enc.encode("hello world")) == "hello world"
# 获取 OpenAI API 中特定模型对应的 tokeniser:
enc = tiktoken.encoding_for_model("gpt-4o")
```
`tiktoken` 的开源版本可以通过 [PyPI](https://pypi.org/project/tiktoken) 安装:
```
pip install tiktoken
```
tokeniser API 文档记录在 `tiktoken/core.py` 中。
使用 `tiktoken` 的示例代码可以在
[OpenAI Cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb) 中找到。
## 性能
`tiktoken` 比同类开源 tokeniser 快 3 到 6 倍:

性能测试是在 1GB 的文本上使用 GPT-2 tokeniser 进行的,使用了
`tokenizers==0.13.2`、`transformers==4.24.0` 和 `tiktoken==0.2.0` 中的 `GPT2TokenizerFast`。
## 获取帮助
请在 [问题追踪器](https://github.com/openai/tiktoken/issues) 中提交问题。
如果你在 OpenAI 工作,请务必查阅内部文档,或者随时联系
@shantanu。
## 那么 BPE 到底是什么?
语言模型看到的文本并不像你我一样,相反,它们看到的是一系列数字(称为 token)。
Byte pair encoding (BPE) 是一种将文本转换为 token 的方法。它具有一些理想的特性:
1. 它是可逆且无损的,因此你可以将 token 转换回原始文本
2. 它适用于任意文本,甚至是 tokeniser 训练数据中没有的文本
3. 它能压缩文本:token 序列比对应于
原始文本的字节要短。在实践中,平均每个 token 大约对应 4 个字节。
4. 它试图让模型看到常见的子词。例如,"ing" 在
英语中是一个常见的子词,因此 BPE 编码通常会将 "encoding" 拆分为类似 "encod" 和 "ing" 的 token
(而不是像 "enc" 和 "oding" 这样)。因为模型随后会在不同的上下文中一次又一次地看到 "ing" token,这有助于模型泛化并更好地理解语法。
`tiktoken` 包含一个教学子模块,如果你想了解更多关于
BPE 的细节,它会更加友好,包括帮助可视化 BPE 过程的代码:
```
from tiktoken._educational import *
# 在小量文本上训练 BPE tokeniser
enc = train_simple_encoding()
# 可视化 GPT-4 encoder 如何对文本进行编码
enc = SimpleBytePairEncoding.from_tiktoken("cl100k_base")
enc.encode("hello world aaaaaaaaaaaa")
```
## 扩展 tiktoken
你可能希望扩展 `tiktoken` 以支持新的编码。有两种方法可以做到这一点。
**完全按照你想要的方式创建你的 `Encoding` 对象,并直接传递它。**
```
cl100k_base = tiktoken.get_encoding("cl100k_base")
# 在生产环境中,直接加载 arguments,而不是访问 private attributes
# 有关特定 encodings 的 arguments 示例,请参见 openai_public.py
enc = tiktoken.Encoding(
# If you're changing the set of special tokens, make sure to use a different name
# It should be clear from the name what behaviour to expect.
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,
}
)
```
**使用 `tiktoken_ext` 插件机制将你的 `Encoding` 对象注册到 `tiktoken` 中。**
仅当你需要 `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`,你就可以使用你的
自定义编码了!请确保**不要**使用可编辑安装。
标签:AI, BPE, DLL 劫持, OpenAI, Rust, 内存规避, 可视化界面, 大语言模型, 文本分词, 网络流量审计, 自动化代码审查, 逆向工具