我如何知道 GPT-3 请求使用了多少令牌?

fab*_*ice 10 gpt-3

我正在围绕 GPT-3 构建一个应用程序,我想知道我发出的每个请求使用了多少令牌。这可能吗?如何实现?

Sch*_*der 10

使用实际标记器计算标记

要在 python 中执行此操作,首先安装Transformers包以启用GPT-2 Tokenizer,它与[GPT-3] 使用的标记生成器相同

点安装变压器

然后,要标记字符串“Hello world”,您可以选择使用 GPT2TokenizerFast 或 GPT2Tokenizer。

from transformers import GPT2TokenizerFast\
tokenizer = GPT2TokenizerFast.from_pretrained("gpt2")\
number_of_tokens = len(tokenizer("Hello world")['input_ids'])
Run Code Online (Sandbox Code Playgroud)

或者

from transformers import GPT2Tokenizer\
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")\
number_of_tokens = len(tokenizer("Hello world")['input_ids'])
Run Code Online (Sandbox Code Playgroud)

无论哪种情况,tokenizer() 都会生成一个代表字符串的 Python 标记列表,可以使用 len() 对其进行计数。该文档没有提及这两种方法之间的行为差​​异。我在文本和代码上测试了这两种方法,它们给出了相同的数字。from_pretrained 方法慢得令人不快:GPT2Tokenizer 为 28 秒,GPT2TokenizerFast 为 56 秒。加载时间主导体验,因此我建议不要使用“快速”方法。(注意:第一次运行 from_pretrained 方法中的任何一个时,将下载并安装一个 3MB 的模型,这需要几分钟的时间。)

近似令牌计数

分词器既慢又重,但是可以在它们之间来回进行近似,只使用字符或标记的数量。我通过观察 GPT-2 分词器的行为得出了以下近似值。它们适用于英文文本和 Python 代码。第三和第四个函数可能是最有用的,因为它们让我们可以快速地将文本放入 GPT-3 的令牌限制中。

import math
def nchars_to_ntokens_approx(nchars):
    #returns an estimate of #tokens corresponding to #characters nchars
    return max(0,int((nchars - 2)*math.exp(-1))) 

def ntokens_to_nchars_approx(ntokens):
    #returns an estimate of #characters corresponding to #tokens ntokens
    return max(0,int(ntokens*math.exp(1) ) + 2 )

def nchars_leq_ntokens_approx(maxTokens):
    #returns a number of characters very likely to correspond <= maxTokens
    sqrt_margin = 0.5
    lin_margin = 1.010175047 #= e - 1.001 - sqrt(1 - sqrt_margin) #ensures return 1 when maxTokens=1
    return max( 0, int(maxTokens*math.exp(1) - lin_margin - math.sqrt(max(0,maxTokens - sqrt_margin) ) )) 

def truncate_text_to_maxTokens_approx(text, maxTokens):
    #returns a truncation of text to make it (likely) fit within a token limit
    #So the output string is very likely to have <= maxTokens, no guarantees though.
    char_index = min( len(text), nchars_leq_ntokens_approx(maxTokens) )
    return text[:char_index]
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说非常快,几乎是瞬间的。我不知道你为什么要56。 (3认同)

小智 3

OPEN-AI 通过代币对 GPT-3 使用费进行收费,这同时计算提示和答案。对于 OPEN-AI,750 个单词相当于大约 1000 个令牌,或者令牌与单词的比率为 1.4。令牌的定价取决于您所采用的计划。

我不知道有更准确的估算成本的方法。也许使用 Hugging Face 中的 GPT-2 分词器会有所帮助。我知道来自 GPT-2 标记生成器的标记在传递到 logit 偏差数组中的 GPT-3 时会被接受,因此 GPT-2 标记和 GPT-3 标记之间存在一定程度的等效性。

然而,GPT-2 和 GPT-3 模型不同,众所周知,GPT-3 比 GPT-3 具有更多参数,因此 GPT-2 估计可能较低。我确信您可以编写一个简单的程序,通过比较提示和令牌使用情况来估计价格,但这可能需要一些时间。