tiktoken 是OpenAI开发的一款快速开源分词器。
给定一个文本字符串(例如"tiktoken is great!")和编码方式(例如"cl100k_base"),分词器可以将文本字符串拆分为一系列标记(例如["t", "ik", "token", " is", " great", "!"])。
将文本字符串分割成标记(token)很有用,因为GPT模型是以标记的形式处理文本的。了解文本字符串中包含多少标记可以告诉你:(a)该字符串是否过长而超出文本模型的处理能力;(b)OpenAI API调用的费用是多少(因为使用量是按标记计费的)。
编码
编码方式指定了文本如何转换为标记。不同的模型使用不同的编码方式。
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 models, text-davinci-002, text-davinci-003 |
r50k_base (or gpt2) | GPT-3 models like davinci |
你可以使用tiktoken.encoding_for_model()来获取模型的编码,如下所示:
encoding = tiktoken.encoding_for_model('gpt-4o-mini')请注意,p50k_base与r50k_base存在大量重叠,对于非代码应用场景,它们通常会产生相同的标记。
按语言分类的分词器库
对于o200k_base、cl100k_base和p50k_base编码:
- Python: tiktoken
- .NET / C#: SharpToken, TiktokenSharp
- Java: jtokkit
- Golang: tiktoken-go
- Rust: tiktoken-rs
对于r50k_base (gpt2)编码,许多语言都提供了对应的分词器。
- 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)的长度通常从一个字符到一个单词不等(例如"t"或" great"),不过在部分语言中,标记可能比一个字符更短或比一个单词更长。空格通常会被归到单词开头(例如" is"而非"is "或" "+"is")。您可以通过OpenAI Tokenizer或第三方工具Tiktokenizer快速查看字符串是如何被标记化的。