Python调用OpenAI接口的简单封装

这篇具有很好参考价值的文章主要介绍了Python调用OpenAI接口的简单封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

2. 安装OpenAI库

命令行输入

pip install openai

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

Python调用OpenAI接口的简单封装,人工智能,python

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的对话内容:

Python调用OpenAI接口的简单封装,人工智能,python Python调用OpenAI接口的简单封装,人工智能,python

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 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

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

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

1. OpenAI官网API文档 

2. OpenAI Python Library文章来源地址https://www.toymoban.com/news/detail-615504.html

到了这里,关于Python调用OpenAI接口的简单封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AIGC开发:调用openai的API接口实现简单机器人

    开始进行最简单的使用:通过API调用openai的模型能力 OpenAI的能力如下图: OpenAI 的文本生成模型(通常称为生成式预训练 Transformer 或大型语言模型)经过训练可以理解自然语言、代码和图像。这些模型提供文本输出来响应其输入。这些模型的输入也称为“提示”。设计提示本

    2024年02月03日
    浏览(54)
  • 第14章-Python-人工智能-语言识别-调用百度语音识别

            百度语音识别API是可以免费试用的,通过百度账号登录到百度智能云,在语音技术页面创建的应用,生成一个语音识别的应用,这个应用会给你一个APIKey和一个Secret Key,如图14.1所示。  我们在自己的程序中用 API Key 和 Secret Key 这两个值获取 Koken,然后再通过 Token 调

    2024年02月08日
    浏览(65)
  • 【人工智能】简单线性回归模型介绍及python实现

    简单线性回归是人工智能和统计学中一个基本的预测技术,用于分析两个连续变量之间的线性关系。在简单线性回归中,我们试图找到一个线性方程来最好地描述这两个变量之间的关系。 变量 :简单线性回归涉及两个变量 - 自变量(independent variable)和因变量(dependent vari

    2024年01月17日
    浏览(56)
  • ChatGPT——OpenAI推出的人工智能聊天机器人

    ChatGPT——OpenAI推出的人工智能聊天机器人 [ 编辑] ChatGPT 全称为“chat Generative Pre-trained Transformer”,翻译成中文就是生成型预训练变换模型。它是美国公司OpenAI在2022年11月30日发布研发的聊天机器人程序,能用于问答、文本摘要生成、机器翻译、分类、代码生成和对话AI。 [1

    2024年02月04日
    浏览(77)
  • OpenAI Embedding:基于人工智能的搜索新篇章

    本文正在参加「金石计划」 Embedding模型在许多应用场景中都有广泛的应用。在OpenAI中,文本嵌入技术主要用于衡量文本字符串之间的相关性。 嵌入(Embeddings)是一种将离散变量表示为连续向量的方法。它在机器学习中起到了不可或缺的作用。例如,在机器翻译中的词嵌入和分

    2024年02月04日
    浏览(57)
  • 怎么获取OpenAI的api-key【人工智能】

    2024-4-11 11:32:06 以下内容源自《【人工智能】》 仅供学习交流使用 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN@日星月云 博客主页是https://jsss-1.blog.csdn.net 禁止其他平台发布时删除以上此话 小白如何设置openai api key的环境变量 https://platform.openai.com/do

    2024年04月27日
    浏览(51)
  • OpenAI的人工智能语音识别模型Whisper详解及使用

            拥有ChatGPT语言模型的OpenAI公司,开源了 Whisper 自动语音识别系统,OpenAI 强调 Whisper 的语音识别能力已达到人类水准。         Whisper是一个通用的语音识别模型,它使用了大量的多语言和多任务的监督数据来训练,能够在英语语音识别上达到接近人类水平的鲁

    2024年02月09日
    浏览(62)
  • 搭建Gpt OpenAI 人工智能写作助手和内容创SaaS系统

    该源码是一个SaaS平台,允许你的用户使用OpenAI人工智能技术来生成独特的内容和图像。它可以生成新的无抄袭内容,并以多种语言改进现有内容。用户还可以通过OpenAI DALL-E和稳定扩散,通过描述图像来生成图像。用户还可以通过OpenAi Whisper模型,用语音转文本功能创建音频和

    2024年02月15日
    浏览(57)
  • OpenAI的新语言模型升级是否会改变人工智能领域的格局?

    近年来,人工智能领域取得了巨大的进展,其中语言模型的发展尤为引人注目。而在这个领域的重要参与者之一,OpenAI近期宣布了其大型语言模型API的重大升级,引发了业界的广泛关注。随着GPT-4和gpt-3.5-turbo等新版本的推出,一个重要的问题浮现:OpenAI的新语言模型升级是否

    2024年02月13日
    浏览(52)
  • 探索OpenAI-Unity:融合人工智能与游戏开发的新纪元

    项目地址:https://gitcode.com/srcnalt/OpenAI-Unity OpenAI-Unity 是一个激动人心的开源项目,它将OpenAI Gym的机器学习环境与Unity游戏引擎相结合,为开发者和研究者提供了一个在虚拟世界中训练和测试人工智能模型的强大平台。通过这个项目,您可以利用Unity的强大图形渲染能力和物理模

    2024年04月28日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包