Azure OpenAI 入门教程 : Token 和 Message 概念

如果想要构建一个系统,则远远不止是一个问题,或者对 API 的一次简单调用就可以。

所以接下来的内容,我会分享一些使用 Azure OpenAI 或者其他大语言模型来构建复杂应用的方式。

今天我们先来看看,关于 Token 和如何处理 Chat Completion Message 的有关话题。

关于大语言模型是如何工作的

在前面,我们学习过了如何通过 Python SDK 来调用 Azure OpenAI ,这时相信你可以非常轻松的实现下方的功能,来进行问答。

Azure OpenAI

我们把上面的方法,稍微封装一下,就可以非常简单的传入一个问题来快速调用 GPT。

Azure OpenAI

我们换个问题,去问 GPT 模型,让他将单词 lollipop 反转,你会发现一个神奇的现象,这么简单的问题 GPT 竟然回答错了。

Azure OpenAI

为什么 GPT 没法做到这种看似非常简单的问题呢。

Tokens

这就要引申出更多关于 Tokens 的概念。我们知道 Azure OpenAI 这种 LLM在调用的时候会消耗 Token ,也会有 max token 的限制。

token 这个概念是出现在自然语言处理技术的研究中,在把文字输给计算机时需要切分一下,大段文本会被分割成小块,这些被拆分后的“小块”称为连续子字符串——token。

而这个被切分后的 token 并不是完全和单词数量一一对应的。

比如下面的英文都是很常见的英文,这时候单词和 token 基本都是能对应上的,6个单词就会消耗 6 个 token

Azure OpenAI

而如果你的英文单词不太常见,就会被拆分为多个 token ,比如下面的 Prompting 是一个单词,但被拆分为 3 个 token。

Azure OpenAI

而 lollipop 就是这种单词,他被拆分为3个 token ,这时候 GPT 把他进行倒着排就会有些难以理解,导致出错。

Azure OpenAI

解决办法也非常容易,你把lollipop 的每个字母都拆分开,再去让他倒着排,GPT 就会了。

Azure OpenAI

这是因为 GPT 会把每个字母都认为是一个 token ,这种情况下直接将Token 进行倒排就会很容易。

Azure OpenAI

在英文中,一个 token 大概是4个字符,或者大约四分之三个单词。而同一句话英文的 token 如果是4个,中文可能会消耗10几个 token。这是因为 LLM 模型所使用的分词技术基本都是针对英文进行的优化。其他语言的 token 都会比英文要高,也就导致其他语言的成本会比英文高。

而不同的LLM 大语言模型会对 token 有不同的限制,这个限制是input + completion 一起都会算作 token的数量,而不只是提问。

下图是 Azure 中不同模型的 token限制,当你的 input + completion 超过 max tokens 后,GPT 模型就会报错。

Azure OpenAI

获得 Token 的使用情况

既然有 Token 限制,那在我们制作基于 ChatGPT 的应用时,一定想要得知token 的消耗情况。

这个 token 的消耗实际上已经在 API 调用时就返回给了我们。

prompt_tokens 是提示词的token

completion_tokens 是输出结果的 token

total_tokens 是总token

Azure OpenAI

Message 中的 System,

User 和 Assistant

接下来我们看一下 Chat Completion 操作中。之前介绍过要传递 messages 参数。

这个参数中需要指定每一个对话内容的 role 和 content。

而 role 是固定的三种 system, user 和assistant

Azure OpenAI

看看这三个角色的用途。

我们先把代码修改下,从而可以每次调用传递 message 。

然后我在 sytem 中描述"你是一个 Excel 专家",这个信息实际上是用来指定 AI 模型的,可以让 AI 模型来充当角色或者让模型改变后续整体回答的方式。

因为我这里指定了是 Excel 专家,所以在 user 中直接提问的时候,模型就会以Excel 专家的身份回答。

Azure OpenAI

所以相当于 system 是用来设置 AI 模型也就是 Assistant 的行为, Assistant 就是 LLM 大语言模型的响应结果,而User 就是用户输入的 Prompt。

Azure OpenAI

这时如果你想让 GPT 模型在回答问题时知道上下文信息,那就需要传递 message 时带上之前的整个对话,包括 user 和 assistant 的内容。

THE END