一文告诉你如何用 Python 操作 ChatGPT

ChatGPT 相信大家都用过,你觉得它给你的工作带来了多少帮助呢?

对这块感兴趣的,可以群里聊聊

目前我们使用 ChatGPT 的方式是通过浏览器访问 chat.openai.com,然后输入问题,就像下面这样。
图片

除了网页之外,ChatGPT 还提供了 API 接口,让我们可以在程序中访问 GPT 模型。需要注意的是,如果使用网页,那么 GPT 3.5 是免费的,GPT 4 则是一个月收费 20 美元。

但如果要通过 API 来访问 GPT 模型,那么不管什么版本都是收费的,至于费用多少则取决于 token 的数量。GPT 会对文本进行分词,切分后的结果就是一个个的 token,而 token 的数量决定了费用。

那么 Python 如何访问 GPT 模型呢?首先需要安装一个包,直接 pip install openai 即可。

然后登录 platform.openai.com/api-keys,创建一个 API-KEY,如果要通过接口访问,它是不可或缺的。

下面就可以通过 Python 来访问了,我们举例说明。

生成文本

我们可以给 GPT 一段话,让它以文本的形式生成回复内容。

from openai import OpenAI
import httpx
# 我的 API_KEY,以及代理
from config import API_KEY, PROXIES

# openai 底层是通过 httpx 发送请求
# 但因为众所周知的原因,我们不能直接访问,需要设置代理
httpx_client = httpx.Client(proxies=PROXIES)
# 然后指定 api_key 参数和 httpx_client 参数
# 如果你不指定 httpx_client,那么内部会自动创建,但此时就无法设置代理了
# 当然要是你当前机器的网络能直接访问,也可以不用指定 http_client 参数
client = OpenAI(
    api_key=API_KEY,
    http_client=httpx_client
)

chat = client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": "1 + 1 等于几",
        },
    ],
    model="gpt-3.5-turbo",
)
# chat.choices[0] 返回的是 pydantic 里面的 BaseModel
# 我们可以调用 dict 方法转成字典
print(chat.choices[0].dict())
"""
{
    'finish_reason': 'stop', 
    'index': 0, 
    'logprobs': None, 
    'message': {'content': '1 + 1 等于2。',
                'role': 'assistant', 
                'function_call': None, 
                'tool_calls': None}
}
"""

然后解释一下 client.chat.completions.create 里面的参数。

messages

ChatGPT 是有记忆功能的,它在回答的时候会结合上下文。那么问题来了,如果是通过接口的话,怎么把这个上下文传递过去呢?

# 注意 messages 里面的字典的 "role" 这个 key
# 如果 "role" 为 "user",那么 "content" 表示用户问的问题
# 如果 "role" 为 "assistant",那么 "content" 表示 GPT 的回答
chat = client.chat.completions.create(
    messages=[
        {
            "role": "user",  # 开发者输入内容
            "content": "记住:高老师总能分享出好东西",
        },
        {
            "role": "assistant",  # GPT 回答
            "content": "好的,我知道了",
        },
        {
            "role": "user",  # 开发者输入内容
            "content": "请问谁总能分享出好东西,告诉我那个人的名字",
        },
    ],
    model="gpt-3.5-turbo",
)
print(chat.choices[0].dict())
"""
{
    'finish_reason': 'stop', 
    'index': 0, 
    'logprobs': None, 
    'message': {'content': '高老师',
                'role': 'assistant', 
                'function_call': None, 
                'tool_calls': None}
}
"""

所以 messages 是一个列表,它里面可以接收多个消息,如果希望 GPT 拥有记忆功能,那么每一次都要将完整的对话传递过去,显然这会比较耗费 token。

举个例子,我们通过接口来模拟网页版 GPT。

messages = []  # 负责保存消息
while True:
    content = input("请输入内容:")
    messages.append({"role": "user", "content": content})
    # 发送请求
    chat = client.chat.completions.create(
        messages=messages, model="gpt-3.5-turbo"
    )
    # 除了通过 chat.choices[0].dict() 转成字典之外
    # 也可以直接通过 chat.choices[0].message.content 获取回复内容
    gpt_reply = chat.choices[0].message.content
    print(f"GPT 回答如下:{gpt_reply}")
    # 将 GPT 的回复添加进去,开启下一轮对话
    messages.append({"role": "assistant", "content": gpt_reply})

执行程序,效果如下:

图片

由于每次都要将历史对话一起带过去,所以这个过程比较耗费 token。

model

然后是 model 参数,它表示 GPT 所使用的模型,支持如下种类。

"gpt-4-0125-preview",
"gpt-4-turbo-preview",
"gpt-4-1106-preview",
"gpt-4-vision-preview",
"gpt-4",
"gpt-4-0314",
"gpt-4-0613",
"gpt-4-32k",
"gpt-4-32k-0314",
"gpt-4-32k-0613",
"gpt-3.5-turbo",
"gpt-3.5-turbo-16k",
"gpt-3.5-turbo-0301",
"gpt-3.5-turbo-0613",
"gpt-3.5-turbo-1106",
"gpt-3.5-turbo-0125",
"gpt-3.5-turbo-16k-0613",

一般选择 gpt-3.5-turbo 或 gpt-4-turbo-preview 即可。

stream

默认情况下,GPT 会将内容全部生成完毕,然后一次性返回。显然这在耗时比较长的时候,对用户不是很友好。如果希望像网页那样,能够将内容以流的形式返回,那么可以将该参数设置为 True。

chat = client.chat.completions.create(
    messages=[
        {"role": "user",
         "content": "请重复一句话:高老师总能分享出好东西"}
    ],
    model="gpt-3.5-turbo",
    stream=True  # 流式返回
)
for chunk in chat:
    print(chunk.choices[0].delta.dict())
"""
{'content': '', 'function_call': None, 'role': 'assistant', 'tool_calls': None}
{'content': '高', 'function_call': None, 'role': None, 'tool_calls': None}
{'content': '老', 'function_call': None, 'role': None, 'tool_calls': None}
{'content': '师', 'function_call': None, 'role': None, 'tool_calls': None}
{'content': '总', 'function_call': None, 'role': None, 'tool_calls': None}
{'content': '能', 'function_call': None, 'role': None, 'tool_calls': None}
{'content': '分享', 'function_call': None, 'role': None, 'tool_calls': None}
{'content': '出', 'function_call': None, 'role': None, 'tool_calls': None}
{'content': '好', 'function_call': None, 'role': None, 'tool_calls': None}
{'content': '东', 'function_call': None, 'role': None, 'tool_calls': None}
{'content': '西', 'function_call': None, 'role': None, 'tool_calls': None}
{'content': None, 'function_call': None, 'role': None, 'tool_calls': None}
"""

如果 GPT 生成内容时耗时比较长,那么这种实时响应的方式会更友好。

n

GPT 回复内容的时候,可以让它同一时刻回复多个版本,然后我们选择一个满意的。具体返回多少个,取决于 n 的大小,默认为 1。

chat = client.chat.completions.create(
    messages=[
        {"role": "user",
         "content": "世界上最高的雪山叫什么"}
    ],
    model="gpt-3.5-turbo",
    n=3,  # 同时生成三个回复
)
print(chat.choices[0].message.content)
"""
珠穆朗玛峰(Mount Everest)
"""
print(chat.choices[1].message.content)
"""
世界上最高的雪山是珠穆朗玛峰。珠穆朗玛峰是位于喜马拉雅山脉的一座高峰,
也是世界上海拔最高的山峰,海拔达到了8848米。
由于其极高的海拔和陡峭的山脊,珠穆朗玛峰成为许多登山者梦寐以求的挑战之一。
每年都有数百名登山者前往珠穆朗玛峰尝试攀登,但由于极端的气候和高海拔带来的极大危险,
很多人最终未能成功登顶。
"""
print(chat.choices[2].message.content)
"""
世界上最高的雪山是被称为珠穆朗玛峰,位于喜马拉雅山脉,
是地球上海拔最高的山峰,也是登山爱好者们梦寐以求征服的目标。
"""

这里为了阅读方便,我手动对回复的内容进行了换行。以上就是参数 n 的作用,不过说实话,为了不浪费 token,我们一般都会使用默认值 1。

生成图像

再来看看如何生成图像。

images = client.images.generate(
    # 提示词
    prompt="帮我生成一张蕾姆的照片,她穿着婚纱站在教堂里",
    # 模型,可选 "dall-e-2" 或 "dall-e-3"
    model="dall-e-3",
    # 同时生成多少张照片,默认为 1
    n=1,
    # 图像质量,可选 "standard" 或 "hd"
    # "hd" 更精细,但只支持 dall-e-3
    quality="standard",
    # 图片的响应格式,可选 "url" 或 "b64_json"
    response_format="url",
    # 图像大小,如果模型是 dall-e-2,可选 "256x256", "512x512", "1024x1024"
    # 如果模型是 dall-e-3,可选 "1024x1024", "1792x1024", "1024x1792"
    size="1024x1024",
    # 图像风格,可选 "vivid" 或 "natural","vivid" 更加超现实
    style="vivid",
)

print(images.data[0].url)
"""
返回的图片链接
"""
print(images.data[0].b64_json)
"""
因为 response_format 是 url,所以 b64_json 为空
"""
print(images.data[0].dict())
"""
{
    "b64_json": None,
    "revised_prompt": "修正之后的提示词",
    "url": "https://...."
}
"""

效果如下:

图片
感觉不太像啊,头发不应该是蓝色的吗?

小结

以上就是 Python 调用 ChatGPT 的相关内容,当然还有很多其它功能,比如生成图像之后,如果觉得不满意,可以在原有图像的基础上继续编辑。有兴趣可以自己了解一下。

技术交流

独学而无优则孤陋而寡闻,技术要学会交流、分享,不建议闭门造车。

技术交流与答疑、源码获取,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、微信搜索公众号:Python学习与数据挖掘,后台回复:交流
方式②、添加微信号:dkl88194,备注:交流

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt打开已有工程方法

在Qt中,对于一个已有工程如何进行打开? 1、首先打开Qt Creator 2、点击文件->打开文件或项目,找到对应文件夹下的.pro文件并打开 3、点击配置工程 这样就打开对应的Qt项目了,点击运行即可看到对应的效果 Qt开发涉及界面修饰…

2024-03-22 问AI: 介绍一下深度学习中的 sigmoid函数

文心一言 Sigmoid函数是深度学习中常用的一种激活函数,主要用于将神经元的输出值压缩到0和1之间。这种特性使得sigmoid函数在二分类问题中特别有用,因为输出值可以被解释为属于某个类别的概率。 sigmoid函数的数学表达式为: σ(x) 1 / (1…

CMake笔记之将任意官方库作为third_party完整地包含在工程项目中使用的通用模板

CMake笔记之将任意官方库作为third_party完整地包含在工程项目中使用的通用模板 —— 杭州 2024-03-20 凌晨1:06 code review! 文章目录 CMake笔记之将任意官方库作为third_party完整地包含在工程项目中使用的通用模板1.通用CMakeLists.txt模板2.GPT4给出的改进建议3.git clon…

kubernetes负载均衡-service

一、service的概念 1、什么是service 在Kubernetes中,pod是应用程序的载体,当我们需要访问这个应用时,可以通过Pod的IP进行访问,但是这里有两个问题:1、Pod的IP地址不固定,一旦Pod异常退出、节点故障,则会…

Windows11 安装confluence 7.4.0

Windows11安装confluence:7.4.0 1.打开终端管理员(管理员权限的PowerShell)2.按顺序执行以下命令,安装confluence服务3.浏览器(如Microsoft Edge) 打开 http://127.0.0.1:8100/ 配置confluence4.图示 本文是Windows11 安装confluence 7.4.0的步骤 本文参考 1.打开终端管理员(管…

使用React搭建single-spa

自己搭建的Demo GitHub - ftao123/single-spa-react-demo: single-spa-react-demo 修改子应用的webpack配置 library: "app2"和libraryTarget: "umd"配置必须添加。 可以看到filename在开发环境下的地址是static/js/bundle.js,所以我们主应用…

PySide6-YOLO8目标检测、追踪可视化界面

目录 项目地址实现效果DetectTrack 项目地址 https://github.com/zhengjie9510/pyside-yolo 实现效果 Detect Track

MySQL 查询性能优化

优质博文:IT-BLOG-CN​ 如果把查询看作是一个任务,那么它由一些列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数。通常…

matlab批量读取目录下的文件的方法

批量处理可以提高效率,这里提供一个可以批量读取nc文件的代码: address C:\Users\Hello World!!\DESKTOP\TerraClimate_ppt\; % Get the list of files udir address; form *.nc; % Get the list of station names files GetFiles(udir,form); [n,p…

Linux 进程通信:命名管道、共享内存

目录 一、命名管道 1、概念 2、特点 3、原理 4、创建 5、匿名管道与命名管道的区别 6、命名管道的打开规则 二、命名管道—实现客户端和服务器之间的通信 1、Makefile 2、comm.hpp 3、Log.hpp 4、server.cxx 5、client.cxx 运行测试: 三、system V…

模拟实现 atoi 函数

一、函数介绍 原型 int atoi(const char *nptr); 二、使用atoi 三、使用发现 可以发现:会先过滤掉空格,还能识别正负号,当第一次遇到正负号了,后面没接着是数字就返回0, 如果45 5aa 结果是45,说明前面识…

JavaScript代码执行原理

JavaScript代码是如何被机器理解并执行的呢? 作为 JavaScript 开发者,通常我们不需要关心JavaScript引擎是如何执行代码的。但是,了解 JavaScript 引擎的工作原理,知晓它如何处理我们编写的 JS 代码、肯定是有益的。 注意&#…

面试算法-94-将有序数组转换为二叉搜索树

题目 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视…

微服务之Nacos配置管理

文章目录 前言一、统一配置管理Nacos操作二、统一配置管理java操作1.引入依赖2.创建配置文件3.测试4.总结 三、Nacos配置自动更新1.添加注解RefreshScope2.使用ConfigurationProperties注解3.总结 四、Nacos多环境配置共享1.配置文件2.多种配置的优先级3.总结 总结 前言 一、统…

飞鸟写作能用吗 #笔记#笔记

飞鸟写作是一个强大的论文写作工具,不仅可以帮助用户高效、准确地完成论文写作,还能帮助用户对论文进行查重和降重。那么,飞鸟写作能用吗?答案是肯定的,飞鸟写作非常好用! 首先,飞鸟写作拥有强大…

2024智能EDM邮件营销系统使用攻略

在数字化营销领域,智能EDM(Electronic Direct Mail)邮件营销作为一种高效、精准的推广方式,正日益受到企业的高度重视。而要实现这一策略的成功落地,一个高可靠性和高稳定性的专业邮件发送平台则是不可或缺的关键环节。…

Nginx 故障排查之斜杠(/) --(附 Nginx 常用命令)

问题场景: 项目中用到了多个子域名,测试环境通过子域名进行接口访问的时候返回 404 NOT_FOUND,经过排查测试后确定是 Nginx 配置问题,而导致事故的根本原因是运维在Nginx配置的时候少配置了一个斜杠(/)&am…

Qt播放音乐代码示例

主界面 点击play按钮播放或暂停音乐,拖动进度条,音乐对应播放。 QWidget window;QPushButton* playButton new QPushButton("Play");// Qt 播放音乐// 创建 QMediaPlayer 对象QMediaPlayer* player new QMediaPlayer;// 指定音频文件的路径…

【IIS】应用程序池“xxxx”将被自动禁用,原因是为此应用程序池提供服务的进程中出现一系列错误。

应用程序池“xxxx”将被自动禁用,原因是为此应用程序池提供服务的进程中出现一系列错误。 发现其他网站是正常访问,对比发现路径凭据身份差异,这个网站指定用户访问,因为是物理机P2V到虚拟机上的。调整为应用程序用户,…

双系统安装04--在已有统信UOS基础上安装Windows10

原文链接:双系统安装04–在已有统信UOS基础上安装Windows10 Hello,大家好啊!继我们之前的双系统安装系列文章之后,今天我非常高兴地为大家介绍双系统安装的第四篇——在已有的统信桌面操作系统上安装Windows 10。这对于那些希望在…