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 openai
import re
import os
import requests
from 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_keycompletions = 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_keychat = 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_keyimage = 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_pathfor i in range(numOfOutput):save_path = org_pathimg_content = requests.get(response[i]["url"]).contentif 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 = Noneopenai.api_key = self.api_keyeditImage = 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_keyimage_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 gpt
newClient = 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使用细则以及参数信息。

1. OpenAI官网API文档 

2. OpenAI Python Library

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

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

相关文章

使用youtube语音识别功能给视频加自动字幕

起因 自己英文比较差&#xff0c;国外大佬的演进听不清楚&#xff0c;也没有字幕&#xff0c;虽然有PPT&#xff0c;但还是想完整的了解下。 于是在想自己能用哪种语音识别的工具把英文字幕加上。最近一直在youtube上看视频&#xff0c;发现youtube可以把字幕转换成各国语言的…

5分钟教会你英语视频如何制作中英字幕

2.识别引擎改为【专业级识别引擎】识别语言改为英语 最近很多自媒体&#xff0c;都是通过国外的网站&#xff0c; 搬运到抖音等视频媒体平台&#xff0c;那么&#xff0c;他们是如何为视频增加字幕的呢&#xff1f;接下来&#xff0c;我给大家进行一下简单教学&#xff01;~ 英…

视频自动生成字幕(免费版)

众所周知视频生成字幕是个麻烦事&#xff0c;现如今市面上大多数的视频软件生成字幕不是效果不佳就是需要花钱&#xff0c;不过有这样一种方法是可以免费生成字幕的。 所需工具&#xff1a; 网易见外工作台Pr软件 1.注册网易见外工作台账号 拿个邮箱注册一下就行&#xff0c…

英文视频字幕自动生成

笔者正在制作少儿编程教育系列视频&#xff0c;发现有大量的英文视频资料值得学习&#xff0c;但是视频中缺少字幕&#xff0c;可能会对学生的学习过程带来困扰。如果能够得到英文字幕&#xff0c;再通过谷歌翻译等工具的使用&#xff0c;就可以进一步生成中文字幕。因此&#…

英文视频如何翻译成中文视频简单工具推荐

英文视频如何快速变成中文视频&#xff0c;自动生成文案&#xff0c;自动匹配画面&#xff0c;同时还有中文的配音&#xff0c;看过来&#xff0c;在测试了十几款软件之后&#xff0c;终于找到我心目中最好用的那一款了&#xff0c; 不服来辩。 相信很多小伙伴在日常浏览海外的…

[tool] AI视频翻译 解决英文视频字幕问题(类似youtube自动生成字幕)

1.网易见外是网易人工智能事业部旗下的AI视频翻译产品. 字幕支持手工编辑和下载 不过网易见外 只支持WEB在线操作 并且只支持单个上传操作 目前没有客户端 2.人人译视界 (IOS 安卓 PC客户端都有) 3 微软最新免费试用的AI字幕翻译 超级好用 建议使用这个来采集英文字幕 超级准 …

如何把视频文件添加中英文对照字幕

如何把视频文件添加中英文对照字幕 在这里用到了subtitle edit的软件&#xff0c;首先我们先安装好subtitle和vlc软件&#xff0c;见上一篇文章下载Subtitle edit和vlc 1&#xff0c;点击视频&#xff0c;打开视频文件 选择视频文件 2&#xff0c; 点击视频转文本 会要求安…

剪映怎么把英文字幕翻译成中文?(附视频教程+字幕翻译工具)

点击上方"优派编程"选择“加入星标”&#xff0c;第一时间关注原创干货 原文地址 https://www.fang1688.cn/ziyuan/2886.html 今天介绍的这款英文字幕翻译成中文软件&#xff1a;剪映字幕翻译通用版3.6.1.exe 使用方法 关于账号登录直接登录b站账号即可。 软件可能会…

【开源工具】使用Whisper提取视频、语音的字幕

这里写目录标题 一、语音转字幕操作步骤1、下载安装包Assets\WhisperDesktop.zip[^2]2、加载模型2.1 下载模型2.1.1 进入Hugging Face[^3]的仓库2.1.2 选择需要下载的模型2.1.3 配置模型路径 3、语音转字幕4、实时语言转录功能 二、相关简介[^1]特点开发人员指南构建说明其他注…

用剪映将无字幕的英文视频翻译成中文字幕(附教程+软件)

点击上方蓝字"优派编程"选择“加为星标”&#xff0c;第一时间关注原创干货 原文地址 https://www.fang1688.cn/ziyuan/2886.html 简介&#xff1a; 剪映字幕翻译及SRT字幕导出功能&#xff1a;剪映字幕翻译及SRT字幕导出功能&#xff0c;更加方便的制作视频&#xf…

语音视频自动生成字幕功能介绍

语音视频自动生成字幕功能介绍 中国站点 https://aismartvip.com 香港站点 https://hk.aismartvip.com 语音视频识别,自动生成字幕&#xff0c;支持全球120种语音/视频识别: 中文、普通话&#xff08;中国简体&#xff09;、中文、普通话&#xff08;台湾繁体&#xff09;、中…

【解决方案】如何把视频内的声音和文字翻译成新的字幕或者配音

一、视频翻译的几种情况 根据视频的声音进行翻译并生成字幕 一般来说&#xff0c;我们使用自动语音识别&#xff08;ASR&#xff09;技术对视频的声音进行翻译并生成字幕的步骤如下&#xff1a; 选择翻译软件&#xff1a;首先&#xff0c;选择一个支持ASR技术的翻译软件。 上…

视频翻译字幕的软件哪个好?看完你就知道了

以前给自己的视频翻译字幕&#xff0c;是一项难度非常高的工作&#xff0c;但如今不一样了&#xff0c;随着科技地不断发展&#xff0c;现在出现了很多软件能够帮助我们轻松去实现视频字幕的提取与翻译&#xff0c;而且操作难度也不会太难&#xff0c;翻译效率也能得到保障&…

视频翻译成中文工具哪个好?3招教你视频翻译字幕

最近&#xff0c;上大学的表妹向我求助&#xff0c;大概内容就是&#xff1a;她是学生会记者团的小记者&#xff0c;某天她接到任务&#xff0c;要写一篇关于科学讲座的报道&#xff0c;结果部长给的材料是无字幕的全英讲座视频&#xff0c;表妹听了一天都翻译不出来。其实不用…

免费将中文视频转换为英文视频并添加中英双语字幕

免费将中文视频转换为英文视频并添加中英双语字幕 背景 女朋友需要找关于《不要随意喂养动物园的动物》的英语视频&#xff0c;因为限定是英语类的视频&#xff0c;所以在国内的视频平台基本无法找到。虽然我是个程序员&#xff0c;但在女友的眼里&#xff0c;只要关于电脑的…

Youtube——如何将视频中的英文字幕转换成中文字幕

Youtube——如何将视频中的英文字幕转换成中文字幕 1、正常的英文字幕2、点击右下角的设置-Subtitles/CC(2)3、点击Auto-translate4、选择Chinese(Simplified)&#xff0c;此时可以看到已经翻译成中文了 1、正常的英文字幕 2、点击右下角的设置-Subtitles/CC(2) 3、点击Auto-tr…

20230720今天youtube上的中文字幕自动翻译成为英文的功能失效!

20230720今天youtube上的中文字幕自动翻译成为英文的功能失效&#xff01; 2023/7/20 12:42 &#xff1f;做YouTube挣钱吗&#xff1f; 115网盘 满了。最新 张家界 旅游的视频 放到 youtube就是 60岁/老了的时候的回忆&#xff01; 放到 大陆不保险&#xff01; 如需使用自动翻…

数据分析可视化常用图介绍以及相关代码实现(箱型图、Q-Q图、Kde图、线性回归图、热力图)

文章目录 前言一、箱型图是什么&#xff1f;1-1、箱型图介绍1-2、箱型图的作用1-3、实战 二、Q-Q图是什么&#xff1f;2-1、Q-Q图&#xff08;分位数-分位数图&#xff1a;quantile-quantile plot&#xff09;介绍2-2、实战2-3、为什么要使数据呈现正态分布以及出现了正态分布&…

教你体验目前最火AI - 在craft AI assistant使用AI助手

chatGPT大火之后&#xff0c;很多人都想体验一把&#xff0c;今天为大家推荐一种免费方式&#xff0c;体验一下chatGPT同款内核的AI助手。 craft AI assistant Craft 推出的 AI 助手产品 Craft AI Assistant&#xff0c;并且现在就可以使用。根据 Craft 官方介绍&#xff0c;…

Express实战个人订阅号实现网站登录

今天我们来实现一个使用个人订阅号实现网站的功能&#xff0c;后端使用的是 express 。其它框架原理基本一致&#xff0c;只是定义路由或返回响应数据部分代码跟 express 有所出入。先来一波效果图&#xff1a; 1. 前言 20 年 3 月在掘金写过一篇文章&#xff0c;介绍了使用 e…