用通俗易懂的方式讲解:OpenAI 新版 API 使用介绍,帮助大家快速解锁这些新功能

news2024/9/23 13:24:23

OpenAI 最近举办了首次开发者大会,大会上不仅发布了 GPTs 这样王炸级别的新功能,还发布了一些新模型,比如gpt-4-turbo等,模型的知识截止时间也提高到了 2023 年 4 月。

同时配合这些新模型,OpenAI 还开放了大家期盼已久的新 API,其中包括语音生成、图像生成、图像识别等功能,本文将对这些新 API 进行介绍,帮助大家快速掌握这些新功能。

OpenAI Python 包

在 OpenAI 举办完开发者大会后,OpenAI 的官方 Python 包也进行了快速更新,从原来的 0.x 版本一下子升级到 1.x 版本,截止到笔者撰写本文时,最新的版本为 1.2.3。在本文中,我们将使用最新的 Python 包进行演示,大家可以按照以下步骤安装最新的 Python 包:

pip install --upgrade openai

然后在终端导入 OpenAI 的 API KEY 作为环境变量:

export OPENAI_API_KEY=sk-xxxxx

这样我们在使用 OpenAI 的 Python 包时就会自动加载这个环境变量了。

通俗易懂讲解大模型系列

  • 用通俗易懂的方式讲解:ChatGPT 开放的多模态的DALL-E 3功能,好玩到停不下来!

  • 用通俗易懂的方式讲解:结合检索和重排序模型,改善大模型 RAG 效果明显

  • 用通俗易懂的方式讲解:基于扩散模型(Diffusion),文生图 AnyText 的效果太棒了

  • 用通俗易懂的方式讲解:在 CPU 服务器上部署 ChatGLM3-6B 模型

  • 用通俗易懂的方式讲解:ChatGLM3-6B 功能原理解析

  • 用通俗易懂的方式讲解:使用 LangChain 和大模型生成海报文案

  • 用通俗易懂的方式讲解:一个强大的 LLM 微调工具 LLaMA Factory

  • 用通俗易懂的方式讲解:ChatGLM3-6B 部署指南

  • 用通俗易懂的方式讲解:LangChain Agent 原理解析

  • 用通俗易懂的方式讲解:HugggingFace 推理 API、推理端点和推理空间使用详解

  • 用通俗易懂的方式讲解:使用 LangChain 封装自定义的 LLM,太棒了

  • 用通俗易懂的方式讲解:使用 FastChat 部署 LLM 的体验太爽了

  • 用通俗易懂的方式讲解:基于 Langchain 和 ChatChat 部署本地知识库问答系统

  • 用通俗易懂的方式讲解:使用 Docker 部署大模型的训练环境

  • 用通俗易懂的方式讲解:在 Ubuntu 22 上安装 CUDA、Nvidia 显卡驱动、PyTorch等大模型基础环境

  • 用通俗易懂的方式讲解:Llama2 部署讲解及试用方式

  • 用通俗易懂的方式讲解:LangChain 知识库检索常见问题及解决方案

  • 用通俗易懂的方式讲解:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统

  • 用通俗易懂的方式讲解:代码大模型盘点及优劣分析

  • 用通俗易懂的方式讲解:Prompt 提示词在开发中的使用

技术交流

建了AIGC大模型技术交流群! 想要学习、技术交流、获取如下原版资料的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2060,备注:来自CSDN + 技术交流

在这里插入图片描述
文字转语音

OpenAI 新版的文字转语音 API 提供了 2 个 TTS(Text to Speech)模型:tts-1 和 tts-1-hd。tts-1 模型速度较快,而 tts-1-hd 模型质量较高,大家可以根据自己的实际需求选择合适的模型,模型的使用方法如下:

from pathlib import Path
import openai

response = openai.audio.speech.create(
    model="tts-1",
    voice="shimmer",
    input="举头望明月,低头思故乡",
    response_format="mp3",
    speed=1.0,
)
speech_file_path = Path(__file__).parent / "speech.mp3"
response.stream_to_file(speech_file_path)
  • model 参数可以选择 tts-1 或者 tts-1-hd。

  • voice 参数是指声音的类型,目前支持 6 种声音,分别是:alloy、echo、fable、onyx、nova、和 shimmer。

  • 另外 API 还有 2 个可选参数,分别是 response_format 和 speed,response_format 参数是指导出声音文件格式,可以选择 mp3、opus、 aac 和 flac;speed 参数是指声音的速度,值的范围是 0.25 ~ 4.0,默认值是 1.0。

图像生成

图像生成方面也新推出了可以使用 DALL-E 3 模型的 API,使用方法如下:

from openai import OpenAI
import requests
import json

client = OpenAI()

def save_image_by_url(url, file_name: str = "output.png"):
    response = requests.get(url)
    with open(file_name, "wb") as f:
        f.write(response.content)

response = client.images.generate(
    model="dall-e-3",
    prompt="画一个宇航员在月球上骑马的图片",
    n=1,
    quality="standard",
    size="1024x1024",
    style="vivid",
    response_format="url",
)
result = json.loads(response.json())
image_url = result["data"][0]["url"]
save_image_by_url(image_url)
  • model 参数是指使用的模型,可以选择 dall-e-2 或者 dall-e-3。

  • prompt 参数是指生成图片的提示词,dall-e-2 模型支持 1000 个 token,而 dall-e-3 模型支持 4000 个 token。

  • n 参数是指一次生成多少张图片,范围为 1 到 10,dall-e-3 模型只能支持一次生成一张图片。

  • quality 参数是指图片的质量,有 standard 和 hd 两个选项,standard 是标准质量,生成速度较快,hd 是高清质量,生成速度较慢,该参数只对 dall-e-3 模型有效。

  • size 参数是指图片的尺寸,默认是 1024 x 1024,对于 dall-e-2 模型支持 256x256、512x512、1024x1024 三种尺寸,对于 dall-e-3 模型支持 1024x1024、1792x1024、1024x1792 三种尺寸。

  • style 参数是生成图片的风格,有 vivid 和 natural 两个选项,vivid 让图片更贴近真实场景,而 natural 让图片更像是绘画。

  • response_format 是指输出格式,有 url 和 b64_json 两种格式,url 是指输出图片的 url 地址,b64_json 是指输出图片的 base64 编码。

上面的例子返回了图片的 url,下面再演示一下通过 b64_json 格式输出图片的 base64 编码,然后再将 base64 编码转换成图片文件:

import base64

def save_image_by_b64(b64_json: str, file_name: str = "output.png"):
    with open(file_name, "wb") as f:
        f.write(base64.b64decode(b64_json))

response = client.images.generate(
    ......
    response_format="b64_json",
)
result = json.loads(response.json())
image_b64 = result["data"][0]["b64_json"]
save_image_by_b64(image_b64, file_name="output-b64.png")

生成的图片效果如下:

图片

固定输出 Json 对象

以前让 ChatGPT 返回 Json 格式的结果时,由于 ChatGPT 喜欢废话的特性,返回的结果往往不尽人意,经常是返回一个 Json 对象然后再带上一段废话,这样让我们在程序解析上比较麻烦,现在 OpenAI 新版 API 新增了一个专门返回有效 Json 对象的功能,使用方法如下:

from openai import OpenAI

SYSTEM_PROMPT = """
你是一个得力的助手,帮助人类提取句子中的人名信息,并以json格式展示。

json格式如下:
{
    "name": ["小明"],
}
"""

completion = client.chat.completions.create(
    model="gpt-3.5-turbo-1106",  # 需要用到新模型,老的比如 gpt-3.5-turbo 不支持该功能
    messages=[
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": "小明和小红去上学。"},
    ],
    response_format={"type": "json_object"},
)

print(completion.choices[0].message.content)
  • 使用的 API 是对话 API,但不同的地方是,response_format 参数将值设置为{"type": "json_object"},这样就启动了 Json 模式,保证了返回的结果是一个 Json 对象。

  • 注意使用 JSON 模式的时候,model 参数需要用到新模型,比如 gpt-3.5-turbo-1106 或 gpt-4-1106-preview,老模型不支持该功能。

  • 还有一点是,使用 JSON 模式时,在提示词中必须明确要求 ChatGPT 返回 Json 格式,不管是在 System 提示词还是 User 提示词中都可以,否则 API 就会返回无限循环的空格,直到 token 达到上限。

上面例子的返回内容如下:

{
  "name": ["小明", "小红"]
}

一次执行多个 Function Calling

Function Calling 是 OpenAI 之前就具备的功能,即在对话中使用用户自定义的工具,来让 ChatGPT 能做更多的事情,比如实时查询某个地区的天气情况,或者查询股票的最新价格等。但是以前在一次对话中只能调用一个工具,现在新版 API 支持一次调用多个工具。

图片

下面使用代码分段展示如何在一次对话中调用多个工具:

from openai import OpenAI

client = OpenAI()

messages = [
    {
        "role": "user",
        "content": "今天北京、上海、成都的天气怎么样?",
    }
]
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "获取某个地方当前的天气情况",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "城市名,比如:北京, 上海",
                    },
                },
                "required": ["location"],
            },
        },
    }
]
response = client.chat.completions.create(
    model="gpt-3.5-turbo-1106",
    messages=messages,
    tools=tools,
    tool_choice="auto",
)
  • 首先使用我们定义了对话中要用到的工具集 tools,ChatGPT 会根据用户的问题来选择调用哪个工具,示例代码中我们用到一个查询天气的工具。

  • tools 参数以前叫做 functions,现在改名为 tools,但是功能是一样的,都是用来定义工具集的。需要定义工具的名称、描述和参数信息(名称、类型、描述和是否必需)。

  • model 参数是指使用的模型,一次调用多个工具需要可以选择新模型:gpt-3.5-turbo-1106 或者 gpt-4-1106-preview。

  • tool_choice 参数以前叫做 function_call,现在改名为 tool_choice,是指选择的工具,有以下 3 种值:

  • auto:根据用户问题选择工具,是默认值

  • none:不选择任何工具,直接返回生成的消息

  • 工具名称:选择某个工具,比如:{"type: "function", "function": {"name": "get_current_weather"}}

这样在调用对话 API 后,ChatGPT 会根据用户的问题返回需要用到的工具列表 tool_calls,这个列表包含了每个工具的名称和参数等信息,下面继续看如何调用工具:

response_message = response.choices[0].message
tool_calls = response_message.tool_calls
if tool_calls:
    messages.append(response_message)
    available_functions = {
        "get_current_weather": get_current_weather,
    }
    for tool_call in tool_calls:
        function_name = tool_call.function.name
        function_to_call = available_functions[function_name]
        function_args = json.loads(tool_call.function.arguments)
        function_response = function_to_call(
            location=function_args.get("location"),
        )
        messages.append(
            {
                "tool_call_id": tool_call.id,
                "role": "tool",
                "name": function_name,
                "content": function_response,
            }
        )
    second_response = client.chat.completions.create(
        model="gpt-3.5-turbo-1106",
        messages=messages,
    )
    print(second_response.choices[0].message.content)
  • 得到工具列表后,我们就可以根据工具列表来调用工具了,这里我们定义了一个get_current_weather的方法,然后根据工具列表中的工具名和参数来调用这个方法。

  • 将方法返回的结果,结合工具调用 id 和工具名等信息,以 tool 为角色添加 message 信息到到历史对话中。

  • 得到最后的历史对话 messages 后,再次调用对话 API,由 ChatGPT 根据工具的返回结果来生成最终的答案,注意这里的 model 参数也是需要选择新模型。

我们为了演示方便,get_current_weather方法使用一些简单的逻辑来模拟天气查询的功能:

import json

def get_current_weather(location):
    """Get the current weather in a given location"""
    if "北京" in location.lower():
        return json.dumps({"location": location, "temperature": "10°"})
    elif "上海" in location.lower():
        return json.dumps({"location": location, "temperature": "15°"})
    else:
        return json.dumps({"location": location, "temperature": "20°"})

最终的返回结果为:

北京目前温度为10℃,上海为15℃,成都为20℃。

最终完整的对话记录如下:

[
  { "role": "user", "content": "今天北京、上海、成都的天气怎么样?" },
  {
    "role": "assistant",
    "tool_calls": [
      {
        "id": "call_hrGSR6rUAiTjdqi5BDNY3DCr",
        "type": "function",
        "function": {
          "arguments": "{\"location\": \"北京\"}",
          "name": "get_current_weather"
        }
      },
      {
        "id": "call_L8cyPoBWcfAU6Q8dyZP8mA5k",
        "type": "function",
        "function": {
          "arguments": "{\"location\": \"上海\"}",
          "name": "get_current_weather"
        }
      },
      {
        "id": "call_RZvc1iGHJ0BnJwuqYmSeo5YF",
        "type": "function",
        "function": {
          "arguments": "{\"location\": \"成都\"}",
          "name": "get_current_weather"
        }
      }
    ]
  },
  {
    "role": "tool",
    "tool_call_id": "call_hrGSR6rUAiTjdqi5BDNY3DCr",
    "name": "get_current_weather",
    "content": "{\"location\": \"北京\", \"temperature\": \"10°\"}"
  },
  {
    "role": "tool",
    "tool_call_id": "call_L8cyPoBWcfAU6Q8dyZP8mA5k",
    "name": "get_current_weather",
    "content": "{\"location\": \"上海\", \"temperature\": \"15°\"}"
  },
  {
    "role": "tool",
    "tool_call_id": "call_RZvc1iGHJ0BnJwuqYmSeo5YF",
    "name": "get_current_weather",
    "content": "{\"location\": \"成都\", \"temperature\": \"20°\"}"
  },
  {
    "role": "assistant",
    "content": "北京目前温度为10℃,上海为15℃,成都为20℃。"
  }
]

图像识别

GPT4V 以前只能在 Web 或 APP 中使用,现在也终于开放了 API。以下是使用方法:

from openai import OpenAI
import base64

client = OpenAI()

def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")

base_image = encode_image("output.png")
completion = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "图片中是什么内容"},
                {
                    "type": "image_url",
                    "image_url": {
                        # 可以是图片的 base64 编码
                        "url": f"data:image/png;base64, {base_image}",
                        # # 也可以是图片的 url 地址
                        # "url": "https://image-server.com/foo.png",
                        "detail": "high",
                    },
                },
            ],
        }
    ],
    max_tokens=300,
)
print(completion.choices[0].message.content)

  • model 参数是指使用的模型,图片识别的功能只能使用 gpt-4-vision-preview 这个模型。

  • user 的提示词不再是字符串类型,而是一个数组类型,数组中包含了文字和图片信息,文字信息是用户的问题,图片信息是用户上传的图片文件。

  • 上传的图片可以是图片文件的 Base64 编码,示例代码中我们用一个 Python 方法将图片转成 Base64 编码。同时也支持图片的 url 地址,官方建议使用 url 地址来做图片识别,因为使用图片 base64 编码的话,OpenAI API 接收到请求后还需要下载图片,从而增加了 API 的调用时间。

  • image_url 参数中的 detail 参数用来控制模型识别图片的精准度,有 low 和 high 两个选项,low 对图片识别较快但识别度不高,high 对图片识别较准确,但所耗费的 token 也较多。

在图片识别 API 中,可以同时上传多个图片,下面是一个比较两张图片的代码示例:

completion = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "比较这两张图片有什么不同"},
                {
                    "type": "image_url",
                    "image_url": { "url": "https://image-server.com/diff1.png" },
                },
                {
                    "type": "image_url",
                    "image_url": { "url": "https://image-server.com/diff2.png" },
                },
            ],
        }
    ],
    max_tokens=300,
)

在 content 数组中添加多个 image_url 参数即表示多个图片,但经过实际测试,GPT4V 对图片的比较还存在较大的误差,讲出来的不同点跟图片中的内容不符。上传的图片在调用完 API 后会被 OpenAI 服务器自动删除,所以不用担心会被拿去训练他们的模型。

GPT4V 的限制

目前 GPT4V 对图片识别存在以下限制:

  • 医学图片:该模型不适合解释像 CT 图片等医学图片

  • 非英文图片:目前对非英文的图片识别不好

  • 旋转图片:对旋转的图片或文字识别不好

  • 验证码:不要想利用 GPT4V 来识别验证码了,OpenAI 已经禁止了这个功能

更多的限制信息请看这里[2]。

图片识别的 token 计算

因为图片识别 API 需要上传图片,所以在计算 API 耗费的 token 时需要考虑图片的大小,当识别图片使用的是detail: low的低保真模式时,每张图片耗费 85 token;而使用detail: high的高保真模式时,每张图片按照包含多少个 512 平方来计算 token,每包含 1 个 512 平方耗费 170 token,最后再加上固定的 85 token,比如一张 1024 x 1024 的图片,包含了 4 个 512 平方,所以 就会耗费 680 token,最后再加上 85 token,所以总共耗费 765 token。

具体的 token 计算规则可参考官方的消费计算规则[3]。

总结

本文介绍了 OpenAI 新版 API 中的文字转语音、图像生成、图像识别等功能,这些新版的 API 可以帮助我们构建功能更加强大的 AI 应用,而且 OpenAI 还开放了 GPTs 的 API 功能——Assistant API,我们将在下期对这个新 API 进行详细介绍,敬请期待。

关注我,一起学习各种人工智能和 AIGC 新技术,欢迎交流,如果你有什么想问想说的,欢迎在评论区留言。

参考:

[2]这里: https://platform.openai.com/docs/guides/vision/limitations

[3]消费计算规则: https://platform.openai.com/docs/guides/vision/calculating-costs

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Anaconda + Pytorch 超详细安装教程

Anaconda Pytorch 超详细安装教程 安装 Anaconda 略,自行百度即可 安装 Pytorch 虚拟环境 第一步 选择 env第二步 创建第三步 填写环境名称和选择 python 版本号 第四步 打开 https://pytorch.org/ 选择 pytorch 版本,我这里选择的是 GPU 版本 即 CUDA 11.8,也…

Mysqld的关键优化参数

skip-name-resolve 现象 mysql连接很慢,登陆到服务器上查看服务器日志都是正常的,无可疑记录,登陆到mysql服务器上,查看下进程,发现有很多这样的连接: 218 | unauthenticated user | 192.168.10.6:44500 |…

vue简单实现滚动条

背景:产品提了一个需求在一个详情页,一个form表单元素太多了,需要滚动到最下面才能点击提交按钮,很不方便。他的方案是,加一个滚动条,这样可以直接拉到最下面。 优化:1、支持滚动条,…

宏基因组序列分析工具EukRep

文章:Genome-reconstruction for eukaryotes from complex natural microbial communities | bioRxiv 仓库:patrickwest/EukRep: Classification of Eukaryotic and Prokaryotic sequences from metagenomic datasets (github.com) 推荐使用conda进行安…

机械配件移动商城课程概述

项目介绍 开发准备 任务 开源库介绍 框架搭建 工具类

C++-异常处理

1、概念 异常时程序在执行期间产生的问题。C异常是指在程序运行时发生的特殊情况。比如string::at函数下标越界等。 异常提供了一种转移程序控制权的方式。 一旦程序出现异常没有经过处理,就会造成程序运行崩溃。 处理异常的方式有:抛出异常(…

算法每日一题:队列中可以看到的人数 | 单调栈

大家好,我是星恒 今天是一道困难题,他的题解比较好理解,但是不好想出来,接下来就让我带大家来捋一捋这道题的思路,以及他有什么特征 题目:leetcode 1944有 n 个人排成一个队列,从左到右 编号为 …

【面试高频算法解析】算法练习6 广度优先搜索

前言 本专栏旨在通过分类学习算法,使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目,帮助您深度理解每种算法,避免出现刷了很多算法题,还是一知半解的状态 专栏导航 二分查找回溯(Backtracking&…

使用Python给图片加水印(通过OpenCV和Pillow实现,内含完整代码链接)

from PIL import Image, ImageFont, ImageDraw, ImageEnhance, ImageChops import cv2 import math import numpy as npdef crop_image(im):"""裁剪图片边缘空白"""bg Image.new(mode"RGBA", sizeim.size)bbox ImageChops.differenc…

vite + vue3引入ant design vue 报错

npm install ant-design-vue --save下载插件并在main.ts 全局引入 报错 解决办法一: main.ts注释掉全局引入 模块按需引入 解决办法二 将package.json中的ant-design-vue的版本^4.0.0-rc.4改为 ^3.2.15版本 同时将将package-lock.json中的ant-design-vue的版本…

打造私域流量的知识付费小程序saas租户平台

当今信息爆炸的时代,知识管理已经成为了每个人必须面对的问题。然而,市面上的知识付费平台大多数都是通用的,无法满足个性化需求。 因此,明理信息科技提供了一款专属定制的适合个人的知识付费平台。核心产品能力如下:…

Huggy Lingo: 利用机器学习改进 Hugging Face Hub 上的语言元数据

太长不看版: Hub 上有不少数据集没有语言元数据,我们用机器学习来检测其语言,并使用 librarian-bots 自动向这些数据集提 PR 以添加其语言元数据。 Hugging Face Hub 已成为社区共享机器学习模型、数据集以及应用的存储库。随着 Hub 上的数据集越来越多&…

git打tag以及拉取tag

场景:某次git代码发布后定版记录,将发版所在的commit时候代码打上tag记录,方便后期切换到对应tag代码位置。 查看所有tag名 git tag// 1.1.0 // 1.0.0查看tag和描述 git tag -l -n//1.0.0 云监管一期项目完结 //1.1.0 …

tcl 基础

exec catch file mkdir

使用爬虫爬取热门电影

文章目录 网站存储视频的原理M3U8文件解读网站分析代码实现 网站存储视频的原理 首先我们来了解一下网站存储视频的原理。 一般情况下&#xff0c;一个网页里想要显示出一个视频资源&#xff0c;必须有一个<video>标签&#xff0c; <video src"xxx.mp4"&…

第8课 将推流端与播放端合并为一对一音视频聊天功能

在第二章的第7课&#xff0c;我们实现了一个推流端&#xff0c;可以把音视频推送到rtmp服务器&#xff1b;在第一章的第4课&#xff0c;我们实现了一个播放器&#xff0c;可以正常播放rtmp音视频流。聪明的你应该可以想到了&#xff1a;把推流端和播放端合并在一起&#xff0c;…

求实创新 不断探索 浙江移动基于亚信科技AntDB数据库率先完成CRM系统全域改造

12日20日&#xff0c;中国信息通信研究院&#xff08;简称&#xff1a;信通院&#xff09;和中国通信标准化协会大数据库技术推进委员会&#xff08;CCSA TC601&#xff09;共同组织的2023年大数据库“星河&#xff08;Galaxy&#xff09;”案例评选结果发布。中国移动通信集团…

2024年天津体育学院专升本专业考试考生入场及考前须知

天津体育学院2024年高职升本科招生专业考试考生考前须知 一、考生入场及考试要求 1.考生于1月6日笔试考试当天&#xff0c;根据考试时间提前30分钟到达天津体育学院新校区东门&#xff0c;凭专业考试准考证、有效身份证原件&#xff0c;经查验合格后方可允许进入学校。 2.笔…

Java反射篇----第二篇

系列文章目录 文章目录 系列文章目录前言一、实现Java反射的类:二、反射机制的优缺点:三、Java 反射 API前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、实现…

Centos服务器安装Certbot以webroot的方式定时申请SSL免费证书

最近发现原先免费一年的SSL证书都改为3个月的有效期了&#xff0c;原先一年操作一次还能接受&#xff0c;现在3个月就要手动续期整的太慢烦了&#xff0c;还是让程序自动给处理下吧&#xff0c; 安装 Certbot yum install epel-release -y yum install certbot -yEPEL是由 Fe…