我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python调用OpenAI接口的简单封装

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python调用OpenAI接口的简单封装

1. 注册OpenAI账号,获取OpenAI-API key

网上有很多资料,这里就不再叙述了,科学上网,懂得都懂。

一个小坑,在生成API key之后需立刻复制下来,否则将无法再次打开。当然如果错过复制了,也可以再重新生成一个key。

2. 安装OpenAI库

命令行输入

pip install openai

在安装前,需要确认自己使用的python版本,应选用3.7.1以上版本,下图截选自python openai library的介绍文档。

3. 编写代码

参考OpenAI API官方文档,将其中几个常用方法封装为GptClient类,方便后续调用:

3.1. 导入需要的库

import openaiimport reimport osimport requestsfrom PIL import Image

3.2. 构造方法

当外部函数调用GptClient类时,需传入API-key来构建对象。

def __init__(self, api_key):    pattern = re.compile(r"sk-[a-zA-Z0-9]{48}")  # 对API-key进行格式校验    if re.match(pattern, api_key) is None:        raise Exception("Api_key格式不正确,请确认后重新输入!")    else:        self.api_key = api_key

这里说一下,我参考自己的key做了个格式校验,但事实上该格式并不固定。我也就该问题咨询了ChatGPT本尊,它给出的回答为API的格式应遵循 ”sk-<42 characters><22 characters>“,可见"sk-"后紧跟的字符数并不固定,因此该格式校验也可以删除不要。

以下是和ChatGPT的对话内容:

 

3.3. Completions

def Completion(self, prompt):    openai.api_key = self.api_key    completions = openai.Completion.create(        model="text-davinci-003",        prompt=prompt,        max_tokens=1024,        temperature=0.8,        n=1,        stop=None,    )    return completions.choices[0].text

 简单解释一下该方法可能涉及到的参数:

  • 'model' :决定使用的GPT引擎,不同引擎的计算能力和结果可能会有所不同。
  • 'prompt' :对GPT的提问,字符串类型,可以是一个或多个句子。
  • 'temperature' :用于控制生成文本的随机程度的指数。较高的温度会产生更随机的文本,而较低的温度会更加保守和可预测。值范围为0到2,默认为1。
  • ''max_tokens":要生成的最大标记数。一个标记通常是一个单词或一个标点符号。较高的值会产生更长的文本。为了获得更多的文本信息,这里设置为1024。
  • 'top_p':用于生成文本的概率阈值。较高的值意味着在生成下一个标记时,只考虑具有更高概率的标记。与temperature相反,较高的概率阈值会降低生成文本的随机程度,一般与temperature选择其一进行定义即可。
  • 'n':生成多少个备选的文本结果。
  • 'stop':一个字符串列表,指定生成文本时应该在哪些位置停止。当生成文本中出现了列表中的任何一项,生成过程就会停止。例如,如果将stop设置为["。", "\n"],则生成的文本将在第一个句号或换行符处停止。
  • 'best_of':在多次生成之间进行比较时,应返回多少个结果中的最佳结果。
  • 'stream':指定是否要返回生成文本的流式输出。如果将其设置为True,则会按生成文本的顺序返回多个文本片段。
  • 'logprobs':指定是否要返回每个token的对数概率值(即log probabilities)。如果将其设置为True,则会在响应对象中包含一个logprobs字段,其中包含有关每个token的对数概率值的信息。
  • 'echo':指定是否将prompt包含在生成的文本中。如果将其设置为True,则生成的文本将包括prompt。
  • 'presence_penalty':控制生成文本中与prompt不同的片段出现的概率。值越高,出现这种情况的可能性就越小。
  • 'frequency_penalty':与presence_penalty作用相反,控制生成文本中与prompt不同的片段出现的概率。值越高,出现这种情况的可能性就越小。
  • 'n_greedy':指定是否要使用贪心搜索来生成文本,而不是使用基于概率的采样搜索。如果设置为True,则使用贪心搜索,否则使用基于概率的采样搜索。
  • 'logprobs':指定是否要返回每个token的对数概率值(即log probabilities)。如果将其设置为True,则会在响应对象中包含一个logprobs字段,其中包含有关每个token的对数概率值的信息。
  • 'logit_bias':指定用于调整生成文本中不同单词出现概率的偏差值。这可以用于改变生成文本的风格或语气。偏差值越高,出现相应单词的可能性就越大,反之亦然。

需要注意的是,这里许多参数都是可选参数,应根据自身需求选择是否需要使用。

3.2 ChatCompletions

def ChatCompletion(self, messages):    if type(messages) != list:  # 对输入messages的格式进行校验        raise Exception("输入内容有误,请确保输入内容为指定role与content的字典列表,如下所示:\neg:[{\"role\": \"system\", \"content\": ""\"你是一个翻译家\"},\n{\"role\": \"user\", \"content\": \"将我发你的英文句子翻译成中文,你不需要理解内容的含义作出回答。\"},\n""{\"role\": \"user\", \"content\": \"Draft an email or other piece of writing.\"}]")    for i in messages:        if i['role'] not in {"system", "user", "assistant"}:            raise Exception("输入角色有误,仅支持system, user, assistant三种角色,请重新输入!")    openai.api_key = self.api_key    chat = openai.ChatCompletion.create(        model="gpt-3.5-turbo",        messages=messages,        temperature=0.8,        n=1,        stop=None,    )    return chat.choices[0].message.content

Completions方法不同的是,ChatCompletions方法更适合用于生成对话文本,它可以自动将上下文信息(即对话历史)考虑在内,以生成更加连贯和合理的对话回复。原因在于使用者可以通过传入messages来指定对话参与者的角色和属性,以进一步影响生成文本的风格和内容。

参数部分,这里建议使用使用gpt-3.5-trubo引擎来生成对话文本,这是因为gpt-3.5-trubo是针对对话场景进行了优化的,相比其他语言模型,它具有更好的生成质量和更高的生成速度。其他参数作用可参照Completions方法。

代码部分对输入参数messages的内容加入了校验。

3.3 Images

3.3.1 Create image

def CreateImage(self, description, size, path, name="001"):    if size not in ["256x256", "512x512", "1024x1024"]: # 校验生成图片尺寸        raise Exception("图片尺寸不符,仅支持 256x256, 512x512, 1024x1024三种大小")    openai.api_key = self.api_key    image = openai.Image.create(        prompt=description,        n=1,        size=size,        response_format="url",    )    img_path = path + "\\" + name + ".png"    self.__SaveImgFromUrl(image.data, img_path)    return "图片已全部生成"

该方法仅支持输出 256x256, 512x512, 1024x1024 三种尺寸大小的图片,因此在调用方法前,需对输出尺寸进行校验。

该方法中response_format参数决定API 返回的图像格式。默认为 url,表示返回图像的 URL 地址。还可以选择 b64_json,表示返回图像的Base64 编码的 JSON 字符串。

在这里可以选择返回图像的 URL 地址,并通过自定的SaveImgFromUrl方法,将图片下载至本地指定的路径下。SaveImgFromUrl方法如下:

def __SaveImgFromUrl(self, response, save_path):    numOfOutput = len(response)    org_path = save_path    for i in range(numOfOutput):        save_path = org_path        img_content = requests.get(response[i]["url"]).content        if i >= 1:            save_path = save_path.split(".")[0] + "_" + str(i + 1) + "." + save_path.split(".")[1]        with open(save_path, "wb") as f:            f.write(img_content)        print(f"图片保存成功,保存至{save_path}-------{i + 1}/{numOfOutput}")

3.3.2 Create image edit

该方法可以理解为对生成的图片做进一步修改,代码如下:

def ImageEdit(self, image_path, description, mask_path=None):    self.__ImageModeCheck(image_path, mask_path)    if self.__getFileSize_MB(image_path) > 4:        raise Exception("上传图片太大,请确保图片小于4MB")    image = open(image_path, "rb")    if mask_path is not None:        if self.__getFileSize_MB(mask_path) > 4:            raise Exception("上传图片太大,请确保参照图片小于4MB")        else:            mask = open(mask_path, "rb")            if Image.open(image_path).size != Image.open(mask_path).size:                raise Exception("待修改图片与参照图片尺寸大小应保持一致")    else:        mask = None        openai.api_key = self.api_key        editImage = openai.Image.create_edit(            image=image,            mask=mask,            prompt=description,            n=1,            size=f"{Image.open(image_path).width}x{Image.open(image_path).height}"        )    imageNameAndSuffix = image_path.split(".")    editImage_path = imageNameAndSuffix[0] + "_edited." + imageNameAndSuffix[1]    self.__SaveImgFromUrl(editImage.data, editImage_path)    return "修改图片已全部生成"

在上传原始图像image的基础上,该方法支持使用者通过参数mask上传掩膜图像。它是一张黑白图像,可以用来定义需要编辑的区域,其中白色区域表示需要编辑的区域,黑色区域则表示不需要编辑的区域。OpenAI API 将会仅对白色区域中的像素进行编辑,而忽略黑色区域中的像素。

在调用该方法时,imagemask有着一系列大小、尺寸的要求,因此同样需要对这些信息进行校验。

注意:在这里有一个坑,传入的图片对色彩模型有一定的要求,只允许RGBA、LA、L三种模式,而如果传入的图片是RGB格式,则会报如下错误:

openai.error.InvalidRequestError: Invalid input image - format must be in ['RGBA', 'LA', 'L'], got RGB.

为避免该错误,在调用方法前,我自定义ImageModeCheck方法对色彩模型不符合要求的图片提前进行了转换。ImageModeCheck方法如下

def __ImageModeCheck(self, *args):    for i in args:        if i is not None:            image = Image.open(i)            if image.mode not in ["RGBA", "L", "LA"]:                rgba_image = image.convert("RGBA")                rgba_image.save(i, "png")

另附上判断图片大小(单位:MB)的自定义方法getFileSize

def __getFileSize_MB(self, filePath):    return os.path.getsize(filePath) / float(1024 * 1024)

3.3.3 Create image variation

该方法旨在根据输入的图像数据来创建图像变体,可以用来扩充图像数据集,代码如下:

def ImageVariation(self, image_path, numOfImg, size):    if image_path is None:       raise Exception("未找到图片路径")    self.__ImageModeCheck(image_path)    width, height = size.split("x")[0], size.split("x")[1]    if width != height:        raise Exception("上传图片长宽需保持一致")    if numOfImg > 10:        raise Exception("生成图片个数不得大于10")    if self.__getFileSize_MB(image_path) > 4:        raise Exception("上传图片太大,请确保图片小于4MB")    image = open(image_path, "rb")    openai.api_key = self.api_key    image_Variation = openai.Image.create_variation(        image=image,        n=numOfImg,        size=size    )    imageNameAndSuffix = image_path.split(".")    varImage_path = imageNameAndSuffix[0] + "_var." + imageNameAndSuffix[1]    self.__SaveImgFromUrl(image_Variation.data, varImage_path)    return "图片已全部生成"

4.调用GptClient类:

4.1 创建类对象(传入API key)

import ChatGPTClient as gptnewClient = gpt.GptClient("sk-------------你的API key----------------")

4.2 Completions:

text = "以自己生病为由,向自己的老师写一封延迟提交作业的邮件,内容在300字左右"print(newClient.Completion(text))

生成的文本

尊敬的xxx老师:

您好!

我是你的学生xxx,很高兴能有机会向您问安。

上周我不幸生病,结果让我无法及时完成作业。因此,请您帮忙给我一些时间,让我可以延迟提交作业。我会尽快完成作业,并确保质量不会受到任何影响。我会在本周内提交完成的作业,并配合您的安排,适时完成作业。

最后,我想再次感谢您的耐心和支持。如果您有任何问题,请随时联系我。

此致

敬礼

xxx

4.3 Chat Completion:

chatList = [    {"role": "system", "content": "你是一个翻译家"},    {"role": "user", "content": "将我发你的中文句子翻译成英文,你不需要理解内容的含义作出回答。"},    {"role": "user", "content": "两个黄鹂鸣翠柳,一行白鹭上青天"}]print(newClient.ChatCompletion(chatList))

生成的文本:

Two orioles sing in the green willows, a line of white egrets soar into the blue sky.

4.4 Create Image

newClient.CreateImage("落霞与孤鹜齐飞,秋水共长天一色", "1024x1024", "G:\\tmp", "诗词图")

生成的图像:

尾叙:本人python小白,不喜勿喷。因需要调用openai库,临时学了些python,只是想分享下使用的经历,帮助到有需要的人。

最后,分享两个链接,以便大家查阅更多的API使用细则以及参数信息。

 OpenAI官网API文档 

OpenAI Python Library

来源地址:https://blog.csdn.net/weixin_47321965/article/details/130407946

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python调用OpenAI接口的简单封装

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Spring Boot调用Http接口的简单方法

在这里推荐一个适用于Spring Boot项目的轻量级HTTP客户端框架Retrofit,使用非常简单方便。Retrofit是一款类型安全的HTTP客户端,其最大的特性的是支持通过接口的方式发起HTTP请求 。

Java调用第三方接口封装实现

本文主要介绍了Java调用第三方接口封装实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-16

Python实现简单的API接口

代码实现# coding:utf-8import jsonfrom urlparse import parse_qsfrom wsgiref.simple_server import make_server# 定义函数,参数是函数的两个参数
2023-01-31

python接口常用封装函数有哪些

本篇内容主要讲解“python接口常用封装函数有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python接口常用封装函数有哪些”吧!1.封装上传图片的函数.def upload_image
2023-06-30

python---简单的接口测试实例

我们可以用Jmeter做接口测试,但是呢个人觉得那个有点局限性,用python就灵活很多, 可以按自己的思路来构建比较灵活,下面给大家介绍一个简单的接口测试实例。 一、我们的思路如下: 首先我们要弄清楚我们的整个思路:1.先把我们的测试数据
2023-01-31

springboot如何单独使用feign简化接口调用

这篇文章主要介绍了springboot如何单独使用feign简化接口调用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。单独使用feign简化接口调用与HttpClient和R
2023-06-29

Android OkHttp的简单使用和封装详解

Android OkHttp的简单使用和封装详解 1,昨天把okHttp仔细的看了一下,以前都是调用同事封装好了的网络框架,直接使用很容易,但自己封装却不是那么简单,还好,今天就来自我救赎一把,就和大家写写从最基础的OKHttp的简单get
2022-06-06

将获取的指标封装成接口提供API请求调用

1.将阿里云的监控指标推送到企业微信(1)首先需要在项目的根路径下,创建utils包,用于存放项目的其他数据接口;(2)然后在utils包下,创建一个wechat_send.py模块, 用于给用户封装企业微信的接口,提供给外界调用;impo
2023-06-02

使用Python实现一个简单的接口服务

使用Python实现一个简单的接口服务,可以通过get、post方法请求该接口,拿到响应数据。创建一个api_server.py文件,添加代码如下:import flask, jsonfrom flask import request'''
2023-01-31

揭秘Golang中的Facade模式:封装接口调用的高级技术

Golang是一种强大而灵活的编程语言,它提供了许多设计模式和技巧,以帮助开发人员更好地组织和管理代码。在本文中,我将重点介绍Facade设计模式在Golang中的应用和解密。Facade设计模式是一种结构性设计模式,它允许我们将一组复杂的
揭秘Golang中的Facade模式:封装接口调用的高级技术
2023-12-20

Python 之requests封装通用http协议接口请求

  思想这东西任何时候也不会是固定的,纵使框架大致一样,也不尽相同。关键还得是看业务和具体需求。python接口自动化测试框架,软件:IDE开发工具必选+工具类如下:  1、主要框架有:requests库、unittest单元测试框架、HT
2023-06-02

python 调用HBase的简单实例

新来的一个工程师不懂HBase,java不熟,python还行,我建议他那可以考虑用HBase的thrift调用,完成目前的工作。 首先,安装thrift 下载thrift,这里,我用的是thrift-0.7.0-dev.tar.gz 这个
2022-06-04

python自己封装的类如何调用

要调用自己封装的类,需要按照以下步骤进行操作:1. 在代码中导入自己封装的类。例如,如果你的类定义在一个名为`myclass.py`的文件中,可以使用以下语句导入该类:```pythonfrom myclass import MyClass
2023-08-24

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录