当前位置: 首页 > news >正文

【结合OpenAI官方文档】解决Chatgpt的API接口请求速率限制

OpenAI API接口请求速率限制

速率限制以五种方式衡量:RPM(每分钟请求数)、RPD(每天请求数)、TPM(每分钟令牌数)、TPD(每天令牌数)和IPM(每分钟图像数)。

任何选项都可能会达到速率限制,具体取决于首先发生的情况。例如,向 ChatCompletions 端点发送仅包含 100 个令牌的 20 个请求,这将达到限制(如果RPM 为 20),即使在这 20 个请求中没有发送 150k 令牌(如果TPM 限制为 150k) 。

其他值得注意的重要事项:

  • 速率限制是在组织级别而不是用户级别施加的。
  • 速率限制因所使用的模型而异。
  • 组织每月可以在 API 上花费的总金额也受到限制。这些也称为“使用限制”。

OpenAI官网免费用户速率限制
请求头限制

解决方法

OpenAI Cookbook 有一个Python 笔记本,解释了如何避免速率限制错误,以及一个用于在批处理 API 请求时保持速率限制的示例Python 脚本。

在提供编程访问、批量处理功能和自动社交媒体发布时,考虑只为部分用户启用这些功能。

为了防止自动和大量滥用,请在指定时间范围内(每日、每周或每月)为单个用户设置使用限制。考虑对超出限制的用户实施硬上限或手动审核流程。

方法一:使用指数退避重试

避免速率限制错误的一种简单方法是使用随机指数退避自动重试请求。使用指数退避重试意味着在遇到速率限制错误时执行短暂睡眠,然后重试不成功的请求。如果请求仍然不成功,则增加睡眠长度并重复该过程。这将持续到请求成功或达到最大重试次数为止。这种方法有很多好处:

  • 自动重试意味着您可以从速率限制错误中恢复,而不会崩溃或丢失数据
  • 指数退避意味着您可以快速尝试第一次重试,同时如果前几次重试失败,仍然可以从更长的延迟中受益
  • 在延迟中添加随机抖动有助于同时重试所有命中。

请注意,不成功的请求会影响您的每分钟限制,因此连续重新发送请求将不起作用。

下面是一些使用指数退避的Python解决方案示例

示例 1:使用 Tenacity 库

Tenacity 是一个 Apache 2.0 许可的通用重试库,用 Python 编写,用于简化向任何事物添加重试行为的任务。要为您的请求添加指数退避,您可以使用tenacity.retry装饰器。下面的示例使用该tenacity.wait_random_exponential函数向请求添加随机指数退避。

from openai import OpenAI
client = OpenAI()from tenacity import (retry,stop_after_attempt,wait_random_exponential,
)  # 指数退避@retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6))
def completion_with_backoff(**kwargs):return client.completions.create(**kwargs)completion_with_backoff(model="gpt-3.5-turbo-instruct", prompt="Once upon a time,")

请注意,Tenacity 库是第三方工具,OpenAI 不保证其可靠性或安全性。

示例 2:使用backoff库

另一个为退避和重试提供函数装饰器的 python 库是backoff:

import backoff 
import openai
from openai import OpenAI
client = OpenAI()@backoff.on_exception(backoff.expo, openai.RateLimitError)
def completions_with_backoff(**kwargs):return client.completions.create(**kwargs)completions_with_backoff(model="gpt-3.5-turbo-instruct", prompt="Once upon a time,")

与 Tenacity 一样,backoff 库是第三方工具,OpenAI 不保证其可靠性或安全性。

示例 3:手动退避实现

如果您不想使用第三方库,您可以按照以下示例实现自己的退避逻辑:

import random
import timeimport openai
from openai import OpenAI
client = OpenAI()# 定义一个重试装饰器
def retry_with_exponential_backoff(func,initial_delay: float = 1,exponential_base: float = 2,jitter: bool = True,max_retries: int = 10,errors: tuple = (openai.RateLimitError,),
):"""Retry a function with exponential backoff."""def wrapper(*args, **kwargs):# 初始化变量num_retries = 0delay = initial_delay# 循环直到成功响应或达到 max_retries 或引发异常while True:try:return func(*args, **kwargs)# 重试特定错误except errors as e:# 增量重试num_retries += 1# 检查是否已达到最大重试次数if num_retries > max_retries:raise Exception(f"Maximum number of retries ({max_retries}) exceeded.")# 增加延迟delay *= exponential_base * (1 + jitter * random.random())time.sleep(delay)# 针对任何未指定的错误引发异常except Exception as e:raise ereturn wrapper@retry_with_exponential_backoff
def completions_with_backoff(**kwargs):return client.completions.create(**kwargs)

同样,OpenAI 不保证该解决方案的安全性或效率,但它可以成为您自己的解决方案的良好起点。

方法二:充分利用max_tokens以匹配您完成的规模

max_tokens您的速率限制是根据您的请求的字符数计算的令牌的最大值和估计数量。尝试将该max_tokens值设置为尽可能接近您的预期响应大小。

批量请求

OpenAI API 对每分钟请求数和每分钟令牌数有单独的限制。

如果您达到了每分钟的请求限制,但每分钟的令牌有可用容量,则可以通过将多个任务批处理到每个请求中来提高吞吐量。这将使您每分钟处理更多令牌,特别是对于我们较小的模型。

发送一批提示的工作方式与普通 API 调用完全相同,只不过您将字符串列表而不是单个字符串传递给提示参数。

  • 没有批处理的示例
from openai import OpenAI
client = OpenAI()num_stories = 10
prompt = "Once upon a time,"# 示例,每个请求完成一个故事
for _ in range(num_stories):response = client.completions.create(model="curie",prompt=prompt,max_tokens=20,)# 输出故事print(prompt + response.choices[0].text)
  • 批处理示例
from openai import OpenAI
client = OpenAI()num_stories = 10
prompts = ["Once upon a time,"] * num_stories# 批量示例,每个请求完成 10 个故事
response = client.completions.create(model="curie",prompt=prompts,max_tokens=20,
)# 按索引将完成与提示进行匹配
stories = [""] * len(prompts)
for choice in response.choices:stories[choice.index] = prompts[choice.index] + choice.text# 输出故事
for story in stories:print(story)

相关文章:

【结合OpenAI官方文档】解决Chatgpt的API接口请求速率限制

OpenAI API接口请求速率限制 速率限制以五种方式衡量:RPM(每分钟请求数)、RPD(每天请求数)、TPM(每分钟令牌数)、TPD(每天令牌数)和IPM(每分钟图像数&#x…...

C语言实现基础数据结构——栈

目录 栈 栈的实现 数组栈 数组栈的实现 栈的初始化 栈的销毁 数据入栈 判断栈是否为空 数据出栈 获取栈顶元素 获取栈内数据个数 项目实现 栈的基础练习 有效的括号 栈 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的…...

船舶制造5G智能工厂数字孪生可视化平台,推进船舶行业数字化转型

船舶制造5G智能工厂数字孪生可视化平台,推进船舶行业数字化转型。随着数字化时代的到来,船舶行业正面临着前所未有的机遇与挑战。为了适应这一变革,船舶制造企业需要加快数字化转型的步伐,提高生产效率、降低成本并增强市场竞争力…...

【网络编程】okhttp深入理解

newCall 实际上是创建了一个 RealCall 有三个参数:OkHttpClient(通用配置,超时时间等) Request(Http请求所用到的条件,url等) 布尔变量forWebSocket(webSocket是一种应用层的交互方式,可双向交互…...

大功率厚膜电阻器制造 – 优化性能?

通过优化工业大功率电阻器制造工艺,制造商可以提高电阻器的性能和可靠性、容差、额定电压、TCR、稳定性和额定功率。 在本文中,我们将介绍工业功率电阻器的制造过程。我们讨论了材料选择和生产技术及其对性能的潜在影响。 完美的电阻器 在其整个使用寿…...

ElasticStack安装(windows)

官网 : Elasticsearch 平台 — 大规模查找实时答案 | Elastic Elasticsearch Elastic Stack(一套技术栈) 包含了数据的整合 >提取 >存储 >使用,一整套! 各组件介绍: beats 套件:从各种不同类型的文件/应用中采集数据。比如:a,b,cd,e,aa,bb,ccLogstash:…...

gitlab的使用

前一篇文章我们已经知道Git人人都是中心,那他们怎么交互数据呢? • 使用GitHub或者码云等公共代码仓库 • 使用GitLab私有仓库 目录 一、安装配置gitlab 安装 初始化 这里初始化完成以后需要记住一个初始密码 查看状态 二、使用浏览器访问&#xf…...

基于springboot+vue的植物健康系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…...

Python爬虫实战入门:爬取360模拟翻译(仅实验)

文章目录 需求所需第三方库requests 实战教程打开网站抓包添加请求头等信息发送请求,解析数据修改翻译内容以及实现中英互译 完整代码 需求 目标网站:https://fanyi.so.com/# 要求:爬取360翻译数据包,实现翻译功能 所需第三方库 …...

微服务-微服务API网关Spring-clould-gateway实战

1. 需求背景 在微服务架构中,通常一个系统会被拆分为多个微服务,面对这么多微服务客户端应该如何去调用呢? 如果根据每个微服务的地址发起调用,存在如下问题: 1.客户端多次请求不同的微服务,会增加客户端…...

ECMAScript modules规范示例详解

ECMAScript modules(简称 ES modules)是JavaScript的标准模块系统。每个模块都是一个独立的JavaScript文件,可以在其中定义导出的变量、函数或类,并从其他模块中导入这些变量、函数或类。以下是ES modules规范的一些示例和详解&am…...

【OpenFeign常用配置】

OpenFeign常用配置 快速入门:1、引入依赖2、启用OpenFeign 实践1、引入依赖2、开启连接池功能3、模块划分4、日志5、重试 快速入门: OpenFeign是一个声明式的http客户端,是spring cloud在eureka公司开源的feign基础上改造而来。其作用及时基于…...

第2.1章 StarRocks表设计——概述

注:本篇文章阐述的是StarRocks-3.2版本的表设计相关内容。 建表是使用StarRocks非常重要的一环,规范化的表设计在某些场景下能使查询性能有数倍的提升。StarRocks的表设计涉及到的知识点主要包括数据表类型、数据分布(分区分桶及排序键&#…...

WooCommerce商品采集与发布插件

如何采集商品或产品信息,并自动发布到Wordpress系统的WooCommerce商品? 推荐使用简数采集器,操作简单方便,且无缝衔接WooCommerce插件,快速完成商品的采集与发布。 简数采集器的智能自动生成采集规则和可视化操作功能…...

select滑动分页请求数据

需求背景 Antd 的 select 组件支滑动分页获取后端数据 实现滑动加载数据 定义变量 const allLoadedRef useRef<boolean>(true); // 是否触底 const [current, setCurrent] useState<number>(1); // 当前页 const [list, setList] useState([]); // 列表定义…...

【Go channel如何控制goroutine并发执行顺序?】

多个goroutine并发执行时&#xff0c;每一个goroutine抢到处理器的时间点不一致&#xff0c;gorouine的执行本身不能保证顺序。即代码中先写的gorouine并不能保证先执行 思路&#xff1a;使用channel进行通信通知&#xff0c;用channel去传递信息&#xff0c;从而控制并发执行…...

逆向分析Cobalt Strike安装后门

Cobalt Strike简介 Cobalt Strike是一款基于java的渗透测试神器&#xff0c;也是红队研究人员的主要武器之一&#xff0c;功能非常强大&#xff0c;非常适用于团队作战&#xff0c;Cobalt Strike集成了端口转发、服务扫描&#xff0c;自动化溢出&#xff0c;多模式端口监听&am…...

【嵌入式学习】QT-Day3-Qt基础

1> 思维导图 https://lingjun.life/wiki/EmbeddedNote/20QT 2> 完善登录界面 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后…...

【杭州游戏业:创业热土,政策先行】

在前面的文章中&#xff0c;我们探讨了上海、北京、广州、深圳等城市的游戏产业现状。现在&#xff0c;我们切换视角&#xff0c;来看看另一个游戏创业热土——杭州的发展情况 最近第19届亚运会在杭州举办&#xff0c;本次亚运会上&#xff0c;电子竞技首次获准列为正式比赛项…...

Python-pdfplumber读取PDF内容

文章目录 前言一、pdfplumber模块1.1 pdfplumber的特点1.2 pdfplumber.PDF类1.3pdfplumber.Page类 二 pdfplumber的使用2.1 加载PDF2.2 pdfplumber.PDF 类2.3 pdfplumber.Page 类2.4 读取PDF2.5 读取PDF文档信息2.6 查看总页数2.7 查看总页数读取第一页的宽度&#xff0c;页高等…...

Zotero 7保姆级配置指南:从PC到安卓平板,用坚果云实现文献无缝同步

Zotero 7跨设备文献管理终极方案&#xff1a;Windows与安卓全链路同步实战 作为一名长期与文献打交道的科研工作者&#xff0c;最痛苦的莫过于在实验室电脑上精心整理的参考文献&#xff0c;回到家中平板上却无法查阅。这种割裂感我深有体会——直到发现Zotero 7与坚果云的组合…...

HY-Motion 1.0效果对比:相比MotionDiffuse在动作连贯性上提升35%

HY-Motion 1.0效果对比&#xff1a;相比MotionDiffuse在动作连贯性上提升35% 1. 模型概述 HY-Motion 1.0是基于流匹配技术的3D动作生成大模型&#xff0c;代表了文本到3D动作生成领域的最新突破。这个模型系列采用了Diffusion Transformer&#xff08;DiT&#xff09;和流匹配…...

Docker快速搭建个人开源导航站:从配置到公网访问

1. 为什么你需要一个个人导航站&#xff1f; 每天打开浏览器&#xff0c;你是不是也和我一样要反复输入那些常用的网址&#xff1f;GitHub、技术论坛、在线工具网站...收藏夹早就塞得乱七八糟。更糟的是换了电脑或手机&#xff0c;所有收藏都得重新整理。三年前我开始用自建导…...

ddclient与主流网络服务集成:PPP、DHCP、systemd和cron的完美搭配

ddclient与主流网络服务集成&#xff1a;PPP、DHCP、systemd和cron的完美搭配 【免费下载链接】ddclient Ddclient updates dynamic DNS entries for accounts on a wide range of dynamic DNS services. 项目地址: https://gitcode.com/gh_mirrors/dd/ddclient ddclien…...

3分钟终极解决方案:快速解除Cursor试用限制的完整指南

3分钟终极解决方案&#xff1a;快速解除Cursor试用限制的完整指南 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgrade to pro. We …...

nRF Connect扫描功能保姆级教程:从过滤广播数据到分析RSSI信号图,手把手教你精准定位蓝牙设备

nRF Connect扫描功能实战指南&#xff1a;从设备筛选到信号优化的全流程解析 当你面对展会现场上百个闪烁的蓝牙设备指示灯&#xff0c;或是实验室里数十个同型号的传感器节点时&#xff0c;如何快速锁定目标设备就像大海捞针。nRF Connect作为蓝牙开发者的瑞士军刀&#xff0c…...

揭秘BongoCat:桌面上的数字伙伴,重新定义人机交互新体验

揭秘BongoCat&#xff1a;桌面上的数字伙伴&#xff0c;重新定义人机交互新体验 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作&#xff0c;每一次输入都充满趣味与活力&#xff01; 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat…...

禅道企业微信消息推送改造实战:如何让群消息自动@指定成员(附源码修改)

禅道与企业微信深度集成&#xff1a;打造智能提醒的自动化消息推送系统 在项目管理工具与企业通讯平台的融合应用中&#xff0c;消息推送的智能化程度直接影响团队协作效率。禅道作为国内广泛使用的项目管理软件&#xff0c;与企业微信的对接虽然提供了基础通知功能&#xff0…...

PySR高性能符号回归:如何快速从复杂数据中提取可解释的数学方程

PySR高性能符号回归&#xff1a;如何快速从复杂数据中提取可解释的数学方程 【免费下载链接】PySR High-Performance Symbolic Regression in Python and Julia 项目地址: https://gitcode.com/gh_mirrors/py/PySR 符号回归&#xff08;Symbolic Regression&#xff09;…...

Kotaemon在教育培训中的应用:如何构建可信赖的学科答疑助手?

Kotaemon在教育培训中的应用&#xff1a;如何构建可信赖的学科答疑助手&#xff1f; 1. 教育场景中的AI答疑痛点 想象这样一个场景&#xff1a;晚自习教室里&#xff0c;一个学生正为生物作业发愁。他在手机上输入&#xff1a;"光合作用的暗反应发生在叶绿体的哪个部位&…...