【结合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)

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

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

相关文章

【鸿蒙 HarmonyOS 4.0】UIAbility、页面及组件的生命周期

一、背景 主要梳理下鸿蒙系统开发中常用的生命周期 二、UIAbility组件 UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。 UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页…

《UE5_C++多人TPS完整教程》学习笔记23 ——《P24 通往大厅关卡的路径(Path to Lobby)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P24 通往大厅关卡的路径(Path to Lobby)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版,UP主(也是…

Java 学习和实践笔记(16):类的理解以及初始值

类,英文名叫class。基本上对应的就是语言里的名词。 比如,房子、人、树、花、汽车等等,这些名词,这些可以定义成类。 以房子为例,作为一个房子,它一定有相应的属性,比如房顶、墙、门、窗等等&…

企业品牌软文发布在媒体上,有啥用呢

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 通常企业都会建立自己的媒体矩阵,在公众号,视频号,抖音,网易号,搜狐号等企业品牌矩阵中发布软文,公司动态&#xf…

【MySQL】如何理解索引(高频面试点)

一、前言 首先这个博客会介绍一些关于MySQL中索引的基本内容以及一些基本的语法,当然里面也会有些常见的面试题的解答。 二、关于索引 1、概念 索引是一种能够帮助MySQL高效的去磁盘检索数据的一种数据结构。在MySQL的Innodb存储引擎中呢,采用的是B树的…

Mendix 实现WMS物料移动场景

前言 见客多了,总有那么一些客户让你心生敬佩! 他们总能抓住事物本质,即使是沟通低代码时,提的问题也直击内核。 去年初有客户问“如何用3-4张表实现一个问卷应用,问题数量不确定且类型多样”。 这个深刻问题体现出…

大数据揭秘:Hadoop短视频流量分析实战

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

【高频SQL基础版本】1204.最后一个能进入巴士的人

题目: 自己去搜一下吧。 解题思路: 这里最重要的知识点是累加求和,而不是直接汇总求和。 如果直接汇总求和体重就是SUM(weight),而根据turn的次序,累加求和,则需要SUM(weight)over (order by turn),这样…

华为算法题 go语言或者ptython

1 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返…

Hudi程序导致集群RPC偏高问题分析

1、背景 Hudi程序中upsert操作频繁,过多的删除和回滚操作,导致集群RPC持续偏高 2、描述 hudi采用的是mvcc设计,提供了清理工具cleaner来把旧版本的文件分片删除,默认开启了清理功能,可以防止文件系统的存储空间和文件数量的无限…

ITSM专家会诊功能上线,群聊解难题,协同解决就这么简单!

在最新推出的V1.28.0版本中,燕千云带来了一系列激动人心的新功能及优化,旨在全面提升您的工作效率和体验:全新的多会话模式,大幅强化的Prompt模板,便捷的群聊功能,智能工单旅程和审批单动态记录的深度优化&…

RAW 编程接口 TCP 简介

一、LWIP 中 中 RAW API 编程接口中与 TCP 相关的函数 二、LWIP TCP RAW API 函数 三、LwIP_Periodic_Handle函数 LwIP_Periodic_Handle 函数是一个必须被无限循环调用的 LwIP支持函数,一般在 main函数的无限循环中调用,主要功能是为 LwIP各个模块提供…