本文介绍了OpenAI 的速率限制机制和处理速率限制错误的技巧。文章解释了速率限制的作用,以及通过限制请求次数和防止滥用或误用API来保护API和其用户的可靠操作。同时,本文还提供了示例脚本来限制并行请求以避免速率限制错误。
当您反复调用 OpenAI API 时,您可能会遇到错误消息 429:’‘ 或 。 这些错误消息来自超出 API 的速率限制。
本指南分享了避免和处理速率限制错误的技巧。
要查看用于限制并行请求以避免速率限制错误的示例脚本,请参阅 api_request_parallel_processor.py。
速率限制是 API 的常见做法,它们的实施有几个不同的原因。
首先,它们有助于防止滥用或误用 API。 例如,恶意行为者可能会向 API 发送大量请求,以试图使其过载或导致服务中断。 通过设置速率限制,OpenAI 可以防止此类活动。
其次,速率限制有助于确保每个人都能公平地访问 API。 如果一个人或组织发出过多的请求,可能会使其他人的 API 陷入困境。 通过限制单个用户可以发出的请求数量,OpenAI 确保每个人都有机会使用 API 而不会遇到速度下降的情况。
最后,速率限制可以帮助 OpenAI 管理其基础设施上的聚合负载。 如果对 API 的请求急剧增加,可能会对服务器造成负担并导致性能问题。 通过设置速率限制,OpenAI 可以帮助为所有用户保持流畅和一致的体验。
尽管达到速率限制可能令人沮丧,但速率限制的存在是为了保护 API 对其用户的可靠操作。
截至 2023 年 1 月,违约率限制为:
在这些其他资源中阅读有关 OpenAI 速率限制的更多信息:
如果您希望提高组织的速率限制,请填写以下表格:OpenAI 速率限制增加申请表
API请求发送过快会出现限速错误。 如果使用 OpenAI Python 库,它们将类似于:
翻译内容如下:
下面是触发速率限制错误的示例代码:
避免速率限制错误的一种简单方法是自动重试具有随机指数回退的请求。使用指数回退重试意味着在遇到速率限制错误时执行短暂的休眠,然后重试不成功的请求。如果请求仍然不成功,则增加休眠时间并重复该过程。这将持续到请求成功或达到最大重试次数为止。
这种方法有许多好处:
请注意,不成功的请求会贡献到您每分钟的限制,因此不断重新发送请求是无效的。
以下是一些示例解决方案。
Tenacity是一个Apache 2.0许可的通用重试库,用Python编写,可简化将重试行为添加到几乎任何内容的任务。
要为您的请求添加指数回退,您可以使用装饰器。以下示例使用函数向请求添加随机指数回退。
请注意,Tenacity库是第三方工具,OpenAI不保证其可靠性或安全性。
另一个提供用于backoff和重试的函数装饰器的库是backoff。
与Tenacity一样,backoff库是第三方工具,OpenAI对其可靠性或安全性不做任何保证。
如果您不想使用第三方库,可以实现自己的退避逻辑。
如果您正在处理来自用户的实时请求,则退避和重试是一种很好的策略,可以最小化延迟,同时避免速率限制错误。
但是,如果您正在处理大量批处理数据,其中吞吐量比延迟更重要,除了退避和重试之外,您还可以做一些其他事情。
如果您不断触发速率限制,然后退避,然后再次触发速率限制,然后再次退避,则可能会浪费您的请求预算的一大部分来重试请求。这会限制您在固定速率限制下的处理吞吐量。
在这里,一种潜在的解决方案是计算您的速率限制,并为每个请求添加等于其倒数(例如,如果您的速率限制为每分钟20个请求,则为每个请求添加3-6秒的延迟)。这可以帮助您在不触发速率限制并遭受浪费请求的情况下操作接近速率限制上限。
翻译成中文:
如果您正在处理来自用户的实时请求,则退避和重试是一种很好的策略,可以最小化延迟,同时避免速率限制错误。
但是,如果您正在处理大量批处理数据,其中吞吐量比延迟更重要,除了退避和重试之外,您还可以做一些其他事情。
如果您不断触发速率限制,然后退避,然后再次触发速率限制,然后再次退避,则可能会浪费您的请求预算的一大部分来重试请求。这会限制您在固定速率限制下的处理吞吐量。
在这里,一种潜在的解决方案是计算您的速率限制,并为每个请求添加等于其倒数(例如,如果您的速率限制为每分钟20个请求,则为每个请求添加3-6秒的延迟)。这可以帮助您在不触发速率限制并遭受浪费请求的情况下操作接近速率限制上限。
如果您正在处理大量批处理数据,其中吞吐量比延迟更重要,那么可以主动在请求之间添加延迟。计算您的速率限制,并为每个请求添加等于其倒数的延迟,这可以帮助您在不触发速率限制并遭受浪费请求的情况下操作接近速率限制上限。
OpenAI API 对每分钟的请求和每分钟的令牌有单独的限制。
如果您每分钟的请求达到了限制,但令牌每分钟有头空间,您可以通过将多个任务批量处理到每个请求中来提高吞吐量。 这将允许您每分钟处理更多令牌,特别是对于较小的模型。
将一批提示发送到API调用的方式与正常API调用完全相同,只是将一个字符串列表传递给参数而不是单个字符串。
我们为并行处理大量API请求编写了一个示例脚本:api_request_parallel_processor.py。
该脚本结合了一些方便的功能:
欢迎按原样使用或修改以适应您的需求。