指数バックオフによる再試行
tenacityを使い、指数関数的に増加する待機時間とジッターを設定して一時的な失敗を再試行します。
「指数バックオフによる再試行」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。
なぜリトライするのか
外部呼び出し(LLM、検索API、ベクトルDB)は一時的に失敗することがあります。単純なリトライを行えば、ユーザーに気付かせることなく、ほとんどの一時的な失敗から復旧できます。
してはいけないこと
タイトなループ内で即座にリトライしてはいけません。サービスに過剰な負荷をかけ、レートリミッターによってアクセスを拒否されます。
# BAD
for _ in range(10):
try:
return call_api()
except Exception:
pass指数バックオフ
失敗するたびに待ち時間を長くします。2の指数を使うのが一般的です。
import time
def call_with_backoff(fn, attempts=5):
for i in range(attempts):
try:
return fn()
except TransientError:
if i == attempts - 1:
raise
time.sleep(2 ** i) # 1, 2, 4, 8, 16 secondsジッターを追加
ジッターがないと、多数のクライアントからのリトライが同時に発生し、トラフィックが集中します。ランダムなずれを追加します。
import random
sleep = (2 ** i) + random.uniform(0, 1)
time.sleep(sleep)Tenacityを使用
tenacityライブラリがこの処理を実装してくれます。
from tenacity import retry, wait_exponential_jitter, stop_after_attempt, retry_if_exception_type
import requests
@retry(
wait=wait_exponential_jitter(initial=1, max=30),
stop=stop_after_attempt(5),
retry=retry_if_exception_type((requests.Timeout, requests.ConnectionError))
)
def search(query):
return requests.get('https://api.tavily.com/search', timeout=10).json()一時的なエラーだけをリトライ
次のエラーでは、決してリトライしません。
- 4xxエラー(不正なリクエスト。リトライしても解決しません)
- 認証の失敗
- バリデーションエラー
次のエラーではリトライします。
- タイムアウト
- 5xxサーバーエラー
- レート制限(より長く待機します)
レート制限を考慮したリトライ
Retry-Afterヘッダーに従います。
if response.status_code == 429:
wait = int(response.headers.get('Retry-After', 5))
time.sleep(wait)
continueリトライの合計時間に上限を設定
リトライにかけられる合計時間に上限を設定します。通常、ユーザー向けの呼び出しでは30〜60秒です。
from tenacity import stop_after_delay
@retry(
wait=wait_exponential_jitter(initial=1, max=10),
stop=stop_after_delay(60)
)
def call_api():
...冪等性ヘッダー
冪等でないAPI(Stripeなど)では、重複した処理をまとめられるよう、すべてのリトライに冪等性キーを含めます。
headers = {'Idempotency-Key': f'agent-call-{run_id}-{tool_id}'}LLM呼び出しもリトライ
OpenAIとAnthropicのSDKは、1〜2回の自動リトライを行います。設定を変更できます。
client = OpenAI(max_retries=5, timeout=30.0)非同期リトライ
非同期コードでは、次のようにします。
from tenacity import AsyncRetrying
async for attempt in AsyncRetrying(wait=wait_exponential_jitter(), stop=stop_after_attempt(5)):
with attempt:
result = await call_api()リトライをログに記録
すべてのリトライで、試行回数、スリープ時間、エラーの理由をログに記録します。そうしないと、「なぜこんなに遅いのか」をデバッグできません。
リトライとタイムアウト
各試行には短いタイムアウト(例:10秒)を設定し、stop_after_delayによって合計時間にも上限(例:60秒)を設定します。両方がないと、接続が停止したまま永久に処理がハングする可能性があります。
なぜジッターを使うのか
リトライの遅延にランダムなジッターを追加するのはなぜですか。
まとめ
指数バックオフ、ジッター、合計時間の上限、一時的なエラーだけへのリトライを組み合わせます。定型処理を省くにはtenacityを使用します。
よくある質問
「指数バックオフによる再試行」レッスンは無料ですか?
はい。「指数バックオフによる再試行」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。
「指数バックオフによる再試行」で何を学びますか?
tenacityを使い、指数関数的に増加する待機時間とジッターを設定して一時的な失敗を再試行します。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Agentsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「指数バックオフによる再試行」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Agentsレッスンでコードを書いて実行できますか?
はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- べき等なツールと副作用
- 指数バックオフによる再試行
- タイムアウトとサーキットブレーカー
- ツール出力の検証(Pydantic)