返回文章列表
AIAgentic AI本番環境エンジニアリングLLMDevOps
⚠️

What Actually Breaks When You Deploy AI Agents to Production

AI agents in production fail in ways nobody tells you about before you deploy. Context window exhaustion, tool call loops, hallucinated API calls, and silent degradation. Here is the real engineering playbook from teams that have shipped production agents.

iBuidl Research2026-03-0914 min 阅读
TL;DR
  • コンテキスト窓枯渇が最も多い本番障害 — ログ、ツール出力、履歴が蓄積し、Agent が途中で「忘れる」
  • ツールコールループは停止条件が不明確なときに発生 — 無限ループで API コストが数万円に膨らむ事例あり
  • 幻覚された API 呼び出しは静かに失敗する — 存在しないエンドポイントを「成功」として報告するパターン
  • 本番 Agent の 3 つの必須設計原則:①最大ステップ数の上限、②ツール呼び出しの冪等性、③すべてのアクションのログと可逆性
  • 観測性(Observability)なしで本番 Agent を動かすのは禁止 — LangSmith、Langfuse、Arize Phoenix のいずれかを必ず使え

Section 1 — 本番 Agent の 4 大障害パターン

2026 年現在、AI Agent を本番運用しているチームから収集した障害事例を分析すると、4 つのパターンに集約される。

38%
コンテキスト枯渇による失敗
本番 Agent 障害の最多原因
24%
ループ・無限実行
停止条件の設計ミス
21%
ツール呼び出しエラー
幻覚・権限・タイムアウト
17%
出力品質の静かな劣化
検出されないまま続く

Section 2 — 障害パターン詳細と対策

パターン 1:コンテキスト窓の枯渇

症状: Agent が途中でタスクを「忘れる」、最初の指示と矛盾した行動を取る、「どこから始めるべきか分からない」状態に陥る。

原因:

# 典型的な問題コード
agent_history = []
while not task_complete:
    result = tool.call(...)
    agent_history.append(result)  # 制限なく蓄積
    response = llm.complete(history=agent_history)  # 毎回全履歴を送信

長期タスクでは、ツール出力・エラーログ・中間結果が蓄積し、コンテキスト上限(128K〜1M tokens)を超える。

対策:

# 解決策:スライディングウィンドウ + 要約
class ContextManager:
    def __init__(self, max_tokens=80000):
        self.max_tokens = max_tokens
        self.history = []

    def add(self, item):
        self.history.append(item)
        if self.estimate_tokens() > self.max_tokens:
            self.summarize_old_history()  # 古い履歴を要約

    def summarize_old_history(self):
        # 古い半分を LLM で要約してコンパクト化
        old = self.history[:len(self.history)//2]
        summary = llm.summarize(old)
        self.history = [summary] + self.history[len(self.history)//2:]

パターン 2:ツールコールループ

症状: Agent が同じツールを繰り返し呼び出し続ける。API コストが数十分で数万円に到達。

実際のインシデント例:

ステップ 1: search_web("Python async tutorial")
ステップ 2: search_web("Python async tutorial examples")
ステップ 3: search_web("how to write Python async code")
ステップ 4: search_web("Python asyncio tutorial 2026")
... (200 回繰り返し)
コスト: $340 / 30 分

対策:

class SafeAgent:
    MAX_STEPS = 50
    MAX_TOOL_CALLS_PER_TYPE = 10

    def __init__(self):
        self.step_count = 0
        self.tool_call_counts = defaultdict(int)

    def call_tool(self, tool_name, *args):
        self.step_count += 1
        self.tool_call_counts[tool_name] += 1

        if self.step_count > self.MAX_STEPS:
            raise AgentStepLimitError("Maximum steps exceeded")

        if self.tool_call_counts[tool_name] > self.MAX_TOOL_CALLS_PER_TYPE:
            raise AgentToolLimitError(f"{tool_name} called too many times")

        return tool.execute(tool_name, *args)
コスト上限は必ず実装せよ

本番 Agent には必ず「セッション予算」を設定すること。例: 「このタスクは最大 $5 のAPI コストまで」という上限。超過した時点で Agent を停止し、アラートを送る仕組みがなければ、バグ一つで数百ドルの請求が来る。


パターン 3:幻覚された API 呼び出し

症状: Agent が存在しないエンドポイント、無効なパラメータ、誤った認証情報でツールを呼び出す。最悪の場合、「成功」と報告して続行する。

# 問題例:LLM が架空の API を生成
tool_call = {
    "name": "send_slack_message",
    "args": {
        "channel": "#general",
        "message": "Task completed",
        "webhook_url": "https://hooks.slack.com/T123/FAKE_URL"  # 幻覚
    }
}
# ツールが失敗しても LLM が「送信できた」と判断するケース

対策:スキーマバリデーション + エラーの強制的な認識

from pydantic import BaseModel, validator

class SlackToolInput(BaseModel):
    channel: str
    message: str

    @validator('channel')
    def channel_must_exist(cls, v):
        if v not in VALID_CHANNELS:
            raise ValueError(f"Channel {v} does not exist")
        return v

# Agent にエラーを明示的に返す
def execute_tool(tool_name, raw_args):
    try:
        validated = TOOL_SCHEMAS[tool_name](**raw_args)
        return tool_registry[tool_name](validated)
    except ValidationError as e:
        # エラーを Agent に返して再計画させる
        return {"error": str(e), "status": "validation_failed"}

パターン 4:出力品質の静かな劣化

症状: Agent は正常に動作しているように見えるが、出力の品質が徐々に低下する。検出が最も難しい障害。

原因:

  • プロンプトの累積汚染(会話履歴に誤った前提が混入)
  • モデルのバージョンアップによる挙動変更
  • ツールからの出力形式の変化

対策:継続的な品質評価

class QualityMonitor:
    def __init__(self, eval_sample_rate=0.05):  # 5% をサンプリング
        self.sample_rate = eval_sample_rate

    def evaluate(self, input, output):
        if random.random() > self.sample_rate:
            return

        score = llm_evaluator.score(
            task=input,
            result=output,
            rubric=QUALITY_RUBRIC
        )

        if score < 0.7:
            alert.send(f"Quality degradation detected: {score}")
            metrics.record("agent_quality_score", score)

Section 3 — 本番 Agent の観測性スタック

ツール強み弱み月額コスト目安
LangSmithLangChain統合、デバッグUI優秀LangChain依存性が高い$39〜$299
Langfuseオープンソース、SDK非依存エンタープライズ機能が少ない無料〜$99
Arize PhoenixLLM評価・ドリフト検出設定が複雑$0〜(OSS)
Heliconeシンプルなプロキシ型高度な分析機能なし$0〜$200
自社実装完全カスタマイズ開発コストが高いエンジニア工数

Section 4 — 本番 Agent 設計の 7 原則

1. 最大ステップ数の上限を必ず設ける(デフォルト: 50ステップ)
2. すべてのツール呼び出しをログに記録する(入力・出力・レイテンシ)
3. 副作用のあるアクション(メール送信・DB書き込み)は人間の確認を挟む
4. 冪等性:同じアクションを複数回実行しても安全か確認する
5. コンテキスト管理を明示的に実装する(スライディングウィンドウ)
6. セッション予算(コスト上限)を設定する
7. 品質評価を継続的に実施する(5〜10% サンプリング)
Human-in-the-Loop の正しい位置

「Human-in-the-Loop」は「常に人間が確認する」ではなく、「リスクの高いアクションだけ人間が確認する」設計が正解。具体的には:① 外部システムへの書き込み、② 金融トランザクション、③ ユーザーへの直接通知、のみを承認必須にし、それ以外は自動化する。過剰な人間介入は Agent の価値を半減させる。


综合评分
9.0
Production Readiness Framework / 10

AI Agent の本番運用は 2026 年でもまだ「試行錯誤が必要な領域」だ。しかし、コンテキスト管理・ループ検出・ツールバリデーション・観測性という 4 つの基盤を正しく実装すれば、安定した本番運用は達成可能だ。最大のリスクは「動いているように見える Agent」の静かな劣化。5% のサンプリング評価と品質アラートは必須投資だ。


References: LangChain production case studies, Anthropic engineering blog, internal incident reports from iBuidl partners. March 2026.

— iBuidl Research Team

更多文章