# AIエージェント開発の意思決定ポイント
🎯 **ポイント**
LLMプロバイダの429エラー、5回リトライしていませんか?ネットワークリトライは「保険」のように見えて、やりすぎるとコスト6倍・二重決済・リトライストームという地雷原に変わります。従来のWebサービスとは異なり、LLM呼び出しの1回あたりのコストが高いからこそ、リトライ戦略は慎重に設計する必要があります。
📋 **概要**
ネットワーク/5xxリトライは、一時的な障害(429 Too Many Requests、5xxサーバーエラー、タイムアウト、DNS解決失敗など)に対して同じリクエストを再送する回数と間隔を制御するダイヤルです。対象は「同じリクエストをそのまま送り直せば成功する見込みがある」エラーのみ。スキーマ不適合や低品質出力のようなコンテンツ起因のエラーは自己修正リトライという別の仕組みで扱います。この2つを混同すると、リトライ戦略が根本から崩壊します。
🔍 **意思決定のポイント**
このダイヤルは2つの駆動変数で決めます。
🔹 **失敗コスト(failure_cost)** — 失敗コストが高い環境ではリトライ回数を少なく(2回程度)し、早めにサーキットブレーカへ移行します。誤ったリトライによる二重実行のリスクの方が、リトライしないことによる失敗よりも深刻だからです。
🔹 **コスト感度(cost_sensitivity)** — LLM呼び出しのリトライは1回あたり数千トークンを消費します。5回リトライすればコストは6倍。コスト感度が高い場合はリトライ回数を下限寄りに設定します。
最も重要な判断は**冪等性の確認**です。読取操作のリトライは安全ですが、決済・データ更新・メール送信などの副作用を伴う書込操作を冪等キー無しでリトライすると二重実行が発生します。操作のリトライ可否はツール定義時に静的に決めておくべきで、LLMに判断させてはいけません。
💡 **要点と詳細**
基本方針は**指数バックオフ+ジッタ**です。リトライ間隔を1秒→2秒→4秒と指数的に増やし、ジッタ(乱数による揺らぎ)を加えます。ジッタにより複数クライアントのリトライタイミングが分散し、リトライストームを防ぎます。
📊 目安値:
- リトライ回数: 2〜4回
- 初回バックオフ: 1〜2秒(429の場合はRetry-Afterヘッダを優先)
- バックオフ上限: 30〜60秒(これ以上待つなら縮退に移行)
- ジッタ: フルジッタ(0〜バックオフ値の乱数)
- 非冪等書込のリトライ: 冪等キー無しでは**禁止**
429応答にRetry-Afterヘッダが含まれる場合は、自前のバックオフ計算より優先しましょう。プロバイダの指示を無視するとさらに厳しいレート制限を受けるリスクがあります。
リトライ上限に達したらサーキットブレーカを開き、縮退ラダー(軽量モデルへのフォールバック、キャッシュ応答、静的フォールバック)に移行します。
⚖️ **トレードオフ**
📉 リトライが少なすぎると — プロバイダの429は数秒待てば解消されることが多いのに、即座にエラーを返してしまいます。ネットワークの瞬断で数十秒かけたLLM推論結果が無駄になり、本来リトライ1〜2回で回復する軽微な障害がセッション全体の失敗に連鎖します。
📈 リトライが多すぎると — コスト増幅に加え、複数エージェントが同時にリトライするリトライストームでプロバイダへの負荷が雪だるま式に増大し、障害を悪化させます。レイテンシも分単位に膨張。最も危険なのは非冪等操作の二重実行です。
🛠️ **ユースケース**
🔄 **LLMプロバイダの429** — 最も頻繁に遭遇するケース。Retry-Afterヘッダを最優先で使い、2〜3回のリトライで回復しなければサーキットブレーカを開いて別プロバイダへフォールバック。
🖥️ **一時的な502/503/504エラー** — 初回バックオフ1〜2秒、最大3回リトライ。3回失敗したら15〜60秒の遮断期間を設け、Half-Open状態で1リクエスト試行して復帰判定。
💳 **決済APIへの書込** — 冪等キー付きならリトライ可。冪等キー無しなら**リトライ禁止**。代わりに状態確認API(GET)で完了状態を確認し、未完了なら再実行します。
🌐 **複数プロバイダ構成** — 1回目は同一プロバイダに再送(一時的障害の高速回復)、2回目以降は別プロバイダにフォールバック。プロバイダごとに独立したサーキットブレーカを設置するのが鉄則です。
リトライ発生率の監視も忘れずに。急上昇はプロバイダ障害か自システムの負荷超過の兆候です。
#
AIエージェント# #
ソフトウェアアーキテクチャ#