如何实现多轮对话?
gpt-3.5-turbo 模型调用方法 openai.ChatCompletion.create 里传入的 message 是一个列表,列表里每个元素是字典,包含了角色和内容,我们只需将每轮对话都存储起来,然后每次提问都带上之前的问题和回答即可。
import openai
import json
import os
os.environ["HTTP_PROXY"] = "http://127.0.0.1:20171"
os.environ["HTTPS_PROXY"] = "http://127.0.0.1:20171"
def get_api_key():
{"api": "你的 api keys"}
openai_key_file = './envs/openai_key'
with open(openai_key_file, 'r', encoding='utf-8') as f:
openai_key = json.loads(f.read())
return openai_key['api']
openai.api_key = get_api_key()
class ChatGPT:
def __init__(self, user):
self.user = user
self.messages = [{"role": "system", "content": "一个有10年Python开发经验的资深算法工程师"}]
self.filename="./user_messages.json"
def ask_gpt(self):
rsp = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=self.messages
return rsp.get("choices")[0]["message"]["content"]
def writeTojson(self):
if not os.path.exists(self.filename):
with open(self.filename, "w") as f:
with open(self.filename, 'r', encoding='utf-8') as f:
content = f.read()
msgs = json.loads(content) if len(content) > 0 else {}
msgs.update({self.user : self.messages})
with open(self.filename, 'w', encoding='utf-8') as f:
json.dump(msgs, f)
except Exception as e:
print(f"错误代码:{e}")
def main():
user = input("请输入用户名称: ")
chat = ChatGPT(user)
while 1:
if len(chat.messages) >= 11:
print("******************************")
print("*********强制重置对话**********")
print("******************************")
chat.writeTojson()
user = input("请输入用户名称: ")
chat = ChatGPT(user)
q = input(f"【{chat.user}】")
if q == "0":
print("*********退出程序**********")
chat.writeTojson()
break
elif q == "1":
print("**************************")
print("*********重置对话**********")
print("**************************")
chat.writeTojson()
user = input("请输入用户名称: ")
chat = ChatGPT(user)
continue
chat.messages.append({"role": "user", "content": q})
answer = chat.ask_gpt()
print(f"【ChatGPT】{answer}")
chat.messages.append({"role": "assistant", "content": answer})
if __name__ == '__main__':
main()
代码解析:
ChatGPT
类,包含三个函数:
-
__init__
初始化函数,初始化了三个个实例变量,user、messages、filename(当前用户、消息列表、存储记录的文件路径)。
-
ask_gpt
函数,将当前用户所有历史消息+最新提问发送给 gpt-3.5-turbo ,并返回响应结果。
-
writeTojson
函数,结束/重置用户时记录当前用户之前的访问数据。
-
main
函数,程序入口函数,用户输入用户名后进入与 ChatGPT 的循环对话中,输入 0 退出程序,输入 1 重置用户,退出和重置都会将当前用户之前访问数据记录搭配 json 文件中。
-
由于 gpt-3.5-turbo 单次请求最大 token 数为:4096,所以代码里限制了下对话次数。
- 你可以写个函数,从 json 文件读取历史用户访问记录,然后每次访问可以选用户。
- 你可以写个 web 服务,使用 session 或者数据库支持多用户同时登录,同时访问。
- 你可以基于之前分享的钉钉机器人项目,将 gpt-3.5-turbo 接入钉钉机器人。
如何实现多轮对话?gpt-3.5-turbo 模型调用方法 openai.ChatCompletion.create 里传入的 message 是一个列表,列表里每个元素是字典,包含了角色和内容,我们只需将每轮对话都存储起来,然后每次提问都带上之前的问题和回答即可。
目前,语音识别,即将语音内容转换为文字的技术已经比较成熟,遥想当时锤子发布会上展示的讯飞输入法语音识别,着实让讯飞火了一把。由于此类语音识别需要采集大量的样本,才能达到一定的准确度,个人很难从零开始搭建。但是,许多拥有语音识别技术的公司,或多或少会提供一些
API或者SDK供
开发者使用,这样就把语音识别的门槛降到了一个很低的程度,只需几行代码即可
实现。下面我介绍以下如何使用
Python调用百度的REST
API实现一个简单的语音识别。
注册账号,并成为
开发者
打开 http://yuyin.b
aidu.com/ ,并且使用你的百度账号登陆,如果你不是
开发者,系统会自动引导你申请成为
开发者。
本代码适用于想要调用ChatGPT3.5 API并进行二次开发的人员,当然,打算简单通过python调用ChatGPT的朋友也可以直接下载运行,前提是有一个openai的账号,获取到API。
本代码可以实现通过控制台与ChatGPT对话,并且有记忆本次对话中的历史内容的能力(多轮对话),有兴趣的小伙伴可以下载使用。当然,除了python版本,我这边还有C#版本的调用代码,有兴趣的小伙伴可以联系我。