アプリがOpenAIのレート制限にどう対処するかをテストする

概要
目標: アプリが OpenAI のレート制限と過負荷エラーをどのように処理するかをテストする
時間: 10 分
Plugins:GenericRandomErrorPlugin、 RetryAfterPlugin
前提条件:開発プロキシを設定する

アプリは開発中には動作するのに、429 Too Many Requestsが原因で本番環境では失敗します。 OpenAI のレート制限は、組織の使用状況レベル、モデル、および同じ組織を使用している他のすべてのユーザーによって異なります。そのため、意図的に確実に上限に達することはできません。 Dev Proxy は OpenAI API が返すのと同じエラーを返します。そのため、ユーザーより先に、アプリがどのように動作するかを確認できます。

OpenAI が返す内容を理解する

すべてのOpenAIエラーが「再試行してください」を意味するわけではありません。 アプリでは、それらを区別する必要があります。

Status error.code 意味 アプリで実行する必要がある操作
429 rate_limit_exceeded 1 分あたりのリクエスト数 (RPM) または 1 分あたりのトークン数 (TPM) の制限に達しました。 Retry-After ヘッダーの時刻まで待ってから、再試行します。
429 slow_down 上限内であっても、リクエストレートの増加が急激すぎます。 Retry-Afterを待って、要求レートを下げ、徐々に上げます。
429 credit_balance_exhausted 組織の前払いクレジットが残っていません。 再試行しないでください。 再試行してもアクセスは回復しません。 ユーザーに通知するか、管理者に通知します。
503 server_is_overloaded 現時点では、モデルには十分な処理能力がありません。 Retry-Afterが存在する場合は待ってから、遅延を増やして再試行してください。

完全な一覧については、OpenAI ドキュメントの エラー コード を参照してください。

Important

429 行の 3 つのエラーはすべて、同じ状態コードを使用します。 アプリがすべての 429 応答で再試行すると、回復しない課金エラーを再試行し続けます。 error.codeを確認して、何を行うかを決定してください。

OpenAI SDK でできることを知る

Python および JavaScript 用の公式 OpenAI SDK は、既定では、指数バックオフを使用して、408、409、429、5xx 応答、および接続エラーを 2 回再試行します。 これは、Python では maxRetries オプション、JavaScript では max_retries で変更できます。

SDK の再試行では、短時間のバーストに対応します。 再試行回数を使い切ったときに何が起こるか、再試行しても解決しないエラーを処理する方法をアプリで決定する必要があります。 Pythonでは、429 がRateLimitErrorを発生させ、503 がInternalServerErrorを発生させるので、両方に対処してください。

Tip

エラー処理コードが受け取る内容を正確に確認するには、テスト中に max_retries=0 (Python) または maxRetries: 0 (JavaScript) を設定してください。 後で SDK の再試行をオンに戻してください。

OpenAI レート制限をシミュレートする

Dev Proxy には、表にある OpenAI エラー用のプリセットがあります。 これをダウンロード:

devproxy config get openai-throttling

プリセットを使用して Dev Proxy を起動します:

devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"

プリセットは、テーブル内のランダムなエラーで https://api.openai.com/* への要求の90%が失敗します。 スロットリング応答では、Retry-After ヘッダーを設定し、RetryAfterPlugin を使用して、アプリが API を再度呼び出す前に、その時間だけ待機することを確認します。

アプリが Dev Proxy 経由で要求を送信し、Dev Proxy 証明書を信頼していることを確認してください。 Node.jsについては、「Use Dev Proxy with Node.js applications」を参照してください。 その他のランタイムについては、「 開発プロキシのトラブルシューティング」を参照してください。

アプリを実行し、次のことを確認してください:

  • rate_limit_exceededまたはslow_downエラーが発生した後、アプリはRetry-After時間待機します。 API の呼び出しが早すぎる場合は、Dev Proxy によって報告され、要求が制限されます。
  • credit_balance_exhausted エラーが発生すると、アプリは API の呼び出しを停止し、明確なメッセージを表示します。
  • server_is_overloaded エラーが発生した後、アプリは遅延を伴って再試行し、再試行回数を使い果たしたら、スタック トレースの代わりにフォールバックするか、クリア メッセージを表示します。
  • アプリで作業が失われることはありません。 たとえば、長いチャット会話やバッチ ジョブは、エラーの後も続行されます。

要求が失敗する頻度を変更するには、--failure-rate オプションを使用してください。 たとえば、すべてのリクエストを失敗させるには:

devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json" --failure-rate 100

Azure OpenAI およびその他のプロバイダーのトークン制限をシミュレートする

プリセットは、アプリが使用するトークンの数に関係なく、ランダムにエラーを返します。 実際のトークンの使用に基づいて要求を調整する (たとえば、長い会話が TPM の制限を超えたときに何が起こるかを確認する) には、 LanguageModelRateLimitingPlugin を使用します。 Azure OpenAI モデルやローカル モデルなど、OpenAI と互換性のある API で動作します。 詳細については、「テスト言語モデルのトークン制限」を参照してください。

次のステップ

トークンベースの制限をシミュレートする方法について説明します。

参照