この記事の音声は準備中です。
音声の一覧・再生リストへデプロイとスケーリング
この記事の目的
Agent を本番インフラに載せるときの実行形態(同期・ジョブキュー・常駐・サーバーレス)を選定し、状態の外部化・プロバイダーのレート制限を前提とした容量設計・フォールバック構成・段階的ロールアウトを設計できるようになります。単発のデモを「多数の利用者が同時に使っても壊れないシステム」にするためのインフラ判断を扱います。
対象読者
- Agent を本番環境へデプロイするアーキテクチャを設計するエンジニア
- 利用者・トラフィックの増加でレート制限・タイムアウト・コスト超過に直面しているエンジニア・SRE
前提知識
- Agent ループ — 実行時間が長く非決定的である、という配置制約の源
- エラー処理・リトライ設計 — 呼び出し単位の失敗処理(本記事はシステム全体の容量・構成)
- バージョニング・デプロイ・モデル更新追従 — 何をバージョン管理し、どう切り替えるか
本文
概要: Agent 特有のインフラ制約
Agent のデプロイは通常の Web アプリと 3 点で異なります。
- 1 リクエストが長い: ツール呼び出しを重ねる Agent ループLLM が「観測 → 思考 → 行動」のサイクルを繰り返し、完了・失敗・上限のいずれかの停止条件まで自律的に処理を続ける制御構造。は数十秒〜数分かかり、HTTP の同期リクエストの常識(数百 ms〜数秒)から外れます
- 真のボトルネックが外部にある: 自前のサーバーをいくら増やしても、LLM プロバイダー側のレート制限(分あたりリクエスト数・トークン数)が上限になります
- コストがリクエスト数でなくトークン数に比例する: 容量計画・課金管理の単位が従来と違います(コスト管理)
図を元の大きさで表示
図の中をスクロールして読めます。キーボードでは図の領域へ Tab で移動し、矢印キーを使います。読み終わったら、この見出しをもう一度選ぶと閉じます。
図は代表的な構成(キュー + ステートレスワーカー)です。以下、各要素の設計判断を見ていきます。
実行形態の選択
| 実行形態 | 向くケース | 制約 |
|---|---|---|
| リクエスト同期(API の中で完結) | 対話 UI で応答が数十秒以内。ストリーミングLLM の応答を生成と同時に逐次受信・表示する方式。Agent の体感品質を左右する基本技術。で逐次表示する | ゲートウェイ・LB のタイムアウトに縛られる。リトライが「もう一度全部」になる |
| ジョブキュー + ワーカー | 数分かかるタスク、スパイクのある負荷、失敗時の再実行が必要 | 非同期 UX(進捗通知・完了通知)の設計が必要 |
| 常駐ワーカー / スケジュール実行 | 定期バッチ(日次レポート等)、イベント駆動の自動処理 | 同時実行数とコストの上限管理を自前で持つ |
| サーバーレス(FaaS) | 短い単発処理、低頻度でインフラ管理を持ちたくない | 実行時間上限・コールドスタート・状態を持てない制約が長い Agent ループと相性が悪い |
判断の起点は 「1 タスクの実行時間の分布」 です。p50 ではなく p95〜p99 で考えます(Agent はループ回数が入力次第で伸びるため、裾が長い)。p99 が同期の許容時間を超えるなら、対話型 UI であってもジョブ化 + ストリーミング進捗の構成に寄せます(ストリーミングと Agent の UX 実装パターン)。
状態管理とスケールアウト
ワーカーを水平スケールできるかは、状態をどこに置くかで決まります。
- ワーカーはステートレスにする: 会話履歴・実行中の Agent の状態(ループの途中経過・ツール結果)をワーカーのメモリAgent が「覚えている」ように見えるデータの総称。短期記憶(コンテキスト)・作業状態・長期記憶(外部ストレージ)の 3 層に分けて設計する。だけに置くと、スケールイン・再起動・障害で消えます。状態は外部ストア(DB・キャッシュ)に置き、どのワーカーでも再開できる形にします
- チェックポイント長時間タスクの「ここまで完了した」を再開可能な形で永続化したもの。ツール実行の完了やフェーズ境界などの意味のある単位で切る。信頼性とトークンコスト制御の両方の仕組み。: 長いタスクは「ここまで終わった」を節目(ツール実行の完了ごと・フェーズごと)で永続化し、失敗時は途中から再開できるようにします。全部やり直しはコスト(トークン課金)にも直撃します
- 冪等性同じ操作を複数回実行しても副作用の結果が 1 回と変わらない性質です。事前の実行済み確認だけでは並行実行や記録前クラッシュを防げず、受け側の原子的な重複排除などの実装条件が必要です。、エージェントの API 設計: 副作用のあるツールには、受信側が保証する冪等キー契約、または同一 DB 内の重複排除と更新の原子性を設けます。実行済みかの事前チェックだけでは、ワーカー間の競合や外部での成功後・記録前の停止を防げません。冪等性に非対応の外部 API で結果不明になった場合は、自動再送を止めて結果を照合します(エラー処理・リトライ設計、耐久実行)
- セッション親和性に頼らない: 「同じ利用者は同じワーカーへ」という設計は、状態外部化をさぼる誘惑になりがちです。障害時に会話が消える構成は本番に置けません
レート制限と容量設計
容量設計の主役は自前サーバーの CPU ではなく、プロバイダー側のレート制限(分あたりリクエスト数・分あたりトークン数) です。
- 同時実行の上限を自分で決める: ワーカー数・スレッド数を無制限にすると、スパイク時に全リクエストがレート制限エラーになり、リトライがさらに負荷を増やす悪循環に入ります。プロバイダーの制限から逆算した同時実行数(セマフォ)をアプリ側で管理します
- バックプレッシャ: 上限を超えた分は落とすのではなくキューで待たせ、キュー長・待ち時間を監視します。キューが伸び続けるなら、それは容量不足のシグナルです(可観測性とトレーシング)
- 優先度を分ける: 対話中の利用者(待たせると体験を損なう)と、バッチ処理(遅れてもよい)を同じキューに入れないでください。優先度付きキュー、または時間帯でのバッチ移動が定石です
- 見積もりはトークンで行う: 「1 タスク平均 N トークン × ピーク時タスク数」で分あたりトークン数を見積もり、制限との比率を容量として管理します。1 タスクのトークン数はループ回数に比例して伸びるため、上限(ループ回数・トークン)の設定が容量の予測可能性に直結します
- 縮退の設計: ピーク超過時の振る舞い(待たせる / 軽量モデルに切り替える / 機能を限定する)を事前に決めます。モデルティアの切り替えは品質が変わるため、評価で縮退時品質を確認しておきます(モデル選定ガイド)
フォールバックと多重化
LLM プロバイダーの障害・遅延は起きる前提で設計します。
- フォールバック先を用意する: 同一プロバイダーの別モデル、または別プロバイダーへの切り替え経路を用意します。切り替えの条件(エラー率・タイムアウト率のしきい値)と復帰の条件を明文化します
- フォールバックは「別のシステム」として評価する: モデルが変わればプロンプトの効き方も品質も変わります。フォールバック先での評価セット実行を事前に済ませ、「切り替えたら品質が急落した」を防ぎます(回帰テストと CI 組み込み)
- 切り替えを可観測にする: どのリクエストがフォールバックで処理されたかをトレースに記録します。品質・コストの分析がプロバイダー別にできないと、障害後の振り返りができません
- 完全停止時の縮退: 全プロバイダーが落ちた場合の振る舞い(受付停止 + 明示的なエラー / キュー退避して後で処理)も決めておきます。インシデント対応 の停止手段と接続します
ロールアウト戦略
プロンプト・モデル・パイプラインの変更は、コードのデプロイと同じく段階的に出します。個々の手法(カナリアリリース・シャドーラン・ロールバック)は バージョニング・デプロイ・モデル更新追従 が正本です。本記事の文脈で追加する判断は次の 2 点です。
- インフラ構成の変更もカナリアで: 実行形態の変更(同期 → ジョブ化)、キュー・ワーカー構成の変更も、一部トラフィックから段階適用します。挙動の差(タイムアウト・再試行頻度)は本番負荷でしか見えないことが多いためです
- 容量の余裕を持って切り替える: 新旧並行稼働(シャドーラン・カナリア)の期間は、レート制限消費が一時的に増えます。並行稼働分を容量計画に入れておかないと、リリース作業自体がレート制限超過を引き起こします
実務での注意点
アンチパターン
- Web リクエストの中で数分の Agent ループを同期実行する → ゲートウェイのタイムアウトで切断され、利用者には失敗に見えるのに処理は課金されながら走り続ける → p95〜p99 の実行時間でジョブ化を判断し、進捗はストリーミング・ポーリングで返す
- ワーカーのメモリに会話状態を持つ → スケールイン・再起動のたびに会話が消え、水平スケールもできない → 状態を外部ストアへ出し、ワーカーはステートレスにする
- 同時実行を制御せずスケールアウトする → 自前サーバーを増やした分だけレート制限エラーが増え、リトライの嵐で全体が止まる → プロバイダー制限から逆算した同時実行上限とバックプレッシャを入れる
- フォールバック先を評価せずに切り替える → 障害対応のつもりが品質インシデントになる → フォールバック構成も評価セットで事前検証し、切り替えをトレースに記録する
- 容量・コストをリクエスト数で見積もる → トークン数ベースの実態と乖離し、ループの長いタスクで予算とレート制限を食い潰す → トークンベースの見積もりと、タスクあたりのループ・トークン上限をセットで設計する
チェックリスト
- 1 タスクの実行時間分布(p95〜p99)を測り、実行形態(同期 / ジョブ)を選定した
- 会話履歴・実行状態が外部ストアにあり、任意のワーカーで再開できる
- 副作用の受信側の冪等契約または同一 DB 内の原子性があり、結果不明時は自動再送を止めて照合する
- プロバイダーのレート制限から逆算した同時実行上限とバックプレッシャがある
- 対話系とバッチ系の優先度が分離されている
- 容量・コストの見積もりがトークンベースで、タスクあたりの上限が設定されている
- フォールバック経路があり、フォールバック先での品質を評価済みで、切り替えが記録される
- 新構成のロールアウトが段階的で、並行稼働分の容量が計画に入っている
関連トピック
- 非同期・長時間タスクの設計(耐久実行) — 本記事のインフラの上で動く実行モデル(チェックポイント・再開・承認待ち)の設計
- バージョニング・デプロイ・モデル更新追従 — カナリア・シャドーラン・ロールバックの正本
- エラー処理・リトライ設計 — 呼び出し単位の失敗処理と冪等性
- コスト管理 — トークンベースのコスト構造と上限設計
- レイテンシ最適化 — 同期構成を維持したい場合の応答時間短縮
- インシデント対応 — 縮退・停止手段との接続
- PoC から本番への進め方 — 本記事の内容が「本番化の関門」になる位置づけ
- AI システムのカオスエンジニアリング — フォールバック多重化・縮退を障害注入で検証する
- LLM ゲートウェイの設計 — フォールバック・ルーティングを 1 つの部品に集約する実装点
- セルフホスト推論の実務 — モデル提供層そのものを自前で持つ場合の容量・切り替え
参考資料
- Making retries safe with idempotent APIs(AWS Builders’ Library) — 重複排除と副作用を原子的に確定する設計(アクセス日: 2026-09-10)
- Anthropic API: Rate limits — 分あたりリクエスト数・トークン数という制限の構造(アクセス日: 2026-07-06)
- OpenAI: Rate limits — 同上(プロバイダーごとの制限体系の比較用)(アクセス日: 2026-07-06)