速率限制 Rate limits

速率限制是 API 对用户或客户端在指定时间段内可以访问服务器的次数施加的限制。

概述

什么是速率限制?

速率限制是 API 对用户或客户端在指定时间段内可以访问服务器的次数施加的限制。

为什么我们有速率限制?

速率限制是 API 的常见做法,它们的实施有几个不同的原因:

  • 它们有助于防止滥用或误用 API。 例如,恶意行为者可能会向 API 发送大量请求,以试图使其过载或导致服务中断。 通过设置速率限制,OpenAI 可以防止此类活动。
  • 速率限制有助于确保每个人都能公平地访问 API。 如果一个人或组织发出过多的请求,可能会使其他所有人的 API 陷入困境。 通过限制单个用户可以发出的请求数量,OpenAI 确保大多数人有机会使用 API 而不会遇到速度下降的情况。
  • 速率限制可以帮助 OpenAI 管理其基础设施上的聚合负载。 如果对 API 的请求急剧增加,它可能会对服务器造成负担并导致性能问题。 通过设置速率限制,OpenAI 可以帮助为所有用户保持流畅和一致的体验。

请完整阅读本文档,以更好地了解 OpenAI 的速率限制系统的工作原理。 我们包括代码示例和可能的解决方案来处理常见问题。 建议在填写 提高速率限制申请表 之前遵循此指南,其中包含有关如何填写的详细信息 最后一节。

我们 API 的速率限制是多少?

我们根据使用的特定端点以及您拥有的帐户类型,在 组织级别 而不是用户级别实施速率限制。 速率限制以两种方式衡量:RPM(每分钟请求数)和TPM(每分钟令牌数)。 下表突出显示了我们 API 的默认速率限制,但在填写速率限制增加请求表后,可以根据您的用例增加这些限制。

TPM(每分钟令牌数)单位因型号而异:

type1 TPM equals
davinci每分钟 1 个令牌
curie每分钟 25 个令牌
babbage每分钟 100 个令牌
ada每分钟 200 个令牌

In practical terms, this means you can send approximately 200x more tokens per minute to an ada model versus a davinci model.

Text & EmbeddingChatCodexEditImageAudio
Free trial users20 RPM
150,000 TPM
20 RPM
40,000 TPM
20 RPM
40,000 TPM
20 RPM
150,000 TPM
50 images / min50 RPM
Pay-as-you-go users (first 48 hours)60 RPM 250,000 TPM60 RPM 60,000 TPM20 RPM 40,000 TPM20 RPM 150,000 TPM50 images / min50 RPM
Pay-as-you-go users (after 48 hours)3,500 RPM
350,000 TPM
3,500 RPM
90,000 TPM
20 RPM
40,000 TPM
20 RPM
150,000 TPM
50 images / min50 RPM

重要的是要注意,根据首先发生的情况,任一选项都可能达到速率限制。 例如,您可能会向 Codex 端点发送仅包含 100 个令牌的 20 个请求,这将达到您的限制,即使您没有在这 20 个请求中发送 40k 个令牌。

GPT-4 rate limits

在 GPT-4 推出期间,该模型将有更严格的速率限制以满足需求。 gpt-4/gpt-4-0314 的默认速率限制为 40k TPM 和 200 RPM。 gpt-4-32k/gpt-4-32k-0314 的默认速率限制为 80k PRM 和 400 RPM。 联系我们请求提高速率限制 或订购专用容量; 请注意,我们可能无法方便地满足所有请求。

速率限制如何工作?

如果您的速率限制是每分钟 60 个请求和每分钟 150k davinci 令牌,您将受到限制,要么达到请求/分钟上限,要么用完令牌——以先发生者为准。 例如,如果您的最大请求数/分钟为 60,则您应该能够每秒发送 1 个请求。 如果您每 800 毫秒发送 1 个请求,一旦达到速率限制,您只需让程序休眠 200 毫秒即可再发送一个请求,否则后续请求将失败。 默认值为 3,000 个请求/分钟,客户可以有效地每 20 毫秒或每 .02 秒发送 1 个请求。

如果我遇到速率限制错误会怎样?

速率限制错误如下所示:

已达到组织 org-{id} 中 default-text-davinci-002 每分钟请求的速率限制。 限制:20.000000/分钟。 电流:24.000000/分钟。

如果您达到速率限制,这意味着您在短时间内发出了太多请求,并且 API 将拒绝满足进一步的请求,直到经过指定的时间量。

速率限制与 max_tokens

每个 我们提供的模型 都有有限数量的令牌,可以在发出请求时作为输入传递。 您不能增加模型接收的最大令牌数。例如,如果您使用的是“text-ada-001”,则可以向该模型发送的最大令牌数是每个请求 2,048 个令牌。

错误缓解

我可以采取哪些措施来缓解这种情况?

OpenAI Cookbook 有一个 python notebook 详细解释了如何避免速率限制错误。

在提供编程访问、批量处理功能和自动社交媒体发布时,您还应该谨慎行事 - 考虑只为受信任的客户启用这些功能。

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

重试指数退避

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

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

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

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

示例 #1:使用 Tenacity 库
详情
示例 #2:使用backoff库
详情
示例 #3:实现手动backoff
详情

批处理请求

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

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

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

py
不用批处理
py
import openai

num_stories = 10
prompt = "Once upon a time,"

# serial example, with one story completion per request
for _ in range(num_stories):
    response = openai.Completion.create(
        model="curie",
        prompt=prompt,
        max_tokens=20,
    )
    # print story
    print(prompt + response.choices[0].text)

响应对象可能不会按提示的顺序返回完成,因此请始终记住使用索引字段将响应匹配回提示。

请求增加

我什么时候应该考虑申请提高利率限制?

我们的默认速率限制帮助我们最大限度地提高稳定性并防止滥用我们的 API。 我们增加限制以启用高流量应用程序,因此申请提高速率限制的最佳时间是当您认为您拥有必要的流量数据来支持提高速率限制的有力案例时。 没有支持数据的大型速率限制增加请求不太可能获得批准。 如果您正在为产品发布做准备,请通过10天以上的阶段性发布获取相关数据。

请记住,速率限制的增加有时可能需要 7-10 天,因此如果有数据支持您将达到您当前的增长数字,那么尝试提前计划并尽早提交是有意义的。

我的速率限制提高请求会被拒绝吗?

速率限制增加请求通常被拒绝,因为它缺乏证明增加的合理性所需的数据。 我们在下面提供了数字示例,展示了如何最好地支持提高速率限制的请求,并尽力批准符合我们的安全政策并显示支持数据的所有请求。 我们致力于使开发人员能够扩展我们的 API 并取得成功。

我已经为我的文本/代码 API 实现了指数退避,但我仍然遇到这个错误。 如何提高速率限制?

目前,我们不支持增加我们的免费测试端点,例如编辑端点。 我们也不会提高 ChatGPT 速率限制,但您可以加入 ChatGPT 专业访问权限 的候补名单。

我们理解有限的速率限制可能导致的挫败感,我们很乐意为每个人提高默认值。 但是,由于共享容量限制,我们只能批准通过我们的速率限制增加请求表证明有需求的付费客户增加速率限制 -PrE2LaHw/视图)。 为了帮助我们正确评估您的需求,我们要求您在表格的“分享需求证据”部分提供您当前使用情况的统计数据或基于历史用户活动的预测。 如果此信息不可用,我们建议采用分阶段发布方法。 首先按照您当前的速率限制向部分用户发布服务,收集 10 个工作日的使用数据,然后根据该数据提交正式的速率限制提高请求,以供我们审核和批准。

我们将审核您的请求,如果获得批准,我们将在 7-10 个工作日内通知您批准情况。

以下是您可以如何填写此表格的一些示例:

DALL-E API 示例
详情
语言模型示例
详情
代码模型示例
详情

请注意,这些示例只是一般用例场景,实际使用率会因具体实施和使用情况而异。