0Pricing
AI Agents · レッスン

指数バックオフによる再試行

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. べき等なツールと副作用
  2. 指数バックオフによる再試行
  3. タイムアウトとサーキットブレーカー
  4. ツール出力の検証(Pydantic)
← AI Agentsに戻る