什么是代币?
令牌可以被认为是单词的片段。在 API 处理提示之前,输入被分解为标记。这些标记并没有准确地在单词开始或结束的地方被分割——标记可以包含尾随空格甚至子词。以下是一些有助于理解令牌长度的经验法则:
1 token ~= 4 chars in English
1 token ~= ¾ words
100 tokens ~= 75 words
或者
1-2 sentence ~= 30 tokens
1 paragraph ~= 100 tokens
1,500 words ~= 2048 tokens
要获得有关令牌如何堆叠的更多上下文,请考虑以下内容:
韦恩·格雷茨基 (Wayne Gretzky) 的名言“You miss 100% of the shots you don’t take”包含 11 个标记。
OpenAI 的章程包含 476 个代币。
单词如何拆分为标记也取决于语言。例如“Cómo estás”(西班牙语中的“你好吗”)包含 5 个标记(10 个字符)。较高的 token-to-char 比率会使为英语以外的语言实现 API 的成本更高。
要进一步探索标记化,您可以使用我们的交互式Tokenizer 工具,它允许您计算标记的数量并查看文本如何分解为标记。或者,如果您想以编程方式标记文本,请使用Tiktoken作为专门用于 OpenAI 模型的快速 BPE 标记器。您还可以探索的其他此类库包括用于 Python 的transformers包或用于 node.js 的gpt-3-encoder包。
令牌限制
根据使用的模型,请求最多可以使用 4097 个在提示和完成之间共享的令牌。如果您的提示是 4000 个令牌,您的完成最多可以是 97 个令牌。
该限制目前是一种技术限制,但通常有创造性的方法可以在限制内解决问题,例如压缩您的提示,将文本分成更小的部分等。
代币定价
API 以不同的价位提供多种模型类型。每个模型都有一系列的功能,davinci是最有能力的,ada是最快的。对这些不同模型的请求定价不同。
探索代币
API 根据语料库数据中的上下文处理单词。GPT-3 接受提示,将输入转换为标记列表,处理提示,并将预测的标记转换回我们在响应中看到的单词。
对我们来说两个相同的词可能会生成不同的标记,具体取决于它们在文本中的结构。考虑 API 如何根据文本中的上下文为单词“ red ”生成标记值:
在上面的第一个示例中,“red”的标记“2266”包含一个尾随空格。
‘Red’ 的标记“2296”(带有前导空格并以大写字母开头)不同于带有小写字母的“red”的标记“2266”。
在句子开头使用“红色”时,生成的标记不包含前导空格。令牌“7738”与该词的前两个示例不同。
观察:
令牌出现的可能性越大/频率越高,分配给它的令牌编号越低:
1.在所有 3 个句子中,为这段时间生成的标记都是相同的(“13”)。这是因为,在上下文中,句号在整个语料库数据中的使用非常相似。
2.为“红色”生成的令牌根据其在句子中的位置而有所不同:
句子中间的小写字母:‘red’ - (token: “2266”)
句子中间大写:‘Red’ - (token: “2297”)
句子开头大写:‘Red’ - (token: “7738”)
使用令牌知识更好地设计提示
以空格结尾的提示
现在,由于我们知道标记可以包含尾随空格字符,因此请牢记以空格字符结尾的提示可能会导致输出质量较低。这是因为 API 已经在其令牌字典中包含尾随空格。
使用 logit_bias 参数
可以在logit_bias参数中设置特定标记的偏差,以修改指定标记出现在完成中的可能性。例如,考虑一下我们正在构建一个人工智能烘焙助手,它对其用户的鸡蛋过敏反应敏感。
当我们使用提示“ The ingredients for banana bread are ”运行 API 时,响应将包含“鸡蛋”作为第二种成分的概率为 26.8%。
注意:要在Playground中查看完成概率,请从Show Probabilities下拉列表中选择Full Spectrum。
代币:
尾随空格的单数:‘egg’ - “5935”
带尾随空格的复数形式:‘ eggs’ - “9653”
为 ‘Egg’ 或 ‘Eggs’ 生成的子词标记 - ‘gg’:“1130”
logit_bias参数接受介于 -100 到 +100 之间的偏差值,极值会导致相关令牌的禁止 (-100) 或排他选择 (100) 。
将 logit 偏差添加到提示中将修改单词“鸡蛋”(及其变体)包含在我们的香蕉面包提示的响应中的可能性。上面的提示生成一个不包含任何鸡蛋的响应!
虽然我们不能保证它会生成最好的无蛋香蕉面包食谱,但 AI 烘焙助手满足了它对用户鸡蛋过敏的考虑。