giip
SES案件登録
AI運用参照のみモデルコストフェイルオーバーコスト監視自動化

AI Routerでモデルコストを抑える方法と、外部AI API障害時のフェイルオーバー設計

公開日 2026-08-13 · 更新日 2026-08-13 · 最終検証日 2026-08-13

結論

コストを抑える中心は、すべてを大きなモデルに投げないことです。分類や抽出のような定型処理は小さいモデルへ、設計判断や長文推論は大きいモデルへ振り分け、プロンプトキャッシュ、出力トークン上限、結果キャッシュ、バッチ化を併用します。安いモデルの出力は品質ゲートで検証し、不合格のときだけ上位モデルへ再試行します。障害対策としては、プロバイダを抽象化し、ヘルスチェックとサーキットブレーカ、429と5xxの扱い分け、劣化運転の定義を用意します。

この文書の適用条件

対象製品AI Router(複数のLLMプロバイダを束ねる中継層)
確認バージョン製品バージョンに依存しない設計上の説明(価格・レイテンシは変動するため本記事では扱いません)
適用環境AWS、Azure、オンプレミス
必要権限各プロバイダのAPIキー参照権限と、Routerホストへのアクセス権限
実行影響参照のみ(ヘルスチェックは本番トラフィックとは別経路)
再起動不要(ルーティングポリシーを動的に読み込む場合)
最終検証日2026-08-13

そのまま実行できるコマンド

ルーティングポリシーの定義(タスク種別ごとの割り当てと品質ゲート)参照のみ
対象
自組織のAI Routerのルーティングポリシー定義
権限
ポリシー定義の編集権限
変更作業
なし(定義の記述例)
Production実行
該当なし(設計サンプル)
# 対象: 自組織のAI Routerのルーティングポリシー定義
# 権限: ポリシー定義の編集権限
# 変更作業: なし(定義の記述例)
# Production 実行: 該当なし(設計サンプル)

# 「小 / 中 / 大」は自組織で採用しているモデルの相対的な区分を指す。
# 具体的なモデル名と価格は変動するため、ここでは書かずに定義側で解決する。

タスク種別            | 既定の割り当て | 出力上限 | 品質ゲート                   | 不合格時の扱い
----------------------|----------------|----------|------------------------------|----------------------------
分類・ラベル付け      | 小             | 短       | 許可ラベル集合に含まれるか   | 中へ1回だけ再試行
構造化抽出(JSON)    | 小             | 中       | JSONスキーマ検証             | 中へ1回だけ再試行
要約(短文)          | 小             | 中       | 入力に無い固有名詞が無いか   | 中へ1回だけ再試行
要約(長文・横断)    | 中             | 長       | 参照元の提示があるか         | 大へ1回だけ再試行
コード生成(定型)    | 中             | 中       | 構文解析とテスト実行         | 大へ1回だけ再試行
設計判断・長文推論    | 大             | 長       | 人間のレビュー               | 再試行しない(人へ回す)
自由入力の対話        | 中             | 中       | 出力フィルタ                 | 中で再試行(上位へ上げない)

共通の制御:
  timeout:            タスク種別ごとに設定。長文推論だけ長くする
  max_retries:        2 まで。ジッタ付き指数バックオフ
  prompt_cache:       システムプロンプトと共通コンテキストは前方固定にして再利用する
  result_cache:       入力のハッシュをキーにする。ただし個人情報を含む入力は対象外
  batching:           即時性が不要なタスクのみ。締切のあるタスクは対象外
  budget_guard:       日次・月次の上限に対する消費割合を監視し、しきい値で通知する

計測の前提:
  - 振り分けの妥当性は、自組織の利用ログ(タスク種別ごとの件数・入出力量・
    品質ゲートの合格率・上位モデルへの再試行率)で判断する
  - 単価と提供モデルは変わるため、各プロバイダの現行の価格ページを定期的に確認する

品質ゲートを置かずに安いモデルへ寄せると、失敗した出力を人が手直しする時間が増えます。ゲートの合格率と上位モデルへの再試行率を記録し、再試行が多いタスク種別は既定の割り当てを上げてください。判断材料は自組織の利用ログです。

プロバイダのヘルスチェックとサーキットブレーカの状態遷移参照のみ
対象
自組織のAI Router(複数プロバイダを束ねる中継層)
権限
各プロバイダのAPIキー参照権限とRouterホストへのシェルアクセス
変更作業
なし(疎通確認と状態ファイルの読み書きのみ)
Production実行
可能(本番トラフィックとは別経路のヘルスチェック)
# 対象: 自組織のAI Router(複数プロバイダを束ねる中継層)
# 権限: 各プロバイダのAPIキー参照権限とRouterホストへのシェルアクセス
# 変更作業: なし(疎通確認と状態ファイルの読み書きのみ)
# Production 実行: 可能(本番トラフィックとは別経路のヘルスチェック)

STATE_DIR=/var/lib/ai-router/breaker
FAIL_THRESHOLD=5          # 連続失敗がこの回数に達したら OPEN にする
mkdir -p "$STATE_DIR"

for p in provider-a provider-b; do
  # 軽量なエンドポイントを使う。本番の推論リクエストで死活を測らない
  code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "https://$p.example.com/v1/models")
  fails=$(cat "$STATE_DIR/$p.fails" 2>/dev/null || echo 0)

  case "$code" in
    200)
      fails=0
      ;;
    429)
      # レート制限は「プロバイダは生きている」。切り離さずバックオフとキューイングで受ける
      echo "$p: 429 rate limited -> backoff, do not open breaker"
      ;;
    5*|000)
      # 5xx と接続不能は障害として数える(000 は curl が到達できなかった場合)
      fails=$((fails + 1))
      ;;
    4*)
      # 429 以外の 4xx はこちらのリクエストの問題。切り離しても直らない
      echo "$p: client error $code -> check request, do not open breaker"
      ;;
  esac

  echo "$fails" > "$STATE_DIR/$p.fails"

  if [ "$fails" -ge "$FAIL_THRESHOLD" ]; then
    echo "$p: OPEN -> 新規ルーティングを停止し、次候補へ退避。一定時間後に HALF_OPEN で試行"
  else
    echo "$p: CLOSED (http=$code consecutive_fails=$fails)"
  fi
done

ヘルスチェックには本番の推論リクエストではなく軽量なエンドポイントを使ってください。推論で死活を測ると、確認自体が費用と負荷を生みます。OPEN から復帰する際は、いきなり全量を戻さず一部だけ流す HALF_OPEN を挟みます。

結果の読み方

意味確認するポイント
タスク難易度による振り分け定型処理は小さいモデル、判断を伴う処理は大きいモデルへ回すタスク種別ごとの件数と入出力量を利用ログで把握しているか
品質ゲート安いモデルの出力を検証してから採用する仕組み合格率と上位モデルへの再試行率を記録しているか
プロンプトキャッシュ共通の前置きを再利用して入力の重複を減らす共通部分が前方に固定され、可変部分が後ろに来ているか
出力トークン上限タスク種別ごとに出力の長さを制限する上限で切られた出力が下流で壊れない設計か
結果キャッシュ同じ入力に対する結果を再利用する個人情報を含む入力がキャッシュ対象から除外されているか
バッチ化即時性が不要な処理をまとめて実行する締切のあるタスクが誤ってバッチに入っていないか
リトライとタイムアウト失敗時の再試行回数と待ち時間の方針再試行が費用と待ち時間を増やしていないか。上限があるか
抽象化レイヤ呼び出し側がプロバイダ固有の差異を意識しない構造プロバイダを1つ止めてもアプリのコード変更なしで切り替わるか
サーキットブレーカ連続失敗した経路への送信を止める仕組みOPEN の条件と復帰条件が定義され、復帰時に一部から戻すか
429 と 5xx の扱い分けレート制限と障害を別に扱うこと429 で経路を切り離していないか(バックオフで受けているか)
キューイングとバックプレッシャー流入を受け止め、限界時に上流へ待たせることキューの上限と、あふれたときの挙動が定義されているか
劣化運転(degraded mode)全機能ではなく主要機能だけを維持する状態どの機能を止め、どの機能を残すかが事前に決まっているか
出力差の受け入れ基準プロバイダが変わると出力が変わることへの許容範囲下流の処理がスキーマ検証で吸収できる形になっているか
コスト上限アラート想定外の消費に気づく仕組み日次と月次の両方で見ているか。通知先が有効か

こういう状況で使います

  • AIの利用料が想定より増えているが、どのタスクが押し上げているか分からない
  • すべての処理を同じ大きなモデルで処理している
  • 外部AI APIが不安定になると、アプリ全体が応答しなくなる
  • 429が返ったときに、障害と同じ扱いで経路を切り離してしまっている
  • プロバイダを切り替えたら出力の形式が変わり、下流の処理が壊れた
  • 再試行が多発して、待ち時間と費用の両方が増えている

考えられる原因(可能性の高い順)

  1. 01

    タスクの難易度に関わらず同じモデルを使っている

    分類や抽出のような定型処理と、設計判断のような推論を同じ経路に流すと、定型処理の分まで高い経路を通ります。まずタスク種別を分けることが前提になります。

  2. 02

    出力の長さに上限が無い

    出力トークンの上限が設定されていないと、必要以上に長い出力が生成されることがあります。下流が使う長さを基準に上限を決めてください。

  3. 03

    再試行の方針が無い

    失敗のたびに無制限に再試行すると、費用と待ち時間が増えます。回数上限とバックオフ、そして再試行しない条件を決めてください。

  4. 04

    プロバイダ固有の呼び出しがアプリ全体に散らばっている

    抽象化レイヤが無いと、障害時の切り替えがコード変更になります。呼び出しを1か所に集約すると、切り替えが設定変更で済みます。

  5. 05

    レート制限と障害を区別していない

    429はプロバイダが稼働していることを示します。これを障害として経路を切り離すと、待てば通ったはずのリクエストまで別経路に回り、状況を悪化させることがあります。

  6. 06

    劣化時に何を止めるかが決まっていない

    全機能を維持しようとすると、全体が遅くなります。事前に優先順位を決めておけば、主要機能だけを維持できます。

確認手順

  1. 1

    タスク種別ごとの利用実績を集計する

    参照のみ

    自組織の利用ログから、タスク種別ごとの件数、入力量、出力量、失敗率を集計します。振り分け設計の出発点はここです。

  2. 2

    出力トークンの分布を確認する

    参照のみ

    実際の出力長を分布で見て、上限をどこに置けるかを判断します。平均だけでは上限を決められません。

  3. 3

    再試行の発生率と原因を分ける

    参照のみ

    タイムアウト、429、5xx、品質ゲート不合格のどれで再試行しているかを分けて集計します。対処が異なります。

  4. 4

    プロバイダの現行の価格と提供モデルを確認する

    参照のみ

    各プロバイダの価格ページを参照し、自組織の集計値に当てはめます。価格は変動するため、定期的に見直してください。

  5. 5

    1プロバイダを止めた状態で動作確認する

    検証環境で片方の経路を無効化し、アプリがコード変更なしで動き続けるかを確認します。

対応方法

すぐに実施できる低リスクの対応

  • タスク種別のタグ付けを始める

    すべての呼び出しにタスク種別のラベルを付け、利用ログに残します。振り分けの判断材料が無い状態を最初に解消します。

  • 出力トークン上限を設定する

    タスク種別ごとに上限を設定します。上限で切られた出力を下流が安全に扱えることを確認してください。

  • コスト上限アラートを設定する

    日次と月次の両方でしきい値を設け、通知先が有効であることを確認します。

  • 429と5xxの扱いを分ける

    429はバックオフで受け、5xxと接続不能だけをブレーカの失敗として数えるようにします。

事前検討が必要な変更

  • 呼び出しを抽象化レイヤに集約する

    プロバイダ固有の実装を1か所にまとめ、アプリ側は共通のインターフェースで呼ぶようにします。切り替えが設定変更で済むようになります。

  • 品質ゲートを実装する

    スキーマ検証、許可値の照合、構文解析、テスト実行など、タスク種別に応じた検証を入れます。合格したときだけ結果を採用します。

  • プロンプトキャッシュと結果キャッシュを導入する

    共通の前置きを前方に固定し、同一入力の結果を再利用します。個人情報を含む入力はキャッシュ対象から除外してください。

  • サーキットブレーカとヘルスチェックを入れる

    軽量なエンドポイントで死活を測り、連続失敗でOPEN、一定時間後にHALF_OPENで一部を戻す遷移を実装します。

  • 劣化運転の内容を定義する

    どの機能を止め、どの機能を維持するかを事前に決め、切り替えの手順を用意します。

専門家のレビューが必要な作業

  • 既定のモデル割り当てを変更する

    専門家レビュー必須

    主要タスクの割り当てを下げると費用は下がりますが、品質ゲートの不合格率が上がる可能性があります。段階的に適用し、合格率を観測してから広げてください。

  • キューイングとバックプレッシャーを導入する

    専門家レビュー必須

    流入を受け止める設計は、上流の待ち時間や体感に影響します。業務要件と合わせて上限とあふれ時の挙動を決めてください。

!注意事項

  • 本記事はモデルの価格、トークン単価、応答時間、削減率の数値を扱いません。これらは提供側の都合で変動し、記載した時点で古くなるためです。判断は自組織の利用ログと、各プロバイダの現行の価格ページで行ってください。
  • 安いモデルへ寄せる設計は、品質ゲートと対で導入してください。ゲートが無いと、失敗した出力を人が手直しする時間が増え、全体としては節約になりません。
  • 429で経路を切り離さないでください。レート制限はプロバイダが稼働していることを示しており、対処はバックオフとキューイングです。
  • プロバイダを切り替えると出力の細部は変わります。下流がスキーマ検証で吸収できる形になっていないと、フェイルオーバーが別の障害を生みます。
  • キャッシュの対象に個人情報を含む入力を入れないでください。キャッシュキーの設計次第では、別の利用者に結果が返る可能性があります。
  • ヘルスチェックに本番の推論リクエストを使わないでください。確認自体が費用と負荷を生みます。

バージョン・環境による違い

プロバイダのSDKに依存する場合SDKのバージョン差でリトライの既定動作が異なることがあります。抽象化レイヤ側で再試行を制御し、SDKの自動リトライと二重にならないようにしてください。
マネージドな推論基盤を使う場合レート制限の単位(トークン単位か、リクエスト単位か)が基盤ごとに異なります。バックオフの設計はその単位に合わせてください。
自社ホストのモデルを併用する場合外部APIが利用できないときの退避先として使えますが、能力の差が出力に表れます。劣化運転として許容できる範囲を事前に定義してください。

これで解決しない場合に確認すること

  • 費用を押し上げているタスク種別を特定する

    件数の多いタスクと、1件あたりの入出力量が大きいタスクを分けて見ます。対処が異なります。

  • 品質ゲートの不合格率を種別ごとに見る

    不合格率が高い種別は、既定の割り当てを上げたほうが結果的に安くなることがあります。

  • キャッシュのヒット状況を確認する

    ヒットしていないなら、キーの設計か入力のばらつきに原因があります。

  • フェイルオーバーを実際に発動させてみる

    検証環境で片方を落とし、切り替わりと劣化運転が想定どおりかを確認します。

  • 各プロバイダの現行の価格ページを確認する時期を決める

    価格と提供モデルは変わります。見直しの頻度を運用手順に含めてください。

この文書の根拠と限界

一般的な技術説明

ルーティングとフェイルオーバーの設計は、可用性設計とキャッシュ設計の一般的な手法をAI APIに適用したものです。モデル価格、トークン単価、応答時間、コスト削減率は変動し検証もできないため、本記事では一切記載していません。「GIIP対応範囲」の段落のみ GIIP 自身の運用形態の記述です。

よくある質問

どのタスクを小さいモデルに回してよいですか?

出力の正しさを機械的に判定できるタスクです。分類なら許可ラベル集合との照合、構造化抽出ならJSONスキーマ検証、コード生成なら構文解析とテスト実行で判定できます。判定手段が無いタスクは、安い経路に回しても品質を担保できません。

実際にどれくらい費用が下がりますか?

本記事では数値を示しません。効果はタスクの構成比、入出力の長さ、品質ゲートの合格率に依存し、プロバイダの価格も変動するためです。自組織の利用ログでタスク種別ごとの入出力量を集計し、各プロバイダの現行の価格ページに当てはめて見積もってください。

429が返ったときは別のプロバイダに切り替えるべきですか?

原則としてバックオフとキューイングで受けます。429はプロバイダが稼働していることを示すため、切り離しても状況は改善しません。待ち時間が業務上許容できない場合に限り、別経路への退避を検討してください。

サーキットブレーカはいつOPENにすればよいですか?

5xxと接続不能が連続したときです。しきい値は自組織の失敗率の実測から決めます。復帰は一定時間後にHALF_OPENとして一部だけ流し、成功したらCLOSEDに戻します。

プロバイダを切り替えると出力が変わってしまいます。どう扱いますか?

下流がスキーマ検証で吸収できる形にし、受け入れ基準を「形式が正しく、必須項目が揃っていること」に置きます。文面の一致を前提にした処理があると、フェイルオーバーのたびに壊れます。

劣化運転では何を止めればよいですか?

事前に決めておく必要があります。一般には、即時性が不要な補助機能(推薦、要約、自動タグ付け)を先に止め、業務の主要導線を維持します。順序を障害時に考えると判断が遅れます。

この文書がカバーする質問

  • 外部AI API障害時のFailover設計はどうするのか
  • LLMの利用料を下げるにはどこから手を付けるべきか
  • 複数のAIプロバイダを切り替えられる構成にしたい

リスク表示の意味

  • 参照のみデータと設定を変更しません。
  • 影響は限定的ですが、権限と負荷の確認が必要です。
  • 性能・ロック・コストに影響する可能性があります。
  • 障害・データ損失・復旧作業が発生する可能性があります。
  • 専門家レビュー必須本番適用前に別途レビューが必須です。

GIIPの対応範囲

ここまでの設計は特定の製品を使わずに実装できます。GIIP では複数のAIモデルを用途に応じて使い分ける構成をとっており、外部APIの不調時に処理が止まらないよう、経路の切り替えと劣化運転を運用手順に含めています。実際にどの区分にどのモデルを当てるかは、扱うタスクの種類と品質要件によって変わるため、自組織の利用ログをもとに決める必要があります。判断材料の集計方法から整理したい場合はご相談ください。

執筆・技術検証

GIIP プロダクション運用チーム

大規模Webサービス、SQL Server、Oracle、AWS、Azureの設計・移行・運用に約30年従事。x12largeクラスのAWS RDS for SQL Server環境12セット、約12万テーブルのOracle環境、約3TBのTiDBからAurora MySQLへの移行を経験。現在も複数のクラウドデータベースと約30のWebサービスを、AIエージェントと人間の専門家が継続的に監視・運用しています。

関連するナレッジ

関連サービス

AI利用のコスト構造を可視化する

同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。

AI利用のコスト構造を可視化する

ナレッジベース一覧へ