Python 官方文档:入门教程 => 点击学习
1. 注册Openai账号,获取OpenAI-api key 网上有很多资料,这里就不再叙述了,科学上网,懂得都懂。 一个小坑,在生成API key之后需立刻复制下来,否则将无法再次打开。当然如果错过复制了,也可以再重新生成一个key。 2
网上有很多资料,这里就不再叙述了,科学上网,懂得都懂。
一个小坑,在生成API key之后需立刻复制下来,否则将无法再次打开。当然如果错过复制了,也可以再重新生成一个key。
命令行输入
pip install openai
在安装前,需要确认自己使用的python版本,应选用3.7.1以上版本,下图截选自Python openai library的介绍文档。
参考OpenAI API官方文档,将其中几个常用方法封装为GptClient类,方便后续调用:
import openaiimport reimport osimport requestsfrom PIL import Image
当外部函数调用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的对话内容:
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
简单解释一下该方法可能涉及到的参数:
需要注意的是,这里许多参数都是可选参数,应根据自身需求选择是否需要使用。
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的内容加入了校验。
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}")
该方法可以理解为对生成的图片做进一步修改,代码如下:
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 将会仅对白色区域中的像素进行编辑,而忽略黑色区域中的像素。
在调用该方法时,image与mask有着一系列大小、尺寸的要求,因此同样需要对这些信息进行校验。
注意:在这里有一个坑,传入的图片对色彩模型有一定的要求,只允许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)
该方法旨在根据输入的图像数据来创建图像变体,可以用来扩充图像数据集,代码如下:
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 "图片已全部生成"
import ChatGPTClient as gptnewClient = gpt.GptClient("sk-------------你的API key----------------")
text = "以自己生病为由,向自己的老师写一封延迟提交作业的邮件,内容在300字左右"print(newClient.Completion(text))
生成的文本
尊敬的xxx老师:
您好!
我是你的学生xxx,很高兴能有机会向您问安。
上周我不幸生病,结果让我无法及时完成作业。因此,请您帮忙给我一些时间,让我可以延迟提交作业。我会尽快完成作业,并确保质量不会受到任何影响。我会在本周内提交完成的作业,并配合您的安排,适时完成作业。
最后,我想再次感谢您的耐心和支持。如果您有任何问题,请随时联系我。
此致
敬礼
xxx
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.
newClient.CreateImage("落霞与孤鹜齐飞,秋水共长天一色", "1024x1024", "G:\\tmp", "诗词图")
生成的图像:
尾叙:本人python小白,不喜勿喷。因需要调用openai库,临时学了些python,只是想分享下使用的经历,帮助到有需要的人。
最后,分享两个链接,以便大家查阅更多的API使用细则以及参数信息。
来源地址:https://blog.csdn.net/weixin_47321965/article/details/130407946
--结束END--
本文标题: Python调用OpenAI接口的简单封装
本文链接: https://lsjlt.com/news/394204.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0