【编程必备】保姆级教学:简单教你使用 Python 调用 ChatGPT-3.5-API

前天 OpenAI 开放了两个新模型的api接口,专门为聊天而生的 gpt-3.5-turbo 和 gpt-3.5-turbo-0301。

在这里插入图片描述

ChatGPT is powered by gpt-3.5-turbo, OpenAI’s most advanced language model.

从上面这句话,我们可以知道现在 chat.openai.com 官网就是由 gpt-3.5-turbo 模型提供的服务,现在官方公开了这一模型的调用接口,这使得我们这些普通开发者也能直接在自己的应用/服务中使用这个狂揽亿万用户的模型。

接下来将和大家介绍如何利用 Python 快速玩转 gpt-3.5-turbo。

首先你需要有一个 openai 账号,如何注册我就不多说了,网上教程很多,而且很详细,如果有问题可以加我微信:pythonbrief,添加通过后请直接描述你的问题+问题截图

访问下面页面,登录 openai 账号后,创建一个 api keys。

# api keys 创建页面
https://platform.openai.com/account/api-keys

接下来很简单了,安装 openai 官方的 Python SDK,这里需要注意的是得安装最新版本 openai,官方推荐的是 0.27.0 版本。

pip install openai==0.27.0

直接上请求代码:

import openai
import json# 目前需要设置代理才可以访问 api
os.environ["HTTP_PROXY"] = "自己的代理地址"
os.environ["HTTPS_PROXY"] = "自己的代理地址"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()q = "用python实现:提示手动输入3个不同的3位数区间,输入结束后计算这3个区间的交集,并输出结果区间"
rsp = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=[{"role": "system", "content": "一个有10年Python开发经验的资深算法工程师"},{"role": "user", "content": q}]
)

代码解析:

  • get_api_key() 函数是我自己写的一个从文件读取 api keys 的方法,我是存在一个 openai_key 文件里,json 格式,你可以改成你自己的获取方法,甚至可以直接写到代码里(虽然不推荐,但确实最简单)。

  • q 是请求的问题

  • rsp 是发送请求后返回结果

  • openai.ChatCompletion.create 中参数

    • model 是使用的模型名称,是一个字符串,用最新模型直接设置成gpt-3.5-turbo 即可
    • messages 是请求的文本内容,是一个列表,列表里每个元素类型是字典,具体含义如下表: 在这里插入图片描述
  • 程序运行返回内容,从响应回复内容我们可以看到,回复内容是一个 json 字符串, 在这里插入图片描述
    我们可以通过以下方法直接获取相关信息:

在这里插入图片描述

* * 返回消息内容

rsp.get("choices")[0]["message"]["content"]

* * 角色

rsp.get("choices")[0]["message"]["role"]

* * 问题+回答总长度

rsp.get("usage")["total_tokens"]

其他信息也可以通过类似方法获取。

  • 测试 ChatGPT 回答代码运行情况,可以看出代码逻辑和运行都没啥问题,注释也到位。

在这里插入图片描述

实现多轮对话

如何实现多轮对话?

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

  • 效果图 在这里插入图片描述

    • 可以看到,我首先问了“1+1=几”,然后问“为什么是这样”,ChatGPT 会根据前面的提问将新问题识别为“为什么1+1=2”。
    • 后面继续问水仙花数有哪些,再问“如何写个python程序来识别这些数”,ChatGPT 同样会根据前面的提问将新问题识别为“如何写个python程序来识别这些水仙花数”,并给出对应解答。

* 实现代码

import openai
import json
import osos.environ["HTTP_PROXY"] = "http://127.0.0.1:7890"
os.environ["HTTPS_PROXY"] = "http://127.0.0.1:7890"# 获取 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/32874.html

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

相关文章

GPT时代,超强大脑才是你的第一财富。

ChatGPT 爆火后,无数人把这个无所不能的对话机器人当做生活、工作助理,用其代替搜索引擎、生成流畅的翻译、甚至撰写文章、剪辑视频、分析数据,享受着“不劳而获”的便利和高效体验。 自然而然地,一些老生常谈的话题,比…

新书上市 | 从大脑认知开始,全方面提高编程能力,助你摆脱“GPT焦虑症”

目录 一、ChatGPT火爆全网二、《程序员超强大脑》三、本书内容四、本书特色五、作译者简介1、费莉安赫尔曼斯(Felienne Hermans)2、蒋楠 大家好,我是哪吒。 🏆本文收录于,49天精通Java从入门到就业。 全网最细Java零…

别贩卖焦虑了,人工智能永远无法取代你

每一次生产力的变革,在带来技术进步与更高效率的同时,也都无可避免的会带来一波失业浪潮,当下的人工智能浪潮自然也不例外。现在,第一批因为AI失业的人已经出现了…… 因为AI失业的第一批人,已经开始在游戏行业出现了 …

基于线上考研资讯数据抓取的推荐系统的设计与实现(论文+源码)_kaic

摘 要 随着互联网的飞速发展,互联网在各行各业的应用迅速成为众多学校关注的焦点。他们利用互联网提供电子商务服务,然后有了“考研信息平台”,这将使学生考研的信息平台更加方便和简单。 对于考研信息平台的设计,大多采用java技…

【.NET AI Books】问题分类和技能使用大全

第一章 问题分类 我会把问题设定放在首位,也就是我们的第一章。毕竟所有生成式的 AI 都是需要基于问题给出答案。所以我一直不认同人工智能会取代人类,没有人类哪来问题呢? ChatGPT 的神奇之处在于它可以根据你的问题去完成不同的工作&…

周期函数傅里叶级数的各次谐波系数确定

周期函数傅里叶级数的各次谐波系数确定 在不考虑直流分量的情况下对于周期函数的系数进行计算确定。 简单阐述原理过程。 实例场景: 假定被采样信号的模拟信号时一个周期性时间函数,除基波外还含有不衰减的直流分量和各次函数。 基本形式 周期函数的…

奈奎斯特稳定性判据的步骤(含详细推导)

奈奎斯特稳定性判据的步骤: 一、作出半闭合曲线1.作出开环系统的奈奎斯特曲线2.补圆 二、计算R的大小三、判断Z是否为0 提示:本文只含有奈奎斯特判据的步骤,适合期末防挂科的同学,若想要透彻地了解奈奎斯特判据的原理,…

《重学 Java 设计模式》PDF 出炉了 - 小傅哥,肝了50天写出18万字271页的实战编程资料

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 文章目录 一、前言二、简介1. 谁发明了设计模式?2. 我怎么学不会设计模式?3. 适合人群4. 我能学到什么5.…

三角函数到傅立叶级数

我讨厌傅立叶级数的叫法,这老让我感觉到很深奥,但当我用三角级数时,感觉就大不同了!! 下面进入正题 正弦波 信号处理中极为极为极为重要的一个函数,三角函数,之所以叫做三角函数,是因为它的计算方式和直角三角密切相…

三大变换与自控(一)傅里叶级数

这一系列文章记录了我在学习三大变换时的心得。 首先从傅里叶变换开始,这是将一个信号从时域转变成频域的算法,在信号处理方面非常有用。 如果正在阅读这篇文章的读者还对傅立叶分析没有一个比较清楚的感性认识,建议先阅读一下知乎的一篇文…

python实现FFT(快速傅里叶变换)

python实现FFT(快速傅里叶变换) 简单定义一个FFT函数,以后的使用中可以直接幅值粘贴使用。 首先生成了一个频率为1、振幅为1的正弦函数: 然后计算该信号的频率和幅值,得到计算结果如下: 其中计算相位角…

《Mybatis 手撸专栏》第1章:开篇介绍,我要带你撸 Mybatis 啦

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 1. 为甚,撸Mybatis 我就知道,你会忍不住对它下手!🤨 21年带着粉丝伙伴撸了一遍…

傅里叶变换F(f)与F(w)的探究——以余弦函数为例

我们在信号与系统和通信原理中学到的傅里叶变化大多是 F ( ω ) F(\omega) F(ω)这种形式的: 但有时在看资料的时候,发现有人会用 F ( f ) F(f) F(f)这种表达,在画频域图的时候也有 ω \omega ω和 f f f两种横坐标,幅值也会有相应…

傅里叶级数和傅里叶变换

最近在课堂中再次接触了傅里叶级数(FS——Fourier Series)和傅里叶变换(FT——Fourier Transform),这里写一点粗浅的笔记来帮助自己理解。 一、傅里叶级数的意义 首先傅里叶级数是伟大的,它成功的给我们描…

冲激函数的性质

电路对于单位冲激函数的激励的零状态响应称为单位冲激响应。 单位冲激函数也是一种奇异函数,可定义为 单位冲激函数又称为δ函数。它在t≠0处为0,但在t0处为奇异的。 单位冲激函数δ(t)可以看作是单位脉冲函数的极限情况。图1-a为一个单位矩形脉冲函数…

单边指数信号的傅立叶matlab,实验四连续信号的傅立叶变换

subplot(3,1,3);plot(w1,phai) %该三行用来得到相频特性图可得到完整图形。 例2.求2 11)(ω ωj F 的傅里叶逆变换)(t f 。 解:编写如下M 文件, syms t w F1/(1w^2); fifourier(F,w,t) ezplot(f) 运行后,可得如下的文本和如图2所示…

图像傅立叶变换的原理和物理意义

图像傅立叶变换的原理和物理意义 图像的傅立叶变换,原始图像由N行N列构成,N必须是基2的,把这个N*N个包含图像的点称为实部,另外还需要N*N个点称为虚部,因为FFT是基于复数的,如下图所示: &#…

matlab 傅立叶变换去噪

代码 close all data [3132,3133,3125,3128,3121,3123,3121,3125,3116,3120,3115,3121,3121,3129,3134,3150,3164,3186,3197,3221,3238,3265,3281,3306,3319,3336,3339,3351,3352,3357,3349,3350,3339,3346,3340,3342,3328,3324,3308,3300,3284,3275,3259,3254,3241,3237,322…

利用快速傅立叶变换,在频域中实现脉冲压缩的matlab仿真程序

%利用FFT计算WVD分布(非平稳随机信号分析与处理第45页) clc clear all NN100; w10.001; a10.0005; w20.001; a2-0.005; jsqrt(-1); nn-3*NN-1:1:3*NN-1; %构造信号 %nnn-3*NN; xexp(j*(2*pi*(w1*nn1/2*a1*nn.^2))); %s1ss1(nn-3*NN) %ss1cconj(ss1); L64; …