文章目录
tiktoken
是由OpenAI开发的快速开源分词器。
给定一个文本字符串(例如,"tiktoken is great!"
)和一个编码(例如,"cl100k_base"
),分词器可以将文本字符串拆分为标记列表(例如,["t", "ik", "token", " is", " great", "!"]
)。
将文本字符串拆分为标记对于GPT模型非常有用,因为GPT模型以标记的形式处理文本。知道文本字符串中有多少个标记可以告诉您(a)字符串是否过长以至于无法被文本模型处理,以及(b)OpenAI API调用的成本(因为使用量是按标记计价的)。
编码
编码指定如何将文本转换为标记。不同的模型使用不同的编码。
tiktoken
支持OpenAI模型使用的三种编码:
编码名称 | OpenAI模型 |
---|---|
cl100k_base |
gpt-4 , gpt-3.5-turbo , text-embedding-ada-002 |
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-3.5-turbo')
请注意,p50k_base
与r50k_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不对第三方库作任何认可或保证。)
字符串的常见分词方式
在英语中,标记通常的长度范围从一个字符到一个单词(例如,"t"
或" great"
),尽管在某些语言中,标记可能比一个字符更短或比一个单词更长。空格通常与单词的开头分组(例如," is"
而不是"is "
或" "
+"is"
)。您可以在OpenAI Tokenizer或第三方的Tiktokenizer网页应用程序上快速检查字符串的分词方式。
0. 安装 tiktoken
如果需要,可以使用 pip
安装 tiktoken
:
# 安装tiktoken库
%pip install --upgrade tiktoken
# 安装openai库
%pip install --upgrade openai
1. 导入 tiktoken
# 导入tiktoken模块,用于分词和标记化处理
import tiktoken
2. 加载一个编码
使用 tiktoken.get_encoding()
按名称加载一个编码。
第一次运行时,需要连接到互联网进行下载。后续运行不需要连接到互联网。
# 获取名为"cl100k_base"的编码格式
encoding = tiktoken.get_encoding("cl100k_base")
使用 tiktok.encoding_for_model()
自动加载给定模型名称的正确编码。
# 为"gpt-3.5-turbo"模型选择编码方式
encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")
3. 使用encoding.encode()
将文本转换为标记。
.encode()
方法将一个文本字符串转换为一个令牌整数列表。
# 调用encode函数,将字符串"tiktoken is great!"进行编码
encoding.encode("tiktoken is great!")
[83, 1609, 5963, 374, 2294, 0]
通过计算.encode()
返回的列表的长度来计算令牌数。
# 定义一个函数,用于计算一个文本字符串中的标记数量
def num_tokens_from_string(string: str, encoding_name: str) -> int:
# 获取指定编码的编码器
encoding = tiktoken.get_encoding(encoding_name)
# 将文本字符串编码为指定编码,并计算编码后的标记数量
num_tokens =