エージェント基盤・プロトコル

エージェント可観測性|結果だけ見ると原因は4通り、途中を記録すると1通りに絞れた

エージェントの可観測性とは何を見ることなのか普通のログでは何が足りないのか何を記録すればいいのか

エージェントが「見つかりませんでした」と答えた。でも実際にはデータがある。どこで間違えたのかが分からない——エージェントを運用すると、必ずこの場面に出会います。

今回は同じ失敗を2通りの記録方法で追ってみました。結果だけを見る場合と、途中の各段階を残す場合です。結果を先に言うと、原因の候補が4通りから1通りに絞れました

この記事の要点

  • エージェントは失敗しても止まらない。それらしい答えを返して終わる
  • 結果だけを見ると原因の候補が4通り残り、再現から始めることになる
  • 途中を記録すると1通りに絞れた。実測で確認
  • 記録すべきは判断・ツール呼び出しの引数・その結果の3つ

エージェント可観測性とは何を見ることなのか

答えが正しいかではなく、そこに至る途中で何を判断し何を呼んだかを見ることです。エージェントは失敗しても止まらないため、結果だけでは足りません。

エージェント可観測性で見たいのは、答えに至るまでの過程です。普通のアプリの監視と目的が違うので、まずそこを整理します。

普通のアプリは失敗すると止まる

通常のアプリでは、処理が失敗すればエラーになって止まります。ログにエラーが残るので、失敗したこと自体はすぐ分かります

エージェントは失敗しても答えを返す

エージェントは違います。ツールの呼び出しに失敗しても、その結果を受けて「見つかりませんでした」というそれらしい答えを組み立てて返します。処理としては正常終了です。

つまり、成功した実行と失敗した実行が外から見ると同じ形になってしまう。ここが可観測性を難しくしている点です。

記録の形式については標準化が進んでいます。OpenTelemetryが生成AI向けの記述規約を整備しており、現在は専用のリポジトリへ移管されました。エージェントの処理を記録するための項目も、そこで定義されています。

余談 「動いているか」より「正しく判断しているか」

通常の監視は、応答時間やエラー率といった動作の健全性を見ます。エージェントではそれに加えて、どのツールを選んだか、引数は妥当だったか、という判断の妥当性を見る必要があります。監視項目が1階層増えると考えると分かりやすいと編集部は考えています。

出典OpenTelemetry Semantic Conventions「Generative AI」2026-08-17 確認
GenAI semantic conventions have moved to the OpenTelemetry GenAI semantic conventions repository .
原文OpenTelemetry Semantic Conventions「Generative AI」 この内容の有効期限2026-11-17

原因の候補が4通りから1通りに絞れた

同じ失敗を、結果だけ記録した場合と各段階を記録した場合で追いました。絞り込める範囲がはっきり変わります。

エージェント可観測性の効果を確かめるため、実際に試しました。注文を検索するエージェントが「見つかりません」と答えた場面を再現しています。

下のコードは読み飛ばして大丈夫です。同じ処理を、記録を取らない場合と取る場合の2通りで実行しています。

javascript
function runAgent(trace) {
  const rec = (step, data) => trace && trace.push({ step, ...data });

  rec('plan',      { ok: true,  chosenTool: 'search_orders', reason: '注文の検索が必要と判断' });
  rec('tool_call', { ok: false, tool: 'search_orders', args: { status: 'ACTIVE' },
                     error: 'status に ACTIVE は存在しない(有効値: OPEN/CLOSED)' });
  rec('answer',    { ok: true,  text: '該当する注文は見つかりませんでした' });

  return { finalAnswer: '該当する注文は見つかりませんでした', userSatisfied: false };
}
text
--- 記録なし: 結果だけを見る ---
  最終回答: 該当する注文は見つかりませんでした
  利用者の評価: 未解決
  分かること: 「答えられなかった」という事実のみ
  原因の候補: 質問の解釈ミス / ツール選択ミス / 引数ミス / データ不在 の4通り
--- 記録あり: 各段階を残す ---
  OK  plan       注文の検索が必要と判断
  NG  tool_call  search_orders({"status":"ACTIVE"}) → status に ACTIVE は存在しない(有効値: OPEN/CLOSED)
  OK  answer     該当する注文は見つかりませんでした
  失敗した段階: tool_call
  原因の候補: 1通り(引数の値が不正)

絞れました。4通りから1通りです。しかも直し方まで分かります。有効な値の一覧をツールの説明に書けば済む話でした。

答えは正常、途中だけが失敗している

注目してほしいのは、記録ありの出力で最後の段階がOKになっている点です。答えを組み立てる処理自体は正常に動いています。失敗したのは真ん中だけです。

結果だけを見ていると、この真ん中が見えません。「答えられなかった」という事実から、原因を推測するしかなくなります

記録すべきものは3つ

上の例から分かるとおり、必要なのは3点です。どう判断したか、何を引数に渡したか、何が返ってきたか。この3つがあれば、失敗の箇所と理由がその場で分かります。OpenTelemetryの属性一覧にも、エージェントの説明・識別子・操作名といった項目が定義されています。

記録がないと原因の候補が4つ残る。段階ごとに残せば1つに絞れる。

単位: 通り結果だけを記録4通り各段階を記録1通り−75%同じ失敗を2通りの記録方法で追跡した実測値。候補が1通りなら、再現を試さずに直せる。
図1 ── 記録の有無による原因の候補数
出典OpenTelemetry Semantic Conventions「GenAI Attributes」2026-08-17 確認
Free-form description of the GenAI agent provided by the application.
原文OpenTelemetry Semantic Conventions「GenAI Attributes」 この内容の有効期限2026-11-17

実際に運用するとき何を残すのか

全部を残すと量が膨らみます。判断・引数・結果を常に残し、やり取りの本文は失敗したときだけ残すのが現実的です。

エージェント可観測性を実際に組むときは、記録の量と使い道の釣り合いを取る必要があります。全部残せばよいというものではありません

常に残すもの

  1. どのツールを選んだかと、その理由の要約
  2. ツールに渡した引数。これが最も原因になりやすい
  3. ツールから返ってきた結果。成功か失敗か、失敗ならその内容
  4. 使ったトークン量。費用の把握と、履歴の膨張の検知に使う

失敗したときだけ残すもの

やり取りの本文は量が大きいので、常に保存すると保管費がかさみます。失敗した実行だけ本文を残す方法にすると、量を抑えつつ調査には困りません。

ただし個人情報の扱いには注意が要ります。利用者の入力がそのまま保存されるため、保存する範囲と期間を先に決めておく必要があります。

標準規約は整備の途中

記録の項目名を独自に決めると、後で分析ツールに載せ替えるときに苦労します。OpenTelemetryの生成AI向け規約に合わせておくと移行が楽になります。

ただし現状では、この規約は専用のリポジトリへ移管され、元のページは維持されていないと明記されています。整備が続いている段階なので、採用するときは最新の定義を確認してください。

費用の把握についてはエージェントのコスト制御の記事で扱っています。トークン量の記録は、可観測性とコスト管理の両方で使えます。

余談 失敗を一覧できる状態にしておく

記録を残していても、失敗した実行を後から探せなければ意味がありません。ツールの呼び出しが失敗した実行に印を付けておき、一覧で見られるようにしておくと、問題の傾向が早く見つかります。個別の調査より、同じ失敗が何件起きているかの方が改善の手がかりになります。

出典OpenTelemetry Semantic Conventions「Generative AI」2026-08-17 確認
This page has moved and is no longer maintained in this repository.
原文OpenTelemetry Semantic Conventions「Generative AI」 この内容の有効期限2026-11-17

よくある質問

普通のアプリのログでは足りませんか?
足りません。普通のアプリは失敗すればエラーで止まりますが、エージェントは失敗してもそれらしい答えを返します。結果だけを見ても、成功と失敗の区別がつきません。
全部記録するとコストが心配です
やり取りの本文をすべて保存すると量が増えます。実務では、判断の要約とツールの引数・結果だけを残し、本文は失敗したときだけ保存する方法が使われます。
標準的な記録の形式はありますか?
OpenTelemetryが生成AI向けの記述規約を用意しており、エージェントの処理を記録するための項目も定義されています。ただし専用のリポジトリへ移管されて整備が続いている段階なので、採用時は最新版の確認が必要です。
利用者の入力を保存してよいのですか?
個人情報が含まれる可能性があるため、保存の範囲と期間を決めておく必要があります。判断の経緯だけを残し、本文はマスクするといった設計が現実的です。

まとめ

  • エージェントは失敗しても答えを返すので、結果だけでは判断できない
  • 実測では原因の候補が4通りから1通りに絞れた
  • 記録すべきは判断・引数・結果の3点
  • 標準化はOpenTelemetryの生成AI向け規約で進んでいる

今日から始められること

  1. エージェントがツールを呼ぶ箇所で、引数と結果を記録しているか確認する
  2. どのツールを選んだかとその理由を残しているか確認する
  3. 失敗した実行を後から一覧できるか確認する
  4. 記録に含まれる個人情報の扱いを決める

実務で組んだエージェント可観測性のワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る