tiktoken
是 OpenAI 提供的快速开源 tokenizer。
给定一个文本字符串 (例如,"tiktoken is great!"
) 和一个编码 (例如,"cl100k_base"
),tokenizer 可以将文本字符串拆分为 tokens 列表 (例如,["t", "ik", "token", " is", " great", "!"]
)。
将文本字符串拆分为 tokens 非常有用,因为 GPT 模型以 tokens 的形式查看文本。了解文本字符串中有多少 tokens 可以告诉您 (a) 字符串对于文本模型来说是否太长而无法处理,以及 (b) OpenAI API 调用的成本 (因为使用量是按 token 定价的)。
编码
编码指定了文本如何转换为 tokens。不同的模型使用不同的编码。
tiktoken
支持 OpenAI 模型使用的三种编码
编码名称 | OpenAI 模型 |
---|---|
o200k_base | gpt-4o , gpt-4o-mini |
cl100k_base | gpt-4-turbo , gpt-4 , gpt-3.5-turbo , text-embedding-ada-002 , text-embedding-3-small , text-embedding-3-large |
p50k_base | Codex 模型, text-davinci-002 , text-davinci-003 |
r50k_base (或 gpt2 ) | GPT-3 模型,例如 davinci |
您可以使用 tiktoken.encoding_for_model()
检索模型的编码,如下所示
encoding = tiktoken.encoding_for_model('gpt-4o-mini')
请注意,p50k_base
与 r50k_base
大量重叠,对于非代码应用,它们通常会给出相同的 tokens。
各种语言的 Tokenizer 库
对于 o200k_base
, cl100k_base
和 p50k_base
编码
- Python: tiktoken
- .NET / C#: SharpToken, TiktokenSharp
- Java: jtokkit
- Golang: tiktoken-go
- Rust: tiktoken-rs
对于 r50k_base
(gpt2
) 编码,tokenizer 在许多语言中都可用。
- Python: tiktoken (或者 GPT2TokenizerFast)
- JavaScript: gpt-3-encoder
- .NET / C#: GPT Tokenizer
- Java: gpt2-tokenizer-java
- PHP: GPT-3-Encoder-PHP
- Golang: tiktoken-go
- Rust: tiktoken-rs
(OpenAI 不对第三方库做任何认可或保证。)
字符串通常如何被 token 化
在英语中,tokens 的长度通常从一个字符到一个单词不等 (例如,"t"
或 " great"
),尽管在某些语言中,tokens 可能比一个字符短或比一个单词长。空格通常与单词的开头分组在一起 (例如," is"
而不是 "is "
或 " "
+"is"
)。您可以在 OpenAI Tokenizer 或第三方 Tiktokenizer webapp 上快速检查字符串是如何被 token 化的。