OpenAI 的 GPT 接口如何确保在同一次会话中?

在用 OpenAI 构建大语言模型的场景中,通过 OpenAI 的 GPT 模型进行对话或生成文本是一项重要的任务。在这项任务中,保持对话的连贯性和一致性对于提供良好的用户体验至关重要。
需求分析
为了确保在同一次会话中保持对话的连贯性,OpenAI 的 GPT 接口可以通过追踪对话历史的方式实现:即在每次对话请求中,将完整的对话历史作为输入提供给 GPT 模型。
对话历史包含了先前对话中用户的输入和模型的回复。通过将完整的对话历史提供给模型,模型会使用前面的对话内容来理解当前的上下文,并据此生成响应。这种追踪上下文的能力有助于确保在同一次会话中保持连贯性,使得模型的回复能够与前面的对话内容相符。
在实际代码中,你可以通过在每个对话中使用一个列表(数组)来保存对话历史。每当你向 GPT 发送请求时,你需要将该列表作为输入的一部分传递给 GPT。这样,GPT 就可以根据对话历史了解整个对话的上下文。话不多说,下面进入实操。
起步
1. 环境准备
- 本文通过一个 Python 脚本来实际操作,如果你还没有配置环境,你需要先配置相关的 Python 环境,可参考 Python 环境搭建 这篇文章。
- 除此之外,你还需要准备一个 OpenAI 提供的 API_KEY。
如果都准备好了,下面进入实操阶段。
2. 示例代码
以下是一个示例代码,演示如何使用 Python 和 OpenAI 的 GPT 接口来保持对话的一致性。你可以在相关的 IDE 编辑器(比如 Visual Studio Code)中新建一个以 .py
为后缀命名的文件,然后将代码粘贴进去并运行。
import openai
import os
# 读取环境变量中的api_key
openai.api_key = os.environ.get("OPENAI_API_KEY")
# 也可直接写api_key
#openai.api_key = 'API_KEY'
# 初始化对话历史,也可以直接置为空
dialogue_history = [
{'role':'system', 'content':'你是个友好的聊天机器人。'}
]
def send_message(message,model="gpt-3.5-turbo"):
# 将当前消息添加到对话历史中
dialogue_history.append(message)
# 发送请求给 OpenAI GPT
response = openai.ChatCompletion.create(
model=model,
messages=dialogue_history,
temperature=.7, # 控制模型输出的随机程度
max_tokens=1000, # 控制生成回复的最大长度
)
# 提取 GPT 的回复
reply = response.choices[0].message['content']
return reply
# 对话
while True:
user_input = input("输入: ")
message = {"role": "user", "content": user_input}
print("GPT回答: ", send_message(message))
如果有相关的报错,大概率与运行环境有关,其中有三个常见问题:
- 没有安装 openai 第三方库:
pip install openai
- 你的 API_KEY 不能使用
- 网络请求超时(没有科学上网)
与 GPT 对话
当上面的示例代码运行之后,即可展开对话,示例对话如下:
输入:你是谁?
GPT 回答:我是一个AI聊天机器人,可以回答您的问题、提供帮助和进行闲聊。
已初始化对话历史,可以询问 GPT 是谁

输入:我的名字是什么?
GPT 回答:很抱歉,我无法知道您的名字,因为我是一个智能聊天机器人,无法获取您的个人信息。
因为还没告诉过 GPT 我的名字,所以它不知道

输入: 我的名字叫 Ring,记住了吗?
GPT回答: 我记住了,Ring。很高兴认识你!有什么我可以帮你的吗?
告诉 GPT 我的名字叫什么

输入: 我的名字叫什么?
GPT回答: 您的名字是 Ring。
再次询问,根据上下文知道了我的名字

输入: 我改名了,从现在起,我的名字叫 Liam
GPT回答: 好的,Liam,很高兴认识你!有什么我能帮助你的吗?
改个名字测试一下

输入: 我的名字叫什么?
GPT回答: 您的名字是Liam。
再次询问,GPT 的回答是更改后的名字

输入: 我一共取过多少个名字?
GPT回答: 你曾经告诉我两个名字:Ring和Liam。
上下文只提供过两个名字,所以 GPT 回答也正确

总结
以上就是通过 OpenAI 的 GPT 接口在同一次会话中的演示操作,想要学习更多关于 AI 方面的知识,可以访问如下链接:
- OpenAI 学习文档:OpenAI 中文文档
- Prompt 提示工程:Prompt 学习指南
- 面向开发者的 Prompt 工程:Prompt 工程指南
知识扩展:犀牛书中文文档技术大全