正如在官方的
OpenAI文章中所述:
为了进一步探索标记化,您可以使用我们的交互式Tokenizer工具,它允许您计算标记的数量并查看文本如何被分解成标记。 或者,如果您想以编程方式对文本进行标记化,请使用Tiktoken作为专门用于OpenAI模型的快速BPE标记器。您还可以探索其他类似的库,例如Python的transformers package或NodeJS的gpt-3-encoder package。
一个分词器可以将文本字符串分割成一个标记列表,正如在关于使用Tiktoken计算标记的官方
OpenAI示例中所述:
Tiktoken是OpenAI的一个快速开源分词器。
给定一个文本字符串(例如"tiktoken is great!"
)和一个编码(例如"cl100k_base"
),分词器可以将文本字符串分割成一个标记列表(例如["t", "ik", "token", " is", " great", "!"]
)。
将文本字符串分割成标记是有用的,因为GPT模型以标记的形式看待文本。知道一个文本字符串中有多少个标记可以告诉您:
- 字符串是否过长,无法由文本模型处理
- OpenAI API调用的成本(使用按标记计费)
Tiktoken支持OpenAI模型使用的3种编码方式(
source):
编码名称 |
OpenAI模型 |
cl100k_base |
gpt-4 ,gpt-3.5-turbo ,text-embedding-ada-002 |
p50k_base |
text-davinci-003 ,text-davinci-002 |
r50k_base |
GPT-3模型 |
对于
cl100k_base
和
p50k_base
编码方式:
对于r50k_base
编码,许多语言都提供了分词器:
Python:
tiktoken(或者
GPT2TokenizerFast)
JavaScript:
gpt4-tokenizer,
gpt3-tokenizer,
gpt-3-encoder
.NET / C#:
GPT Tokenizer
Java:
gpt2-tokenizer-java
PHP:
GPT-3-Encoder-PHP
请注意,
gpt-3.5-turbo
和
gpt-4
与其他模型一样使用标记,正如官方
OpenAI文档所述:
像gpt-3.5-turbo
和gpt-4
这样的聊天模型与其他模型一样使用标记,但由于其基于消息的格式,很难计算出一个对话将使用多少个标记。
如果一个对话的标记数量超过了模型的最大限制(例如gpt-3.5-turbo
的4096个标记),您将不得不缩短、省略或以其他方式减少文本长度,直到符合要求。请注意,如果从消息输入中删除了一条消息,模型将完全失去对它的了解。
还要注意,非常长的对话更有可能收到不完整的回复。例如,一个长度为4090个标记的gpt-3.5-turbo
对话将在仅有6个标记后被截断。
如何使用tiktoken?
安装或升级tiktoken: pip install --upgrade tiktoken
您有两个选项。
选项1:在上面的表格中搜索给定OpenAI模型的正确编码
如果您运行get_tokens_1.py
,您将得到以下输出:
9
get_tokens_1.py
import tiktoken
def num_tokens_from_string(string: str, encoding_name: str) -> int:
encoding = tiktoken.get_encoding(encoding_name)
num_tokens = len(encoding.encode(string))
return num_tokens
print(num_tokens_from_string("Hello world, let's test tiktoken.", "cl100k_base"))
选项2:使用tiktoken.encoding_for_model()
自动加载给定OpenAI模型的正确编码
如果你运行get_tokens_2.py
,你将得到以下输出:
9
get_tokens_2.py
import tiktoken
def num_tokens_from_string(string: str, encoding_name: str) -> int:
encoding = tiktoken.encoding_for_model(encoding_name)
num_tokens = len(encoding.encode(string))
return num_tokens
print(num_tokens_from_string("Hello world, let's test tiktoken.", "gpt-3.5-turbo"))
注意:如果你仔细观察OpenAI API的响应中的“usage”字段,你会发现它报告了使用了10个标记的相同消息。这比Tiktoken多了1个标记。我还没有弄清楚为什么。我在过去进行了测试(请参阅我的
past answer)。正如@Jota在下面的评论中提到的,OpenAI API响应报告的标记使用情况与Tiktoken之间似乎仍然存在不匹配。