マガジン

AIエージェントが失敗したら止める:リトライ上限と異常時の停止ルールの決め方

AIを使いこなす

Claudeで執筆し、GPTで自動校閲・修正しています。

手書きの停止条件表で回数・時間・影響を確認し、停止報告メモを整える手元
記事の内容をもとに制作したAI生成イメージです。実際の製品画面や検証結果の写真ではありません。

結論から言うと、停止ルールは「回数」「時間」「影響」の三つを、作業を任せる前に表で決めておけば足ります。回数は同じ失敗を何度まで許すか、時間は何分・いくらまで使うか、影響は何に触れたら必ず人に戻すかです。三つのうちどれか一つでも当てはまれば止め、止まったときは決まった書式で人に報告させます。 この記事では、書き込める停止条件の表と、止まったときの報告書式を用意しました。数値は説明用の例です。実測から導いた推奨値ではないので、自分の作業に合わせて書き換えてください。

この記事の目次
  1. 「止める」は二段構えにする
  2. 回数:同じ失敗を何度まで許すか
  3. 時間:いつまで、いくらまで使うか
  4. 影響:何に触れたら必ず人に戻すか
  5. 停止条件を書き込む表
  6. 止まったときに人へ渡す報告の書式
  7. AIに渡す依頼文

「止める」は二段構えにする

AIへの指示文に「3回失敗したらやめて」と書くだけでは不十分です。指示は守られない可能性があり、守られたかどうかを外から確かめにくいからです。止め方は次の二段で考えます。

  • 仕組みで止める:ツールやSDKの上限設定、権限の制限、承認待ち。AIの判断に関係なく効きます。
  • AIに自分で止めさせる:依頼文に書く停止条件と報告義務。上限に達する前に、状況を整理して引き返すために使います。

仕組み側で使える機能は、使う製品によって違います。たとえばClaude Agent SDKでは、max_turns(maxTurns)でエージェントのターン数、max_budget_usd(maxBudgetUsd)で推定支出の上限を指定でき、どちらも初期値は無制限です。ターン数にはツール呼び出しのあるターンに加え、最後のテキスト応答のターンも数えます。上限に達すると、結果のsubtypeがerror_max_turnsまたはerror_max_budget_usdで返ります(Claude Agent SDK: How the agent loop works)。OpenAI Agents SDKの実行結果では、承認待ちなどの中断はinterruptionsと再開可能な状態として返り、ツールエラーなどは例外として扱われます(OpenAI: Running agents)。

使っている製品に上限の設定がない場合は、上限付きの実行環境を自分で用意するか、AIに任せる範囲そのものを狭めます。

回数:同じ失敗を何度まで許すか

ここで決めるのは、全体の往復回数ではなく「同じ失敗」の許容回数です。往復回数の上限は暴走の最後の安全網にすぎません。

前述のとおり、Claude Agent SDKのmax_turnsはツール呼び出しのあるターンだけでなく、最後のテキスト応答のターンも数えますが、「同じエラーの再試行」を直接数えるものではありません。そこで、次の二つを分けて決めます。

  1. 同一エラーの上限:同じエラー文、または同じ操作の失敗を何回まで許すか。依頼文で指定します。
  2. 全体の往復上限:どんな理由でも、これを超えたら止める数。SDKなどの設定で指定します。

同一エラーの上限は小さめにするのが基本です。同じ手で2回失敗したのに3回目で成功する場面より、原因が別にあって何度やっても変わらない場面のほうが多いからです。ただし、通信の一時的な失敗は、間隔を空ければ直ることがあります。再試行する場合は、同じ操作を即座に繰り返さず、間隔を空けるか、手を変えるかを決めておきます。

時間:いつまで、いくらまで使うか

時間は二種類あります。実際に経過した時間と、使った費用です。

  • 経過時間:AIは「時間が来た」ことを自分では感じにくいので、実行する側(スクリプトや運用ツール)が計測して止めます。Claude Codeを非対話で動かすclaude -pでは、SIGTERMで止めると終了コード143になり、途中のターンは未完のまま結果が記録されません。途中経過を残したいときは、先にSIGINTを送るかSDKのinterrupt()を使います(Claude Code: Run Claude Code programmatically)。
  • 費用:max_budget_usdのような上限を設定します。ただし、上限の判定はモデルの応答が届いたあとに行われるため、上限に達した応答の費用と、停止までに動作中のサブエージェントが使う費用分だけ超えることがあります。余裕を見て設定してください(前掲のagent loopのページ)。

影響:何に触れたら必ず人に戻すか

回数と時間が「どれだけ試したか」の基準なのに対し、影響は「何が起きうるか」の基準です。一回の失敗でも、取り消せない操作なら止めるべきです。

OWASPのLLMリスク「Excessive Agency(過剰な主体性)」でも、対策として権限を必要最小限に絞ること、重要な操作に人の承認を挟むこと、操作の頻度を制限すること、記録を残すことが挙げられています(OWASP GenAI: LLM06 Excessive Agency)。

影響の判断は、次の三段に分けると決めやすくなります。

  • 読むだけ、例:ファイルの閲覧、検索、失敗時の扱い:回数・時間の上限内で自動再試行
  • 戻せる変更、例:下書きの作成、作業用コピーの編集、失敗時の扱い:1回失敗したら状況を整理し、再試行は上限内
  • 戻せない・外に出る、例:削除、送信、公開、支払い、本番設定の変更、失敗時の扱い:失敗した時点で即停止し、人が判断

「戻せない・外に出る」操作は、失敗してから止めるのではなく、実行前の承認にします。OpenAI Agents SDKのドキュメントでは、承認が必要なツールは実行されずに中断として記録され、再開可能な状態から承認後に同じ実行を再開できると説明されています(OpenAI: Guardrails and human review)。権限がなくて拒否された操作も、無人実行ではAIに「再試行しないよう」伝える設計が有効です。Claude Codeの--permission-prompts noneは、承認する人がいない実行で、承認が必要な操作を拒否し、その操作を再試行しないようAIに伝える設定です(Claude Code: Run Claude Code programmatically)。

停止条件を書き込む表

作業ごとに、この表を埋めてから任せます。数値は説明用の例です。

  • 作業の目的と完了の定義、記入欄:、記入例(説明用):「テストが全部通る」まで
  • 同一エラーの上限、記入欄:回、記入例(説明用):2回目で手を変え、3回目で停止
  • 全体の往復上限、記入欄:回、記入例(説明用):30往復(設定で指定)
  • 経過時間の上限、記入欄:分、記入例(説明用):20分(実行側で計測)
  • 費用の上限、記入欄:金額、記入例(説明用):少額の固定額(超過分の余裕を見る)
  • 即停止する操作、記入欄:、記入例(説明用):削除、外部への送信、本番設定の変更
  • 触ってよい範囲、記入欄:、記入例(説明用):作業用フォルダ内のみ
  • 停止時の連絡先・渡し先、記入欄:、記入例(説明用):担当者名、報告の保存先
  • 再開の条件、記入欄:、記入例(説明用):人が原因を確認し、方針を書いたとき

止まったときに人へ渡す報告の書式

止まった理由が分からないと、人は一から調べ直すことになります。そこで報告の書式を決めておきます。Claude Agent SDKの結果にはsession_id、num_turns、total_cost_usdが含まれ、セッションを再開できます(agent loopのページ)。この値は報告に入れておくと再開しやすくなります。

~~~【停止報告】

  1. 停止理由:(回数/時間/費用/影響のどれか。具体的に)
  2. 目的と現在地:何をしようとして、どこまで終わったか
  3. 繰り返した失敗:エラー文の原文と、同じ失敗の回数
  4. 試したこと:手を変えた履歴(箇条書き)
  5. 触れたもの:変更・作成・削除・送信したもの。なければ「なし」
  6. 元に戻す方法:戻せるもの/戻せないもの
  7. 人に決めてほしいこと:選択肢を2〜3個と、AIの推奨(根拠つき)
  8. 再開に必要な情報:セッションID、作業場所、残りの作業

~~~

説明用の例(架空の作業です。実際に実行した結果ではありません)は次のとおりです。

~~~

  1. 停止理由:同一エラーの上限(3回)に到達
  2. 目的と現在地:テスト修正。12件中10件は通過、2件が未解決
  3. 繰り返した失敗:「接続がタイムアウトしました」が3回
  4. 試したこと:待機時間を延ばす→接続先を確認→再実行
  5. 触れたもの:作業用フォルダ内のファイル2件を編集。外部送信なし
  6. 元に戻す方法:編集2件は作業前の状態に戻せる
  7. 人に決めてほしいこと:A 接続先の設定を確認して再開/B 該当2件を保留にして残りを完了
  8. 再開に必要な情報:セッションID、作業フォルダの場所

~~~

AIに渡す依頼文

表を埋めたら、次の文に値を差し込んで依頼文の末尾に付けます。

~~~【停止ルール】

  • 同じエラーまたは同じ操作の失敗が○回続いたら、再試行をやめて報告する。
  • 2回目の失敗では、同じ手を繰り返さず別の方法を試す。別の方法がなければ止める。
  • 次の操作は実行前に必ず私に確認する:(即停止する操作)
  • 触ってよいのは(範囲)だけ。範囲外が必要になったら止める。
  • 権限不足で拒否された操作は、回避策を探さず報告する。
  • 止めるときは、下の「停止報告」の書式で出力する。

(停止報告の書式を貼る)~~~

「権限不足で拒否されたら回避策を探さない」という一文は、見落とされがちですが重要です。拒否をすり抜ける方法を探し始めるのが、最も避けたい種類の暴走だからです。

最後に、依頼文の停止ルールは仕組みの上限の代わりにはなりません。実行する前に、往復回数・費用・時間の上限が設定されているか、即停止する操作が承認制か権限から外れているかを、人が一度確認してください。

出典・参考資料