文章目录
-
- [一. 多轮对话](#一. 多轮对话)
- [二. 使用起点: ChatCompletion](#二. 使用起点: ChatCompletion)
- [三. 调用模型:create方法](#三. 调用模型:create方法)
-
- [1. 主要的输入参数:model、message](#1. 主要的输入参数:model、message)
- [2. 对话长度和token数量管理](#2. 对话长度和token数量管理)
- [3. 可选参数](#3. 可选参数)
- [四. ChatCompletion端点的输出格式](#四. ChatCompletion端点的输出格式)
本文讨论如何使用GPT-4和ChatGPT背后的模型,以及OpenAI Python库。
目前,GPT-3.5 Turbo是最便宜且功能最多的模型。因此,它也是大多数用例的最佳选择。
一. 多轮对话
python
import openai
# 对GPT-3.5 Turbo来说,端点是ChatCompletion
openai.ChatCompletion.create(
# 对GPT-3.5 Turbo来说,模型是gpt-3.5-turbo
model="gpt-3.5-turbo",
# 消息列表形式的对话
messages=[
{"role": "system", "content": "You are a helpful teacher."},
{
"role": "user",
"content": "Are there other measures than time \
complexity for an algorithm?",
},
{
"role": "assistant",
"content": "Yes, there are other measures besides time \
complexity for an algorithm, such as space complexity.",
},
{"role": "user", "content": "What is it?"},
],
)
在hello world的例子中,我们使用了最少数量的参数,来用于预测的LLM和输入消息。
现在我们关注,输入消息中的对话格式允许模型进行多轮对话。
请注意,API不会在其上下文中存储先前的消息。问题"What is it?"问的是先前的回答,这只有在模型知道答案的情况下才有意义。每次模拟聊天会话时,都必须发送整段对话。 ing
GPT-3.5 Turbo模型和GPT-4模型针对聊天会话进行了优化,但这并非强制要求。
这两个模型可用于多轮对话和单轮任务。如果你在提示词中请求模型补全文本,那么它们也可以很好地完成传统的文本补全任务。
二. 使用起点: ChatCompletion
GPT-4和ChatGPT都使用起点是:openai.ChatCompletion
。
开发人员可以通过更改模型ID来在GPT-3.5Turbo和GPT-4之间切换,而无须修改其他代码。
三. 调用模型:create方法
ChatCompletion的create方法让用户能够调用OpenAI的模型。
当然,还有其他方法可用,但它们对与模型的交互没有帮助。你可以在OpenAI Python库的GitHub代码仓库中查看代码。
1. 主要的输入参数:model、message
ChatCompletion端点及其create方法有多个输入参数,但只有两个是必需的,如下表
参数名 | 类型 | 描述 |
---|---|---|
model | string | 可以使用openai.Model.list()列出目前可以用模型 |
message | list | 表示对话的消息对象数组。消息对象有两个属性:role(user、system、assistant)和content(包含对话消息的字符串) |
- 对话以可选的system content开始,然后是交替出现的user content和assistant content。
- system content帮助设置assistant的行为。(prompt?)
- user content相当于是用户在ChatGPT网页界面中键入的问题或句子。它既可以由应用程序的用户生成,也可以作为指令设置。
- assistant content有两个作用:要么存储先前的回复以继续对话,要么设置为指令,以提供所需行为的示例。由于模型没有任何关于
历史请求的"记忆"
,因此存储先前的消息
对于给出对话上下文和提供所有相关信息是必要的。
2. 对话长度和token数量管理
如前所述,对话的总长度与token的总数相关。这将影响以下方面。
- 成本定价基于标记计算。
- 时间
- 标记越多,响应所需的时间就越长------最长可能需要几分钟。
- 模型是否工作
管理token数量
- 标记总数必须小于模型的上限。
- 所以我们需要控制对话的长度。你可以通过
管理消息的长度
(prompt去引导)来控制输入标记的数量,并通过max_tokens参数
来控制输出标记的数量。 - OpenAI提供了一个名为
tiktoken
的库,让开发人员能够计算文本字符串中的标记数。我们强烈建议在调用端点之前使用此库来估算成本。
3. 可选参数
OpenAI提供了其他几个选项来微调用户与库的交互方式。如下几个常见参数
参数名 | 类型 | 描述 |
---|---|---|
functions | list | 由可用函数组成的数组 |
function_call | string/object | 控制模型的响应方式 - none:模型必须以标准方式响应用户 - {"name":"my_function"}表示模型必须给出使用指定函数的回答 - auto:表示模型可以在以标准方式响应用户和functions数据定义的函数之间进行选择 |
temperature | 数值(默认为1;可接受介于0和2之间的值) | - 0:表示对于给定的输入,对模型的调用很可能返回相同的结果,尽管响应结果会高度一致,但OpenAI不做保证。 - 温度越高,结果的随机性就越强,LLM通过预测一系列token来生成回答。根据输入上下文,LLM为每个潜在的标记分配概率。 - 当温度=0时,LLM将始终选择概率最高的标记,较高的温度可以产生更多样化,更具有创造性的输出 |
n | int(默认1) | 参数可以为给定消息生成多个回答。不过当温度=0时,虽然可以得到多个回答,但都相同或非常相似。 |
stream | Boolean(默认false) | 回答以流的形式呈现。当回答内容较长时,可以提供更好的用户体验。 |
max_tokens | int | - 参数指定在聊天中生成的最大标记数。虽然为可选值,强烈建议设置为合适的值,以控制成本,但是当设置的过大时,那么可能会被OpenAI忽略。 - 输入和生成的标记总数不能超过模型的上限。 |
四. ChatCompletion端点的输出格式
你已经知道如何使用基于聊天模式的模型,让我们看看如何使用模型给出的结果。
以下是Hello World示例程序的完整响应:
json
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "Hello there! How may I assist you today?",
"role": "assistant",
},
}
],
"created": 1681134595,
"id": "chatcmpl-73mC3tbOlMNHGci3gyy9nAxIP2vsU",
"model": "gpt-3.5-turbo",
"object": "chat.completion",
"usage": {"completion_tokens": 10, "prompt_tokens": 11,
"total_tokens": 21},
}
现在说明下各字段的含义
字段名称 | 类型 | 描述 |
---|---|---|
choices | 对象数组 | 包含模型实际响应的数组,默认情况如下,该数组只有一个元素,可以通过入参n 进行修改。该元素包含以下内容: 1. finish_reson:回答结束的原因。在hello world的事例中,finish_reason是stop,也就是我们从模型中得到到完整的响应。如果在输出过程中出现错误,那么将体现在该字段中; 2. index:从choices中选择对象的索引 3. message:包含role、content或function_call,role的值始终是assistant,content包含模型生成的文本。一般这样调用:response[ 'choices' ][ 0 ]['message']['content']。 |
created | timestamp | 生成的时间戳 |
id | string | OpenAI内部使用的技术标识符 |
object | string | 对于GPT-4模型和GPT-3.5模型,为chat.completion |
usage | string | 提供有关在此查询中使用的标记数的信息,从而为你提供费用信息。 - prompt_tokens表示输入中的标记数 - completion_tokens表示输出中的标记数 这里有:total_tokens = prompt_tokens + completion_tokens |