如何计算OpenAI的tokens(附:PHP,Go 与 Python计算字符串token的函数)
在构建和使用基于OpenAI的聊天机器人或者其他AI应用时,了解如何计算使用的token数量是至关重要的。每次与OpenAI API交互时,我们都在使用一定数量的tokens,这些tokens被用来编码我们输入的信息。每一段文本信息,无论是请求还是响应,都被转换成一个个的token。了解这些token的数量,可以帮助我们更好地理解和管理我们的API使用情况。
在本文中,我们将会讲解如何计算OpenAI使用的token数量。我们将详细阐述何为token,为何需要关注token,以及在OpenAI中如何计算token数量。并且,我们还将提供两个函数示例,分别使用PHP和Python编写,可以帮助你快速估算一个字符串的token数量。
tokens计算原理
OpenAI 使用一种基于字节对编码(Byte Pair Encoding,BPE)的方法来进行字符串的 tokenization。对于英文,一个单词通常被认为是一个 token,但对于其他语言,如中文,一个字符可能就是一个 token。这里的问题是一个中文文本,每个中文字符一般就被视为一个 token。
PHP计算字符串token的函数
这是一个使用PHP编写的函数,用于简单估算一个字符串的token数量。此函数使用UTF-8编码,并计算了所有的Unicode字符,包括汉字、英文字母、数字、标点符号和空格。
请注意,这个函数是一个简化版的估算,实际的token数量可能会有所不同,因为不同的语言模型可能使用不同的分词规则。
function estimate_tokens($str) {
$totalTokens = 0;
//统计汉字数量
preg_match_all("/[\x{4e00}-\x{9fa5}]/u", $str, $chineseMatches);
$totalTokens += count($chineseMatches[0]);
//统计英文字母数量
preg_match_all("/[a-zA-Z]/", $str, $letterMatches);
$totalTokens += count($letterMatches[0]);
//统计数字数量
preg_match_all("/[0-9]/", $str, $numberMatches);
$totalTokens += count($numberMatches[0]);
//统计标点符号数量
preg_match_all("/[^\w\s]|_/", $str, $punctuationMatches);
$totalTokens += count($punctuationMatches[0]);
//统计空格数量
preg_match_all("/\s/", $str, $spaceMatches);
$totalTokens += count($spaceMatches[0]);
return $totalTokens;
}
// 测试函数
$str = "这是一个测试。Hello, world! 12345";
echo estimate_tokens($str); // 输出: 24
在此代码中,estimate_tokens
函数将输入的字符串进行了分词,统计了各类字符的数量,然后将它们相加,得到了总的token数量。在测试函数部分,我们用一个包含汉字、英文、标点符号和数字的字符串来测试这个函数,并打印了结果。
Python计算字符串token的函数
在Python中,可以使用 tokenizers
这个库来计算一个字符串的token数量。这个库的 ByteLevelBPETokenizer
可以模拟GPT模型使用的BPE(Byte Pair Encoding)标记化方法。安装这个库可以使用命令 pip install tokenizers
。
from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.trainers import BpeTrainer
from tokenizers.pre_tokenizers import Whitespace
def train_tokenizer():
# 创建一个空的BPE模型
tokenizer = Tokenizer(BPE())
# 创建一个Trainer,并指定一些训练参数
trainer = BpeTrainer(special_tokens=["<s>", "<pad>", "</s>", "<unk>", "<mask>"])
# 创建一个PreTokenizer
pre_tokenizer = Whitespace()
# 使用Trainer和PreTokenizer训练BPE模型
tokenizer.pre_tokenizer = pre_tokenizer
files = ["/path/to/your/dataset.txt"] # 替换为你用来训练tokenizer的文本数据的路径
tokenizer.train(files, trainer)
return tokenizer
def count_tokens(text, tokenizer):
# 使用tokenizer将文本转化为tokens
output = tokenizer.encode(text)
# 输出的tokens的数量
return len(output.tokens)
# 创建tokenizer
tokenizer = train_tokenizer()
# 测试字符串的tokens数量
text = "这是一个测试句子。"
print(count_tokens(text, tokenizer))
请注意,这个代码需要一份大的文本数据来训练tokenizer,这样它才能理解如何把文本分解成token。你可以使用任何的文本数据,只要这些数据能代表你想要处理的文本的类型和风格。
以上代码仅供参考,实际上,OpenAI使用的tokenizer是经过大量数据训练得来的,因此,结果可能并不准确,若要精确计算GPT模型下的token数量,需要使用OpenAI训练的tokenizer。这个tokenizer可以从transformers库中获取,安装这个库可以使用命令 pip install transformers
。
from transformers import GPT2Tokenizer
def count_tokens(text):
# 初始化OpenAI的GPT-2 tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
# 将文本转化为tokens
tokens = tokenizer.encode(text)
# 计算并返回token的数量
return len(tokens)
# 测试字符串的tokens数量
text = "This is a test sentence."
print(count_tokens(text))
Go计算字符串token的函数
在Go中,实现GPT的tokenizer的功能可能会相对复杂一些,因为GPT使用的是BPE (Byte Pair Encoding)的方式进行token化,这需要基于一个已经训练好的词表。目前Go语言还没有类似Python里的transformers这样的库,你需要自己实现这样的功能。
以下是一个简单的例子,计算字符串中空格分隔的单词数量,这个例子并不能完全满足GPT的token计数要求,仅供参考:
package main
import (
"fmt"
"strings"
)
func countTokens(s string) int {
// 分割字符串,这里只是简单的使用空格分割,并没有实现BPE
words := strings.Fields(s)
// 返回分割后的单词数量
return len(words)
}
func main() {
s := "This is a test sentence."
fmt.Printf("Number of tokens: %d\n", countTokens(s))
}
若要真正实现Go版本的GPT tokenizer,你可能需要调用其他语言(如Python)的相关库来实现,或者在Go中手动实现BPE算法和读取训练好的词表。这将需要相当深入的NLP和编程知识。
-
mindspore最全介绍(附:安装教程) 2023-10-09 19:07:57
-
同城城市百科信息人工智能软件——CityAI 2023-09-16 16:12:24
-
浮点数在计算机中的应用与性能比较:从FP64到FP16 2023-08-18 13:25:31
-
2023年最常见的三种gpu虚拟化方法(附:最适合gpu虚拟化的虚拟机技术是那种) 2023-08-03 15:44:43
-
Hyper-v是什么?是干嘛的? 2023-08-03 15:06:58
-
亚马逊云推出Amazon OpenSearch Serverless向量引擎预览版 2023-08-03 14:16:08
-
矢量数据库是什么意思?常见的矢量数据库有哪些? 2023-07-22 10:49:44
-
LangChain 可以不用矢量数据库改用MySQL一类的关系型数据库吗? 2023-07-22 09:38:45
-
LangChain用到的矢量数据库是什么?阿里云、华为云、亚马逊AWS有矢量数据库服务吗 2023-07-22 03:00:04
-
llamaindex+langchain 工作流完整教程(含二者介绍) 2023-07-22 02:35:51