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 倍: ![image](https://static.pigsec.cn/wp-content/uploads/repos/cas/35/35e39a1f529ff471aba58deaba9d2b0976157a99e6bed53e690aee75642313ac.svg) 性能测试是在 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, 内存规避, 可视化界面, 大语言模型, 文本分词, 网络流量审计, 自动化代码审查, 逆向工具