【课件】Python调用OpenAI API实现ChatGPT多轮对话

Python调用openai API实现多轮对话

如何实现多轮对话?

gpt-3.5-turbo 模型调用方法 openai.ChatCompletion.create 里传入的 message 是一个列表,列表里每个元素是字典,包含了角色和内容,我们只需将每轮对话都存储起来,然后每次提问都带上之前的问题和回答即可。

最终效果

在这里插入图片描述

实现代码

import openai
import json
import osos.environ["HTTP_PROXY"] = "http://127.0.0.1:20171"
os.environ["HTTPS_PROXY"] = "http://127.0.0.1:20171"# 获取 api
def get_api_key():# 可以自己根据自己实际情况实现# 以我为例子,我是存在一个 openai_key 文件里,json 格式'''{"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 = userself.messages = [{"role": "system", "content": "一个有10年Python开发经验的资深算法工程师"}]self.filename="./user_messages.json"def ask_gpt(self):# q = "用python实现:提示手动输入3个不同的3位数区间,输入结束后计算这3个区间的交集,并输出结果区间"rsp = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=self.messages)return rsp.get("choices")[0]["message"]["content"]def writeTojson(self):try:# 判断文件是否存在if not os.path.exists(self.filename):with open(self.filename, "w") as f:# 创建文件pass# 读取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()breakelif 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 接入钉钉机器人。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30698.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用OpenAI创建对话式聊天机器人

引言 在当今的技术世界中,人工智能(AI)的发展迅猛,为我们带来了许多令人兴奋的创新。其中,自然语言处理(NLP)领域的进展使得开发对话式聊天机器人成为可能。OpenAI是一家领先的人工智能研究实验…

人工智能数学基础--概率与统计8:一个很有意思的下棋输赢概率问题

一、问题 甲、乙二人下象棋,每局甲胜的概率为a,乙胜的概率为b。为简化问题,设没有和局的情况,这意味着ab1。设想甲的棋艺高于乙,即a>b。考虑到这个情况,他们商定最终胜负的规则如下: 到什么…

2018年数学与计算机大事件:18岁少年大放异彩!ABC猜想证明被推翻?

【导读】2018年数学和计算机科学领域发生了哪些重大事件?量子霸权并未实现,年轻的菲尔兹奖得主质疑日本数学家望月新一对ABC猜想的证明。还有18岁的少年、苦读8年不毕业的女研究生,以及退休软件工程师和抗衰老组织联合创始人,都在…

里程碑式的数学证明,攻破著名Erdős猜想中关键障碍

大数据文摘出品 来源:wired 编译:Canary、Andy 最近,两名数学家解决了一个关于整数相加性质最著名猜想中的第一部分。该猜想由匈牙利传奇数学家Paul Erdős于60多年前提出,一个无限整数序列在何时一定会包含至少有三个等差数的模式…

6174猜想的证明 Python

什么是6174猜想 1955年,卡普耶卡(D.R.Kaprekar)研究了对四位数的一种变换:任给出四位数k0,用它的四个数字由大到小重新排列成一个四位数m,再减去它的反序数rev(m),得出数k1m-rev(m),然后,继续对k1重复上述变换,得数k2.如此进行下去…

程序员的数学课04 万物可数学,经典公式是如何在生活中应用的?

在我们的生活和工作中,有大量的数学应用场景,一些简单的经典公式会在我们的生活中被反复验证、体现。对于经典公式的理解,能增强你的数据 sense,更能帮助你在遇到问题时,迅速找到解决思路。 这一课时我将列举四个脑洞…

评审8年终获发表,数学天才望月新一证明abc猜想,全球只有十几个数学家读懂但争议未消...

晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI abc猜想,数学界悬而未决的重要猜想,它的证明过程经过8年的同行评审,终于要在期刊上发表了。 论文作者是日本的天才数学家望月新一,他33岁起就在京都大学担任数学教授。 这一次望月新…

C++角谷猜想

题目描述: 请编写一个程序,验证角谷猜想。所谓角谷猜想是:“对于任意大于1的自然数n,若n为奇数,则将n变为3*n1,否则将n变为n的一半。”经过若干次这样的变化,一定会使n变为1。 输入格式&#…

某安网别逆向,一不小心就......

​ 大家好,我是TheWeiJun,欢迎来到我的公众号。在现代互联网中,cookie成为了网站管理的重要工具。某些网站会对cookie进行加密,以加强数据的安全性和保密性。然而,逆向加密算法并不是一件简单的事情。本文将探讨如何逆…

群晖docker实现IPV6访问

概述: 群晖docker默认没有没有开启ipv6,需要修改docker的配置文件。 修改过程: 一、首先确认自己的网络已经支持IPV6(需要光猫及路由器支持ipv6) 1.登陆www.test-ipv6.com查看是否已经接入IPV6 2.登陆自己的群晖查…

群晖传文件到服务器,文件上传到群晖服务器

文件上传到群晖服务器 内容精选 换一换 监控数据上报功能可以将系统中采集到的监控数据写入到文本文件,并以FTP或SFTP的形式上传到指定的服务器中。使用该功能前,管理员需要在FusionInsight Manager页面进行相关配置。“监控数据上传”默认为不启用&…

群晖硬盘警告修复

群晖硬盘警告修复 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000 我的群晖每次被我拿出来的时候,由于震动等原因,会时不时出现硬盘警告的提示,从而导致无法使用,现在我们来屏蔽一下…

安装群晖显示服务器忙,云服务器安装群晖

云服务器安装群晖 内容精选 换一换 华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。 登录Windows操作系统的弹性云服务器时,需使用密码方式登录。因此,用户需先根据创…

群晖php mysql网站博客,群晖建博客详细教程

群晖建博客详细教程 2017-03-01 14:23:01 36点赞 419收藏 44评论 小编注:此篇文章来自即可瓜分10万金币,周边好礼达标就有,邀新任务奖励无上限,点击查看活动详情 群晖NAS功能强大,除了大家都知道的存储文件,代替各种公有云以外,还可以当成一个网站服务器来使用。配合DDN…

群晖web文件服务器docker,群晖docker搭建数据库服务器

群晖docker搭建数据库服务器 内容精选 换一换 本手册基于华为云关系型数据库实践所编写,用于指导您完成相关设置,购买更符合业务的数据库实例。 创建一个外部服务器。外部服务器是存储OBS服务器信息或其他同构集群信息的载体。默认只有系统管理员才可以创建外部服务器,否则需…

群晖系统ftp服务器,群晖对接云服务器ftp

群晖对接云服务器ftp 内容精选 换一换 用户可以在MRS Manager界面上配置监控指标数据对接参数,使集群内各监控指标数据通过FTP或SFTP协议保存到指定的FTP服务器,与第三方系统进行对接。FTP协议未加密数据可能存在安全风险,建议使用SFTP。MRS Manager支持采集当前管理的集群内…

群晖服务器+微信同步,群晖服务器 云同步

群晖服务器 云同步 内容精选 换一换 集群中的每一个节点对应一台弹性云服务器或物理机,集群节点创建成功后,您仍可以根据需求,修改云服务器的名称或变更规格。CCE节点的部分信息是独立于弹性云服务器ECS维护的,当您在ECS控制台中修改云服务的名称、弹性公网IP,以及变更计费…

群晖使用心得

近期采购了群晖的DS920和DS220,又对比了DS420J和DS220J,总结出一些心得体会: 1、群晖的操作系统是嵌入式Linux(DSM),支持x86和ARM 两种架构,安装ipkg或opkg,再安装一些常用软件就能…

群晖DS218+部署GitLab

欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等; 起因是懒 最近开始折腾GitLab的CI功能,就打算在家部署一个GitLab,通常做…

群晖安装aria2

下载镜像:oldiy-aria2-ui-ng1 新建文件夹:aria2 -conf 设置rpc密钥,之前环境变量里面设置的secret 设置bt服务器地址 https://edam.top/tk/ 最后,需要一个热门的文件来下载,我这边使用的是【ubuntu-21.10-desktop-amd…