本文指导如何通过调用OpenAI的API完成一个简单的聊天机器人。
背景知识
API介绍
我们可以通过任何语言的 HTTP 请求、官方 Python 、 Node.js 库或社区维护的库与 ChatGPT的API 进行交互,官方API文档:
API Reference - OpenAI API (可自行去查看)
所以python是有现成包用的,会比调用原始的HTTP请求容易一些,python包:
openai/openai-python: The official Python library for the OpenAI API
本文使用Python编程语言完成一个简单的AI聊天机器人。
一次简单的调用
如果要调用ChatGPT的API其实非常简单,只需要几行代码,像下面这样:
import openai
openai.api_key = "替换为你的key"
openai.api_base = "如果走绕路这里填写对应的服务商的网址"
response = openai.ChatCompletion.create(
model='gpt-3.5-turbo',
messages=[
{'role': 'user', 'content': 'hello.'},
],
temperature=1, # 控制模型输出的随机程度
)
# 打印ChatGPT的回复
print(response.choices[0].message["content"])
运行后可以看到如下打印:
Hello! How can I assist you today?
一次调用就完成了。
几种消息的介绍
上面的messages参数中有一个role关键字,它有3中类型,对应3中消息,这里介绍一下:
系统消息
在ChatGPT的客户端聊天窗口是看不到系统消息的,这个是API中才有的,主要是给开发人员使用的。
系统消息主要用来设置聊天机器人的角色和行为,相当于给它一些默认的指令。
用户消息:
就是你在聊天窗口发的内容,称为「用户消息」,
助手消息:
就是ChatGPT发给你的内容,称为「助手消息」。
代码
来看看一个简单的完成的AI聊天机器人的代码:
import openai
openai.api_key = "替换为你的"
openai.api_base = "如果走绕路这里填写对应的服务的网址"
def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=temperature, # 控制模型输出的随机程度
)
return response.choices[0].message["content"]
context = [
# 上下文中定义一个系统角色,告诉ChatGPT他是一个友好的助手,后面的回复它都会是一个非常友好的态度
{'role': 'system', 'content': 'You are a friendly assistant.'},
]
def chat_to_bot(prompt):
# 我们发送的信息角色是user
context.append({'role': 'user', 'content': f"{prompt}"})
response = get_completion_from_messages(context)
# 注意这里,需要将先前的内容一并发给ChatGPT
# ChatGPT返回回来得消息的角色是assistant
context.append({'role': 'assistant', 'content': f"{response}"})
return f'Bot: {response}'
if __name__ == '__main__':
while True:
user_input = input("You: ")
print(chat_to_bot(user_input))
代码解释:
定义了一个
get_completion_from_messages
函数,该函数向 OpenAI API 发送一系列消息并获取响应。 messages 参数是消息对象的列表,每个对象都有一个“角色”(可以是“系统”、“用户”或“助理”)和“内容”(消息的内容) 。 “温度”参数控制模型输出的随机性。context 定义了对话的初始上下文,告诉模型它正在扮演友好助手的角色。
chat_to_bot
此函数向聊天机器人发送消息并获取其响应。它将用户的消息和机器人的响应添加到对话上下文中,因此每次对话后都会更新上下文。主循环中,它反复要求用户输入,将该输入发送到聊天机器人,并打印聊天机器人的响应。对话无限期地继续,直到程序被手动停止。
运行的结果是这样的:
You: hi
Bot: Hello! How can I assist you today?
You: What did I say in the previous sentence?
Bot: In the previous sentence, you said "hi".
You:
可以看到它知道上下文,可以一直对话下去。
注意:每一次API调用都是独立的,要让机器人理解上下文(context),那么每次API调用都需要将之前的聊天内容全部发过去。可以看到,当对话越来越长的时候,对token的消耗非常大,这是LLM的一个特点。