本文へ移動
📈

AIエージェントを社内業務に入れると、最初は「評価を通したか」「監査ログを残したか」に意識が向きます。けれど、本番で困るのはその後です。tool error が増えている、同じ handoff を繰り返す、承認待ちが詰まる、外部送信前に怪しい retrieval を読んでいる、コストだけが急に跳ねる。こうした変化に気付けないと、事故になるまで誰も止められません。

この記事では、Claude Code、Codex、MCP server、社内 workflow agent を含む AIエージェント本番監視 の設計を整理します。事後に何を説明できるように残すかは AIエージェント監査ログ設計ガイド、本番投入前に何を落とすかは AIエージェント評価設計ガイド、事故後の止め方は AIエージェント停止手順ガイド、MCP server の事前審査は MCP サーバーカタログ設計ガイド に分けています。

今回扱うのは、稼働中の agent を何で観測し、どの兆候でアラートし、どの条件で止めるかです。

先に結論: AIエージェント監視はLLM監視だけでは足りない

AIエージェントの監視を、model latency、token usage、error rate だけで作ると弱いです。agent はモデルを呼ぶだけでなく、tool を選び、引数を作り、MCP や外部 API に触り、handoff し、人間承認で止まります。

私なら、最小構成でも次の7つを別々に見ます。

監視対象見るもの典型的な異常
run成功率、失敗理由、所要時間task が終わらない、timeout が増える
traceagent span、generation、tool call、handoff同じ手順をループする
tooltool 名、target、arguments、resultwrong tool、write tool の急増
approval承認待ち時間、却下率、例外承認承認が詰まる、却下理由が偏る
MCPserver、scope、response、token未承認 server、scope elevation
costinput/output tokens、cache、外部 API cost1 run あたりの単価が跳ねる
safetyguardrail、外部送信、secret accessblock すべき操作が通りそうになる

OpenAI Agents SDK の tracing は、agent run、LLM generation、tool call、handoff、guardrail を trace / span として見られる構造を持っています。OpenTelemetry の GenAI semantic conventions も、GenAI client、MCP、provider 固有の span / metrics / events を扱う方向に進んでいます。つまり、本番監視は「ログを眺める」ではなく、agent run の操作列を観測可能にする設計として考えるべきです。

監視の単位は agent_run_id に寄せる

最初に決めるのは、監視単位です。私は agent_run_id を中心にします。

agent_run_id: agent-20260621-support-triage-0042
workflow: support_triage
agent_version: support-router@2026-06-21
permission_profile: read_then_draft
trace_id: trace_abc123...

この ID を、trace、tool log、approval log、MCP request、PR / ticket / artifact に渡します。これがないと、アラートが出ても「どの依頼のどの操作か」を人間が追えません。

監査ログの記事では、後から説明できる証跡として相関IDを扱いました。本番監視では同じ ID を使って、稼働中に検索できるようにします。目的が違います。

  • 監査ログ: 後から説明する
  • 本番監視: 途中で気付いて止める

この2つを同じ schema で始めると楽ですが、保存期間と粒度は分けます。監視ダッシュボードに raw prompt や raw tool response を丸ごと出す必要はありません。

まず見るべきSLO

AIエージェントにいきなり細かい品質指標を入れるより、最初は運用 SLO を決めます。たとえば社内 PR review agent なら、次で十分です。

SLO例アラート条件
completion rate24時間で完了率 95%以上1時間連続で 80% 未満
median runtime1 run 10分以内p95 が 30分超
tool error ratetool call 失敗 5% 未満15分で 20% 超
approval wait承認待ち p95 2時間以内p95 が 8時間超
unsafe blockhigh-risk tool は approval 必須approval なし write を検知
cost per run通常 run の3倍未満3回連続で閾値超え

ここで「正しい答えを出したか」を SLO にしすぎない方がよいです。品質評価は eval suite で別に見ます。本番監視の初期目的は、詰まり、暴走、権限逸脱、外部影響、コスト異常を早く見つけることです。

trace で見るべき異常

trace では、最終回答ではなく操作列を見ます。OpenAI Agents SDK の default tracing は run 全体、agent span、generation、function tool、guardrail、handoff を span として扱います。この構造を前提にすると、見るべき異常はかなり具体化できます。

異常見方止める条件
handoff loop同じ agent 間の往復回数3回以上で human review
tool retry loop同じ tool / 同じ target の連続失敗5分で3回失敗したら停止
context thrashretrieval query が広がり続けるquery数が通常の3倍
late approvalwrite tool 直前まで承認情報なしtool guardrail で block
silent degradationfinal output はあるが required tool 未実行warning ではなく failed

trace は「あとで眺めるグラフ」ではなく、実行中の停止条件に使います。たとえば handoff が3回続いたら、その run を人間確認へ回す。write tool の前に approval span がなければ block する。MCP write の前に catalog entry が見つからなければ止める。ここまで落とすと、監視が運用制御になります。

tool call は name / target / scope を分けて集計する

tool call の監視でよくある失敗は、tool_name だけを見ることです。同じ github tool でも、PR を読むのと issue にコメントするのではリスクが違います。

最低限、次の形で集計します。

{
  "agent_run_id": "agent-20260621-support-triage-0042",
  "tool_name": "github.create_issue_comment",
  "target": "repo:nidoneko/HP",
  "scope": "write:issue_comment",
  "risk_level": "external_write",
  "approval_id": "apr-20260621-09",
  "result": "success",
  "duration_ms": 842,
  "input_tokens": 1290,
  "output_tokens": 180
}

集計軸はこの4つです。

  • tool_name: 何を呼んだか
  • target: どの repo / system / URL に触ったか
  • scope: read / write / admin / external-send のどれか
  • risk_level: 人間承認や停止条件に使う分類

OpenTelemetry GenAI semantic conventions では、tool call id、tool name、tool arguments、provider、model、token usage などを表現する方向が示されています。実務では、そのまま vendor 固有の trace に閉じず、自社の risk level を付け足す方が運用しやすいです。

MCP は server health ではなく scope drift を見る

MCP server の監視を uptime だけで見るのは足りません。AIエージェント運用で怖いのは、server が落ちることより、使うべきでない server や scope が使われることです。

見るべき項目は次です。

項目正常アラート
servercatalog 登録済み未登録 server
version承認済み version未レビュー version
scopetask に必要な最小 scoperead task で write scope
token専用 service account個人 token / token passthrough
response要約ログのみraw PII / secret を監視基盤へ送る

OWASP の Agentic AI threats は、LLM を組み込んだ autonomous system では能力とリスクが拡大することを前提に threat-model-based な整理を求めています。MCP も同じです。server が生きているかより、agent がどの権限で何をしたかを見ないと、運用リスクは下がりません。

アラートは少数の停止条件から始める

最初から高度な異常検知を入れる必要はありません。むしろ、最初は確実に止めるべき条件だけでよいです。

私なら、初期アラートは次の8つに絞ります。

  1. high-risk tool が approval なしで呼ばれた
  2. read-only run で write scope が要求された
  3. 未承認 MCP server が使われた
  4. 同じ tool が同じ target に3回連続失敗した
  5. handoff が3回以上ループした
  6. .env、secret、credential file にアクセスした
  7. 外部送信前に未信頼コンテンツを読んでいた
  8. 1 run の cost が直近中央値の3倍を超えた

このうち 1〜3 は即停止、4〜5 は human review、6〜7 は security review、8 は rate limit / budget review に回します。

alerts:
  high_risk_without_approval:
    severity: critical
    action: pause_run
  read_only_scope_violation:
    severity: critical
    action: block_tool
  repeated_tool_failure:
    severity: warning
    threshold: 3
    action: route_to_human
  cost_spike:
    severity: warning
    threshold: 3x_median
    action: reduce_concurrency

重要なのは、アラート名ではなく action です。通知だけ出して誰も止めないなら、監視ではなく雑音になります。

ダッシュボードは3枚で足りる

AIエージェント監視のダッシュボードを最初から作り込みすぎる必要はありません。私は3枚に分けます。

1. Operations

  • run count
  • completion rate
  • p50 / p95 runtime
  • timeout count
  • queued / running / waiting approval
  • cost per run

これは運用担当が見る画面です。詰まりとコストを見ます。

2. Safety

  • high-risk tool count
  • approval missing count
  • guardrail triggered count
  • forbidden target access
  • secret / credential access
  • external write count

これは security / platform owner が見る画面です。止めるべき挙動を見ます。

3. Product Quality

  • human correction rate
  • reopen / retry rate
  • eval regression after deploy
  • top failure reasons
  • ignored / abandoned runs

これは agent owner が見る画面です。便利さより、実務に耐えているかを見ます。

NIST AI RMF Playbook は Govern / Map / Measure / Manage の各機能に沿った行動例を示しています。本番監視は特に Measure と Manage に寄ります。測るだけでなく、測った結果を権限、運用、再開条件へ戻す必要があります。

prompt を直す前に分類する

本番監視で異常が出ると、すぐ prompt を強くしたくなります。ただし、原因は prompt とは限りません。

失敗分類直す場所
instruction_gapsystem prompt、AGENTS.md、task template
tool_schema_gaptool description、argument schema、examples
permission_gappermission profile、approval policy、scope
mcp_catalog_gapserver owner、version、scope、kill switch
context_gapretrieval、docs、input form
eval_gapsmoke eval、forbidden tool case
runbook_gapalert action、owner、reopen condition

たとえば「agent が GitHub に不要な comment を投稿した」場合、prompt を直す前に見るべき場所があります。write scope が広すぎないか。approval policy が抜けていないか。tool schema が comment と draft_comment を区別できているか。MCP catalog で external write として扱っているか。ここを見ずに prompt だけ直しても再発します。

小さく始める導入順序

最初の2週間なら、この順で十分です。

  1. agent_run_id と trace_id を全 artifact に渡す
  2. run / tool / approval / MCP の4種類だけ構造化する
  3. high-risk tool と external write に risk level を付ける
  4. approval missing と read-only violation を即停止にする
  5. repeated tool failure と handoff loop を human review に回す
  6. cost per run と p95 runtime を見る
  7. 週次で top failure reasons を分類する
  8. 分類結果を eval、permission、MCP catalog、runbook に戻す

この順番なら、最初から高価な AI observability 製品を入れなくても始められます。重要なのは、trace を取ること自体ではなく、trace から止める条件を作ることです。

よくある失敗

1. 成功率だけを見る

成功率が高くても危険な tool を使っている可能性があります。completion rate と safety signal は分けて見ます。

2. raw prompt を監視基盤へ流す

監視しやすくなりますが、機密情報の二次漏洩源になります。通常ダッシュボードは要約、raw payload は短期保持の隔離ログに分けます。

3. アラートに owner がない

critical でも誰が止めるかが決まっていないと意味がありません。alert rule には owner と action を必ず持たせます。

4. eval と本番監視を切り離す

本番で起きた failure reason は、次の eval dataset に戻します。逆に eval で見ている forbidden tool が本番監視にないなら、release gate と runtime gate がずれています。

5. MCP を普通のAPI連携として扱う

MCP は agent が tool として呼ぶため、通常の API uptime だけでは足りません。server、scope、token、tool risk、response handling を一緒に見ます。

まとめ

AIエージェント本番監視の目的は、きれいな trace 画面を作ることではありません。稼働中の agent が、いつ詰まり、いつ権限を超え、いつ外部へ影響しそうかを早く見つけ、止めることです。

監査ログは後から説明するための設計です。評価設計は本番前に落とすための設計です。停止手順は事故後に広げないための設計です。本番監視は、この3つを稼働中につなぎます。

私なら、最初は agent_run_id、trace、tool risk、approval、MCP scope、cost、停止条件だけを入れます。そこまで見えない agent に、write 権限、外部 action、MCP write scope を広げるのは早いです。

参考資料

WRITTEN BY nidoneko

Full-stack engineer with 8+ years of experience in TypeScript, React, Node.js, and cloud-native development across healthcare, finance, HR, and IoT domains.

View Profile →