之前发现ChatGPT居然能够有记忆功能, 能够记得之前聊过什么, 终于感觉机器有点人性化了, 很好奇是怎么实现的.
经过查资料, 发现很简单, 其实ChatGPT并没有真正"记忆"功能, 而是把历史聊天记录一并发过去了, API接口处理的字数也是有限制的, 如果聊得够多, 他就会丢弃"忘记"最早聊过的内容.
现在就让我们试试使用ChatGPT的API实现带上下文功能的对话.
官方文档地址: https://platform.openai.com/docs/
首先我们需要先创建API KEY,这个 API KEY 是用于 HTTP 请求身份验证的,可以创建多个。
到OpenAI官网创建API KEY, 没有账号的要先去弄个账号, 账号网上有注册教程, 也可以直接购买现成的。
创建地址:https://platform.openai.com/account/api-keys
注意 API 调用是收费的,新注册账号会赠送一些额度
安装官方的openai库
pip install openai
ChatGPT API调用示例:
import os
import openai
# 设置API key
openai.api_key = os.getenv("OPENAI_API_KEY")
# 给ChatGPT发送请求
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hello!"}
]
)
# 打印请求结果
print(completion.choices[0].message)
Role角色参数详解
user
表示提交prompt的一方。
assistant
表示给出completion响应的一方,实际上就是ChatGPT本身。
system
message里role为system,是为了让ChatGPT在对话过程中设定自己的行为,
不含上下文的对话
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
while True:
content = input("User: ")
messages = [{"role": "user", "content": content}]
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages
)
chat_response = completion
answer = chat_response.choices[0].message.content
print(f'ChatGPT: {answer}')
上面这个实现里,每次只发送了当前输入的信息,并没有发送对话的历史记录,所以ChatGPT无法知道上下文。
我们来看对话效果如下:
User: 你好
ChatGPT: 你好!我是AI助手,有什么可以帮到您的吗?
User: 我刚才说了什么
ChatGPT: 很抱歉,由于我是AI语音助手,无法得知您刚才说了什么,请您再次告知。
包含聊天记录的案例
import openai
openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
上面这段代码里,使用了3种角色的role,这个messages发送给ChatGPT后,ChatGPT就有了上下文,知道作为user的我们说了什么,也知道作为assistant的自己回答了什么。
想通过API实现包含上下文信息的多轮对话的关键就是用好role字段。
改进一下, 包含上下文的对话
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
messages = []
while True:
content = input("User: ")
messages.append({"role": "user", "content": content})
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages
)
chat_response = completion
answer = chat_response.choices[0].message.content
print(f'ChatGPT: {answer}')
messages.append({"role": "assistant", "content": answer})
上面这个实现里,每次发送请求给ChatGPT时,把历史对话记录也一起发送,所以ChatGPT知道对话的上下文。
我们来看对话效果如下:
User: 你好
ChatGPT: 你好!我是AI助手,有什么需要帮忙的吗?
User: 我刚才说了什么
ChatGPT: 你刚才说了 "你好"。
目前发现的问题
这只是个简单的测试, 目前还是有很多问题的.
token限制问题: 由于是累加的, 聊天达到一定的数量后, 就会超出token限制.
API是按照token数量收费的, 由于每次都带之前的聊天, 对token消耗也很大.
评论 (0)