- コンテキスト窓枯渇が最も多い本番障害 — ログ、ツール出力、履歴が蓄積し、Agent が途中で「忘れる」
- ツールコールループは停止条件が不明確なときに発生 — 無限ループで API コストが数万円に膨らむ事例あり
- 幻覚された API 呼び出しは静かに失敗する — 存在しないエンドポイントを「成功」として報告するパターン
- 本番 Agent の 3 つの必須設計原則:①最大ステップ数の上限、②ツール呼び出しの冪等性、③すべてのアクションのログと可逆性
- 観測性(Observability)なしで本番 Agent を動かすのは禁止 — LangSmith、Langfuse、Arize Phoenix のいずれかを必ず使え
Section 1 — 本番 Agent の 4 大障害パターン
2026 年現在、AI Agent を本番運用しているチームから収集した障害事例を分析すると、4 つのパターンに集約される。
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 の観測性スタック
| ツール | 強み | 弱み | 月額コスト目安 |
|---|---|---|---|
| LangSmith | LangChain統合、デバッグUI優秀 | LangChain依存性が高い | $39〜$299 |
| Langfuse | オープンソース、SDK非依存 | エンタープライズ機能が少ない | 無料〜$99 |
| Arize Phoenix | LLM評価・ドリフト検出 | 設定が複雑 | $0〜(OSS) |
| Helicone | シンプルなプロキシ型 | 高度な分析機能なし | $0〜$200 |
| 自社実装 | 完全カスタマイズ | 開発コストが高い | エンジニア工数 |
Section 4 — 本番 Agent 設計の 7 原則
1. 最大ステップ数の上限を必ず設ける(デフォルト: 50ステップ)
2. すべてのツール呼び出しをログに記録する(入力・出力・レイテンシ)
3. 副作用のあるアクション(メール送信・DB書き込み)は人間の確認を挟む
4. 冪等性:同じアクションを複数回実行しても安全か確認する
5. コンテキスト管理を明示的に実装する(スライディングウィンドウ)
6. セッション予算(コスト上限)を設定する
7. 品質評価を継続的に実施する(5〜10% サンプリング)
「Human-in-the-Loop」は「常に人間が確認する」ではなく、「リスクの高いアクションだけ人間が確認する」設計が正解。具体的には:① 外部システムへの書き込み、② 金融トランザクション、③ ユーザーへの直接通知、のみを承認必須にし、それ以外は自動化する。過剰な人間介入は Agent の価値を半減させる。
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