什么是tiktoken
iktoken是OpenAI开发的一种BPE分词器。
给定一段文本字符串(例如,"tiktoken is great!")和一种编码方式(例如,"cl100k_base"),分词器可以将文本字符串切分成一系列的token(例如,["t", "ik", "token", " is", " great", "!"])。
tiktoken解决了什么问题
将文本字符串切分成token非常有用,因为GPT模型看到的文本就是以token的形式呈现的。
知道一段文本字符串中有多少个token可以告诉你(a)这个字符串是否对于文本模型来说太长了而无法处理,以及(b)一个OpenAI API调用的费用是多少(因为使用量是按照token计价的)。
编码方式
编码方式规定了如何将文本转换成token。不同的模型使用不同的编码方式。
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) | 
像 davinci 这样的GPT-3模型 | 
如何获取模型的编码方式
你可以使用 tiktoken.encoding_for_model() 获取一个模型的编码方式,
如下所示:
1  | python复制代码encoding = tiktoken.encoding_for_model('gpt-3.5-turbo')  | 
注意,
p50k_base与r50k_base有很大的重叠,对于非代码应用,它们通常会产生相同的token。
在英语中,token的长度通常在一个字符到一个单词之间变化(例如,"t" 或 " great"),尽管在某些语言中,token可以比一个字符短或比一个单词长。空格通常与单词的开头一起分组(例如," is" 而不是 "is " 或 " "+"is")。你可以快速在 OpenAI分词器 检查一段字符串如何被分词。
安装 tiktoken
1  | css复制代码pip install --upgrade tiktoken  | 
示例-编码 encode 将字符串转换成token ID
1  | ini复制代码import tiktoken  | 
输出 [83, 1609, 5963, 374, 2294, 0] 返回token ID 这边用了6个token
示例-解码 encode 将token ID 还原成 字符串
1  | ini复制代码  | 
输出 tiktoken is great!
对比不同的编码方式
不同的编码方式在分割单词、处理空格和非英文字符方面存在差异。通过上述方法,我们可以比较几个示例字符串在不同的编码方式下的表现。
统计completions API调用时的token数
ChatGPT模型,如gpt-3.5-turbo和gpt-4,与旧的完成模型一样使用token,但由于其基于消息的格式,很难准确计算对话中将使用多少个token。
1  | python复制代码# 定义函数 num_tokens_from_messages,该函数返回由一组消息所使用的token数。  | 
本文转载自: 掘金