OpenAI tokens and limits(what is an openai token)
I. OpenAI令牌是甚么
A. 令牌是甚么
- 令牌是用于自然语言处理的词语片断
- 对英文文本,一个令牌约等于4个字符或0.75个单词
B. OpenAI令牌的功能和用处
- 令牌是OpenAI GPT模型计算文本长度的基本单位
- 令牌由字符组成,表示文本的基本单元
例子:
在自然语言处理中,令牌是对文本进行处理的基本单元。它们可以是一个单词、一个词的一部份或是几个字符。根据OpenAI的定义,一个英文令牌通常表示4个字符或0.75个单词。这些令牌被用于计算文本的长度,并作为OpenAI GPT模型的输入。
II. 令牌的处理和切割
A. 在API处理输入之前,输入文本会被切割成令牌
- 令牌是对输入文本进行处理前的分割单位
- 令牌并不是完全依照词语切割
例子:
在使用OpenAI API之前,输入文本会被分割成令牌。这些令牌可能包括一个整词、部份词或是几个字符。它们其实不是简单地依照词语的边界来切割,而是根据一定的规则进行分割,这样可以更好地处理文本的语义和上下文。
III. 令牌的编码和文本长度
A. 令牌是OpenAI GPT模型计算文本长度的基本单位
- 令牌代表文本的字符组群
- 令牌数量决定了模型对文本的理解和处理能力
例子:
在OpenAI GPT模型中,令牌是计算文本长度的基本单位。每一个令牌代表文本中的一些字符组合,它们共同构成了全部文本。模型处理的文本长度取决于令牌的数量。具有更多令牌的文本可以提供更多的上下文和更复杂的语义表达,从而增强了模型的理解和处理能力。
IV. 令牌的限制和利用
A. OpenAI模型令牌限制
- 较新的OpenAI模型的令牌限制可到达32k个
- 需要大量上下文嵌入的查询会快速耗尽令牌限制
B. openai-tokens的利用
- 可用于截断单个提示或同时截断多个提示
- 提供了针对区别利用的动态解决方案
例子:
OpenAI的较新模型可以处理长达32k个令牌的文本。但是,对那些需要大量上下文嵌入的查询,令牌限制会很快到达,从而致使模型没法处理完全的文本。为了解决这个问题,可使用openai-tokens来截断单个或多个提示,以适应区别的利用需求。这类动态的截断方式可以帮助用户更好地控制输入文本的长度,并使其适应模型的要求。
V. 令牌生成和分词器
A. 分词器生成令牌
- 分词器将文本划分为字符组群情势的令牌
- 令牌生成是文本编码的一部份
例子:
分词器是一种将文本划分为字符组群情势的工具。它会将输入文本转换为一系列的令牌,每一个令牌代表文本中的一部份内容。令牌生成是文本编码进程的一部份,它通过将文本划分为令牌来帮助模型理解文本的结构和语义。
what is an openai token的进一步展开说明
开放式人工智能令牌和限制
Craig Dunn
2023年8月24日
尊重的提示工程师们:
在我们的博客系列中所介绍的Jetchat演示利用使用了OpenAI Chat API,每篇博客文章中添加新功能时,它都支持包括了公道数量回复的对话。但是,就像任何LLM要求API一样,它们都有可以处理的令牌数量限制,并且API是无状态的,这意味着所有所需的上下文都一定要包括在提示中。
这意味着每一个聊天要求和响应都会被添加到对话历史记录中,并且在每次新输入后,全部历史记录都将被发送到API,以便使用上下文给出最好答案。实际上,组合的聊天历史记录中的令牌数量将超过您模型的限制(例如,ChatGPT 3.5本来有4096个令牌的限制)…请注意,给定API要求的限制是提示和完成的组合,因此如果提示(包括聊天历史记录)是3000个令牌,则完成部份不能超过大约1000个令牌。
即便您的模型有更高的限制,一次继续进行的对话终究或者会用完令牌。
在接下来的几周中,我们将讨论超出令牌限制继续进行聊天“对话”的策略,从本节开始讨论令牌的概念。
甚么是令牌?
要了解“令牌”是甚么,请参阅OpenAI文档中的“令牌是甚么和如何计数”。您可以将令牌大致看做是英语中的一个单词,虽然对简单/常见的单词来讲,这更加准确,而其他单词可能由多个令牌组成。令牌还可以包括标点符号,并且可能包括空格。令牌还可以是非英文字符。
OpenAI模型的令牌限制在模型概述中显示。gpt⑶.5的默许限制最初为4096个令牌,但现在可使用多达32768个令牌的更新模型。您还会看到定价是基于令牌使用情况的,因此更多的令牌将增加费用!
可视化令牌
OpenAI的令牌化器可以帮助您将提示分解为令牌,为了取得最准确的计数,您应当以API期望的方式表示提示语法(包括系统提示),包括任何JSON格式。
以下是一个带有系统提示的Jetchat演示利用的聊天交互示例:
供参考,这是底层聊天API结构的示例:
{ “messages”: [ {“role”: “system”, “content”: “You are a personal assistant called JetchatAI. You will answer questions about the speakers and sessions at the droidcon SF conference. The conference is on June 8th and 9th, 2023 on the UCSF campus in Mission Bay. It starts at 8am and finishes by 6pm. Your answers will be short and concise, since they will be required to fit on a mobile device display. When showing session information, always include the subject, speaker, location, and time. ONLY show the description when responding about a single session. Only use the functions you have been provided with.”}, {“role”: “user”, “content”: “what sessions are on now?”}, ] }
在令牌化器上的可视化效果,聊天提示仅为166个令牌(其中大部份是系统提示):
而模型的完成响应仅为30个令牌。
如果随后的用户输入和响应大致相同(大约60个令牌),在到达4096个令牌限制之前,聊天可以包括65次与用户的对话。虽然65个问题听起来很多,但是使用嵌入或函数来增强您的聊天也会消耗令牌,这意味着聊天可能比预期的要“结束”得早很多。
令牌和嵌入
使用嵌入是在模型的响应中包括自定义数据的好方法(乃至只是比模型训练更及时的数据)。
在《JetchatAI借助嵌入变得更智能》博文中,我们展现了如何通过将用户的问题的嵌入与最新数据集(在演示中是会议议程列表)进行匹配来为提示添加上下文。下面是一个使用嵌入生成正确结果的示例查询:
虽然用户的问题只有几个词,但请注意,下面的API调用包括了与所有会议议程比较查询的嵌入值的详细信息:
{ “messages”: [ {“role”: “system”, “content”: “You are a personal assistant called JetchatAI. You will answer questions about the speakers and sessions at the droidcon SF conference. The conference is on June 8th and 9th, 2023 on the UCSF campus in Mission Bay.It starts at 8am and finishes by 6pm. Your answers will be short and concise, since they will be required to fit on a mobile device display. When showing session information, always include the subject, speaker, location, and time. ONLY show the description when responding about a single session. Only use the functions you have been provided with.”}, {“role”: “user”, “content”: “Following are some talks/sessions scheduled for the droidcon San Francisco conference in June 2023: Speaker: CRAIG DUNN Role: Software Engineer at Microsoft Location: Robertson 1 Date: 2023-06-09 Time: 16:30 Subject: AI for Android on- and off-device Description: AI and ML bring powerful new features to app developers, for processing text, images, audio, video, and more. In this session we’ll compare and contrast the opportunities available with on-device models using ONNX and the ChatGPT model running in the cloud. Use the above information to answer the following question. Summarize and provide date/time and location if appropriate. are there any sessions on AI?”} ]}
下图显示的是令牌化器的可视化效果-这个单独的交互现在是511个令牌的要求和77个令牌的响应:总共588个令牌。
虽然相对4096令牌的限制来讲,558个令牌依然很少,但是如果有多个嵌入与用户的问题匹配,令牌可能会更快地被“消耗”完。例如,“有关Gradle的讲座吗?”这个查询返回了六个嵌入匹配,包括会议议程的详细信息和描写。
由于清晰起见,完全的API要求被省略了,但它比前面的示例大很多,接近2000个令牌,几近是原始4096个令牌限制的一半!
虽然较新的OpenAI模型可以具有高达32k个令牌的限制,但是如果查询需要大量的嵌入上下文,它们将很快填满令牌限制,乃至在仅几个交互后令牌就会耗尽。
令牌和函数
在OpenAI聊天API中声明函数会以一种区别的方式消耗令牌,更类似于系统提示。《OpenAI聊天在Android上使用函数》博文展现了怎样使用Kotlin添加函数,使用客户端库来抽象掉JSON语法,但在幕后,它依然会向聊天API要求中添加令牌。
以下是触发天气函数的一个示例用户查询:
下面是发送的API要求示例:
{ “messages”: [ {“role”: “system”, “content”: “You are a personal assistant called JetchatAI. Your answers will be short and concise, since they will be required to fit on a mobile device display. Only use the functions you have been provided with.”}, {“role”: “user”, “content”: “what’s the weather like in SF”} ], “functions”:[ { “name”: “currentWeather”, “description”: “Get the current weather in a given location”, “parameters”: { “type”: “object”, “properties”: { “latitude”: { “type”: “string”, “description”: “The latitude of the requested location, e.g. 37.773972 for San Francisco, CA”, }, “longitude”: { “type”: “string”, “description”: “The longitude of the requested location, e.g. ⑴22.431297 for San Francisco, CA”, }, “unit”: {“type”: “string”, “enum”: [“celsius”, “fahrenheit”]}, }, “required”: [“latitude”,”longitude”], } ], “function_call”: “auto” }
函数的JSON在这个要求中使用了274个令牌(总共360个令牌):
函数还以另外一种方式使用令牌-模型还会与函数进行两次交互-在“调用”函数之前,它会“调用”函数,并在最后将生成的结果作为响应展现给用户时,您的代码会对其进行回应。
{“role”: “assistant”, “content”: null, “function_call”: {“name”: “currentWeather”, “arguments”: “{ ”latitude”: ”37.773972”, ”longitude”: ”⑴22.431297”}”}}, {“role”: “function”, “name”: “currentWeather”, “content”: “{”temperature”: “73”, ”unit”: ”fahrenheit”, ”description”: ”Mostly sunny. High near 73, with temperatures falling to around 68 in the afternoon.”}”}
对天气结果,这些消息很短-只有113个令牌-但与上面的嵌入示例一样,如果函数返回大量文本作为结果,它将耗尽您的令牌限制。
最后,您可能会声明多个函数,例如在博文《将OpenAI函数调用与嵌入组合》中。该博文的示例使用了用于函数声明的令牌,和潜伏的嵌入匹配,函数结果可能会很冗杂,由于它们将包括冗杂的会议描写。
构建无穷聊天…
虽然简单的LLM查询可以支持大量的聊天交互,但是如果在模型的响应中借助嵌入或函数进行响应,很快就会用完您模型的令牌限制。一旦要求的大小超过限制,聊天将不会返回更多的响应。
为了克服这个限制,我们需要一种策略,在不单单是盲目地每次都发送全部聊天历史记录的情况下,为模型提供尽量多的上下文。
解决这个问题的方法包括:
滑动窗口(先进先出)
摘要
嵌入
在接下来的几周中,我们将深入探讨这些方法。
资源和反馈
以下是有关OpenAI开发者社区论坛中关于Chat API使用的讨论链接:
请注意,在上述所有JSON中为了清晰而省略了“model”:“gpt⑶.5-turbo-0613”模型规范参数。
我们期待您对本文提供反馈,包括您从ChatGPT提示中学到的任何技能或窍门。
如果您有任何想法或问题,请使用反馈论坛或在Twitter上向我们发送消息 @surfaceduodev。
本周将没有直播内容,但您可以在YouTube上查看存档视频。
what is an openai token的常见问答Q&A
问题1:OpenAI GPT模型中的token是甚么?
答案:在OpenAI GPT模型中,token被视为文本的基本单位。它们是文本的字符群组,由tokenizer根据特定的规则生成。对英文文本而言,一个token大约等于4个字符或0.75个单词。以参考资料,《莎士比亚全集》约有90万个单词或120万个token。
- 例如,句子”The cat is running.”将被分解成4个tokens:”The”、”cat”、”is”、”running”。
- tokens在自然语言处理中被视为词语的片断,用于模型的处理和计算。
- tokens的数量决定了文本的长度和模型的输入大小。
问题2:tokens是怎样在OpenAI GPT⑶中计数的?
答案:OpenAI GPT⑶模型中,tokens的计数方式是根据文本的字符数或单词数来肯定的。
- 在英文文本中,一般以4个字符等于1个token的比例计算。
- 以单词数计算,则大约是0.75个单词等于1个token。
- 这个计算方法可以作为估算的参考,由于字符和单词的长度会有一定的差异。
例如,句子”The cat is running.”的tokens计数为4个,根据字符计数即为16个字符,根据单词计数即为3个单词。
问题3:怎样使用OpenAI GPT⑶的tokens?
答案:使用OpenAI GPT⑶的tokens需要将待处理的文本拆分成tokens。
- 在API处理之前,输入文本会被拆分成tokens。
- 这些tokens是根据tokenizer生成的,具体生成规则依赖于所使用的tokenizer。
- 拆分成tokens后,可以将它们作为模型的输入。
例如,句子”The cat is running.”将被拆分成4个tokens:”The”、”cat”、”is”、”running”。这些tokens可以作为OpenAI GPT⑶模型的输入。
问题4:OpenAI GPT模型中的tokens有哪几种限制?
答案:OpenAI GPT模型中的tokens有一定的限制。
- 区别版本的GPT模型具有区别的token限制,较新的模型可以支持多达32,000个tokens。
- 但是,如果查询需要大量的嵌入上下文信息,可能会迅速到达token限制。
- 超过token限制可能会致使API没法处理完全的文本。
因此,在使用OpenAI GPT模型的进程中需要注意tokens的数量,确保不超过模型的限制。