← PC・IT用語集へ戻る

レート制限

Rate Limit
APIが、一定時間に受け付けるリクエスト数やトークン数に設ける上限。
レート制限 (Rate Limit)

概要(サマリー)

レート制限とは、APIが一定時間に受け付ける回数や量へ設ける上限である。生成AIのAPIでは、1分あたりのリクエスト数(RPM)と、1分あたりのトークン数(TPM)のように、複数の基準が並ぶことが多い。

窓口の整理券に似ている。1枚の依頼が長くても短くても、枚数が上限ならそれ以上は並ばせない。枚数は空いていても、トークンの合計が先に上限へ達すれば、同じように止まる。

上限は提供者、モデル、契約で違う。超えると、多くのAPIはステータスコード429を返す。しばらく待ってから送り直す対象と、支払いの確認が必要な対象は、番号だけでは区別できない。

詳細解説

なぜ上限があるのか

OpenAIは、レート制限の理由を3つ説明している。乱用でサービスを詰まらせないこと、一部の利用者だけで容量を占有しないこと、設備全体の負荷を急増させないことである。

生成AIに限らない。地図、天気、決済のAPIでも、同じ考え方の上限がある。無料枠で試していると、少ない回数で先に当たる。

どの数字が先に当たるか

基準は一つではない。OpenAIの例では、RPM、1日あたりのリクエスト数、TPM、1日あたりのトークン数、画像なら1分あたりの枚数などが並ぶ。どれか一つに達した時点で、その期間の追加は拒否される。

20リクエストがRPMの上限なら、各リクエストが短いトークンでも20回で止まる。逆に、回数は残っていても、長い入力を連続で送るとTPMが先に尽きる。

モデルごとに上限が違い、複数モデルで枠を共有することもある。アカウント画面の数字を、別のモデルへ流用しない。

OpenAIでは、上限は組織とプロジェクトに付く。アプリのエンドユーザー一人ずつには、自動では付かない。自分のアプリが多くの人で同じAPIキーを使うなら、利用者ごとの上限はこちらで設ける。そうしないと、一人の連打で全員分の枠が消える。

429でも、待って直るとは限らない

一時的な回数超過は、429の rate_limit_error で返ることがある。応答に Retry-After があれば、そこに書かれた秒数は待つ下限である。その秒数より早く送り直さない。複数の処理が同じ秒に再送しないよう、少しだけランダムな待ちも足す。

待っても直らない429がある。月間の利用上限や、自分で設定した支出のハード上限に達した場合である。この場合は待つのではなく、契約、残高、上限設定を確認する。

モデル側の混雑は、429ではなく503のことがある。OpenAIは、急な増加を429、モデルの過負荷を503と分けている。番号と、本文のエラーコードの両方を見る。

失敗したリクエストも、その1分間の回数に数えられることがある。失敗のたびにすぐに再送すると、枠をさらに消費する。

再送の伸ばし方

公式の案内は、指数バックオフである。短い待ちから始め、失敗のたびに待ちを長くし、回数と合計時間に上限を付ける。

次は考え方を示す擬似コードである。call_api() や result の項目名は、使うSDKに合わせて読み替える。

delay_seconds = 1
for attempt in range(5):
    result = call_api()
    if result.ok:
        break
    if not result.retryable:
        raise RuntimeError("支払い上限や認証の問題。再送せず設定を確認する")
    wait = max(delay_seconds, result.retry_after_seconds or 0)
    time.sleep(wait + random.uniform(0, 1))
    delay_seconds = min(delay_seconds * 2, 60)

retryable は、一時的な429や503のように、待てば通る可能性があるエラーかどうかの判定である。Retry-After があればその秒数以上待ち、random.uniform で少しずらす。

SDKがすでに再送しているなら、アプリ側の再送と二重にしない。再送の段数が掛け算になると、1回の操作が何十回ものリクエストになる。

すぐ応答が要らない大量処理は、同期APIのRPMを消費しないバッチAPIが用意されていることがある。会話の返答のように待たせる処理とは分ける。

コンテキストウィンドウとの違い

コンテキストウィンドウは、1回の依頼に載せられる量である。レート制限は、時間あたりに何回、合計どれだけのトークンを送れるかである。

1回は窓に収まっていても、連続して送ればレート制限に当たる。逆に、1回の入力が長すぎて窓を超えるエラーは、回数を空けても同じ入力のままでは成功しない。

AIコーディングとの関係

エージェントがファイルを読むたびにAPIを呼ぶと、RPMをまとめて使う。短い修正のつもりが、探索の往復で429になる。

AIに再送処理を書かせるときは、429を一律で再送しないよう指定する。Retry-After を尊重すること、支出上限や認証エラーは止めること、再送回数の上限を書くことを依頼に含める。

自分用のスクリプトでも、ループの中で待たずに投げない。失敗ログを見ずに再実行すると、同じ分間の枠を自分で埋め続ける。

よくある勘違い

1回の文章が長すぎるエラーと同じ?

別である。長い入力が1回の窓に入らない問題と、時間あたりの回数や合計トークンの上限は、メッセージも対処も違う。

429なら待てば必ず通る?

一時的な上限なら、指定された秒数のあとで通ることがある。残高や月間上限が原因の429は、待っても解消しない。

APIキーを分ければ、エンドユーザーごとの制限になる?

提供者の上限は、組織やプロジェクトに付くことがある。利用者ごとの公平さは、アプリ側で回数を数えないと実現しない。

失敗したリクエストは回数に入らない?

入ることがある。すぐに連打すると、成功しないまま枠だけが減る。

まとめ

  • レート制限は、一定時間あたりのリクエスト数やトークン数の上限である
  • 複数の基準があり、どれか一つに達した時点で追加の依頼が拒否される
  • 一時的な超過は429と Retry-After で待つのが基本である
  • 支払い上限や認証エラーは、再送では解消しない
  • 1回の依頼に載せられる量の上限とは別の制限である

情報ソース

より詳しくAIに聞いてみよう

  • レート制限を、窓口の整理券のたとえで説明してください。
  • RPMとTPMの違いを、短いリクエストを大量に送る例で教えてください。
  • 429と503の違いを、待ってよい場合と確認が必要な場合に分けてください。
  • 1回に載せられる量の上限と、時間あたりの回数の上限を、混同しない説明にしてください。
  • AIに、Retry-Afterを尊重し、再送は最大3回で止める処理の条件を書かせてください。