OpenAI API接口请求速率限制
速率限制以五种方式衡量:RPM(每分钟请求数)、RPD(每天请求数)、TPM(每分钟令牌数)、TPD(每天令牌数)和IPM(每分钟图像数)。
任何选项都可能会达到速率限制,具体取决于首先发生的情况。例如,向 ChatCompletions 端点发送仅包含 100 个令牌的 20 个请求,这将达到限制(如果RPM 为 20),即使在这 20 个请求中没有发送 150k 令牌(如果TPM 限制为 150k) 。
其他值得注意的重要事项:
- 速率限制是在组织级别而不是用户级别施加的。
- 速率限制因所使用的模型而异。
- 组织每月可以在 API 上花费的总金额也受到限制。这些也称为“使用限制”。
解决方法
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</