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

nukf8bse  于 2023-03-13  发布在  其他
关注(0)|答案(4)|浏览(353)

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

ni65a41a

ni65a41a1#

使用实际令牌化器计算令牌

要在python中执行此操作,首先安装transformers包以启用GPT-2令牌器,它是用于[GPT-3]的the same令牌器:
管道安装变压器
然后,为了标记字符串“Hello world”,您可以选择使用GPT 2 TokenizerFast或GPT 2 Tokenizer。

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

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

在这两种情况下,tokenizer()都会生成一个表示字符串的token的python列表,这个列表可以用len()来计数。文档中没有提到这两个方法在行为上的任何区别。我在文本和代码上测试了这两个方法,它们给出了相同的数字。from_pretrained方法非常慢:GPT 2 Tokenizer为28 s,GPT 2 TokenizerFast为56 s。加载时间主导了体验,所以我建议不要使用“快速”的方法。(注意:第一次运行from_pretrained方法时,将下载并安装一个3 MB的模型,这需要几分钟的时间。)

逼近令牌计数

记号化器又慢又重,但是可以在它们之间来回进行近似,只使用字符或记号的数量。我通过观察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 - init_offset)*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]
a7qyws3x

a7qyws3x2#

OPEN-AI通过令牌收取GPT-3使用费,这将同时计算提示和答案。对于OPEN-AI,750个单词将相当于大约1000个令牌或令牌与单词的比率为1.4。令牌的定价取决于您的计划。
我不知道估算成本的更准确的方法。也许使用Huggingface的GPT-2标记器会有所帮助。我知道GPT-2标记器中的标记在传递给logit偏差数组中的GPT-3时会被接受,因此GPT-2标记和GPT-3标记之间存在一定程度的等价性。
但是GPT-2和GPT-3模型是不同的,GPT-3比GPT-3有更多的参数,所以GPT-2的估计值可能更低。我相信你可以写一个简单的程序,通过比较提示和令牌使用来估计价格,但这可能需要一些时间。

rwqw0loc

rwqw0loc3#

下面是openai-cookbook中的一个例子,它非常适合我:

import tiktoken

def num_tokens_from_string(string: str, encoding_name: str) -> int:
    """Returns the number of tokens in a text string."""
    encoding = tiktoken.get_encoding(encoding_name)
    num_tokens = len(encoding.encode(string))
    return num_tokens

num_tokens_from_string("tiktoken is great!", "gpt2")
>6
5f0d552i

5f0d552i4#

用于计算GPT-3请求使用的令牌数的代码:

def count_tokens(input: str):
    tokenizer = GPT2TokenizerFast.from_pretrained("gpt2")
    res = tokenizer(input)['input_ids']
    return len(res)

print(count_tokens("Hello world"))

相关问题