AIオブザーバビリティが役立つのは、エンジニアがロールアウトやインシデントの最中にそれをもとに対応できる場合だけです。トークン数やレイテンシーのパーセンタイルが並ぶダッシュボードだけでは、どのリクエストの検証が失敗したのか、なぜフォールバックが発火したのか、あるいはコスト急増がトラフィック、再試行、モデル変更のどれに起因するのかを誰も答えられないなら不十分です。
このAIオブザーバビリティ導入チェックリストでは、問題を次の5つの順序立ったステップに分解します:
- テレメトリ契約を定義する。
- すべてのモデル試行を計測する。
- 品質とコストを検証する。
- サービスレベル目標とアラートを設定する。
- 責任分担とガバナンスを伴ってロールアウトする。
この順序は重要です。まずダッシュボードから始めたチームは、後になってフィールドが不整合であること、トレースが再試行を隠していること、あるいは成功メトリックが使えない出力を正常なリクエストとして数えていることに気づくことがよくあります。
まずシグナルとダッシュボード設計のより広い全体像が必要なら、LLM API observability guideをお読みください。この記事では、実装の順序と各段階の終了条件に焦点を当てます。
ひと目でわかるAIオブザーバビリティ導入チェックリスト
| ステップ | 成果物 | 終了条件 |
|---|---|---|
| 1. テレメトリ契約 | バージョン管理されたイベントおよびスキーマ | 同じリクエストを、アプリ、ゲートウェイ、プロバイダー試行、検証、コスト記録をまたいで結合できる |
| 2. 計測 | メトリクス、トレース、構造化イベント | 再試行やフォールバックを含むすべてのモデル試行が個別に表示され、境界が定められたディメンションを持つ |
| 3. 検証 | アプリケーション成功およびコスト照合パイプライン | 製品契約を通過するまで、200レスポンスは成功と見なされない |
| 4. SLOとアラート | ユーザー中心の目標とランブック | すべてのページに、担当者名、しきい値、最初の診断クエリがある |
| 5. ロールアウトとガバナンス | 段階的デプロイ、保持、アクセス、スキーマの責任範囲 | プロンプト、シークレット、または制御されていないカーディナリティを露出させることなく、本番でテレメトリを有用に使える |
ステップ1: ダッシュボードを選ぶ前にテレメトリ契約を定義する
まず、運用担当者が答えなければならない質問から始め、それらを支える最小限の共通レコードを定義します。契約は、プロバイダーの変更やモデルのフォールバックを耐え抜く必要があります。プロバイダー固有のフィールドはオプション属性として追加できますが、安定した内部名の代わりにはなりません。
必須のリクエストレベルのフィールド
製品操作には1つの内部request_idを使い、分散トレーシングには1つのtrace_idを使います。プロバイダー呼び出しごとにattempt_idを追加します。
{
"telemetry_schema_version": "1.0",
"request_id": "req_...",
"trace_id": "...",
"attempt_id": "attempt_1",
"environment": "production",
"feature": "support_reply",
"route_policy": "quality_primary_cost_fallback",
"provider": "provider_a",
"requested_model": "model_alias",
"response_model": "resolved_model_version",
"prompt_version": "support_reply_v12",
"attempt_number": 1,
"streaming": true,
"status": "completed",
"validation_status": "passed"
}
正確なベンダーのレスポンスでは、異なる名前が使われる場合があります。下流のダッシュボードがプロバイダーごとに個別のクエリを必要としないように、これらのフィールドは境界で正規化してください。
OpenTelemetry は、スパン、メトリクス、イベント向けに生成 AI のセマンティック規約を管理しています。適用できる箇所ではそれらを使いつつ、内部のテレメトリ契約もバージョン管理してください。セマンティック規約は進化し得ますが、インシデント調査のクエリや過去比較は、引き続き理解可能でなければなりません。
制限付きの次元と高カーディナリティな証拠を分ける
メトリクスには制限付きのラベルが必要です。適切な次元には以下が含まれます。
environmentfeatureprovidermodel_familyroute_policystatuserror_typevalidation_status
リクエスト ID、トレース ID、プロバイダーのリクエスト ID、ユーザー ID、プロンプトのフィンガープリント、エラーメッセージは、メトリクスのラベルではなく、トレースまたはログに保持してください。そうしないと、1回のデプロイで数百万の時系列が作成され、監視システムが、監視対象のアプリケーションよりも遅く、あるいは高コストになってしまう可能性があります。
プライバシーモードを明示的に決める
生のプロンプトの取得をデフォルトにしないでください。少なくとも3つのモードを持つフィールドレベルのポリシーを定義します。
| モード | 保存される内容 | 典型的な用途 |
|---|---|---|
| メタデータのみ | バージョン、件数、ハッシュ、タイミング、ルーティング、検証結果 | デフォルトの本番テレメトリ |
| サンプリングしてマスキング | 機密情報とPIIのフィルタリング後の選択されたプロンプト/出力サンプル | デバッグと品質レビュー |
| 制限付きの生データ取得 | 短い保持期間と監査済みアクセスを伴う暗号化ペイロード | 例外的なインシデントまたは評価ワークフロー |
OWASP Logging Cheat Sheet では、アクセス トークン、パスワード、個人情報などの機密データを除外するか保護することが推奨されています。同じ原則を AI テレメトリにも適用してください。可観測性バックエンドが、プロンプトの適切なアーカイブ先であると決して思い込まないでください。
ステップ 1 の終了条件
- バージョン管理されたスキーマが、リクエスト、試行、検証、コストのイベントに対して存在する。
- 再試行とフォールバックでは、別々の
attempt_id値を使用する。 - メトリクスのラベルは上限が定められている。
- プロンプトと出力の取得には、明示的なプライバシーモードがある。
- プロバイダー固有のフィールドは、安定した内部フィールドにマッピングされる。
- スキーマの所有者と変更レビュー担当が割り当てられている。
ステップ 2: 1つの SDK 呼び出しではなく、リクエストの全パスを計測する
トレースは、ユーザー向けの操作から始まり、検索、ルーティング、各モデル試行、検証、ツール実行、永続化へと続くべきです。最後の SDK 呼び出しだけを計測すると、本番障害の大半を引き起こす意思決定が見えなくなります。
有用な span 階層は次のようになります。
POST /assistant/run
├── load_context
├── select_route
├── model_attempt 1
│ ├── stream_first_token
│ └── tool_call weather_lookup
├── validate_output
├── model_attempt 2 fallback
│ └── stream_first_token
└── persist_result
コンポーネントごとにレイテンシを記録する
エンドツーエンドの 1 つの所要時間だけでは、ネットワーク遅延、プロバイダーの生成時間、キューイング、検証、またはツール実行を区別できません。少なくとも、次を取得してください。
- ユーザーから見える総所要時間
- ゲートウェイまたはキューの遅延
- プロバイダーの試行時間
- ストリーミング応答における最初のトークンまでの時間
- 最初のトークンから最後のトークンまでの時間
- 検証時間
- ツール呼び出し時間
ストリーミングでは、最初のトークンの計測開始時点を正確に定義してください。この指標がユーザー体験を表すことを意図しているなら、ルーティング完了後ではなく、サービスがリクエストを受け付けた時点で開始します。
再試行とフォールバックを可視化する
3 回の試行の後に成功した応答は、1 回目の試行で成功した場合と同等ではありません。試行ごとに 1 つの span を出力し、次を含めます。
- 試行番号
- 再試行またはフォールバックの理由
- 直前のエラーカテゴリ
- バックオフ時間
- 選択されたプロバイダーとモデル
- サーキットブレーカーの状態
- 部分的なコンテンツが出力されたかどうか
部分的なストリーミングには特別な注意が必要です。バイトがすでにクライアントに到達している場合、別のモデルに対してリクエストを黙って再実行すると、コンテンツが重複したり、ツール操作に不整合が生じたりする可能性があります。トレースには、システムが停止したのか、整合性を取ったのか、継続したのかを示すべきです。自動フェイルオーバーを有効にする前に、その動作を定義するために LLM API フォールバックルーティングプレイブックを使用してください。
正規化されたイベントからメトリクスを出力する
各統合に個別のカウンターを追加するのではなく、正規化されたリクエストと試行レコードからメトリクスを生成してください。最小限のメトリクスセットは次のとおりです。
ai_requests_total
ai_attempts_total
ai_request_duration_seconds
ai_time_to_first_token_seconds
ai_input_tokens_total
ai_output_tokens_total
ai_validation_failures_total
ai_fallbacks_total
ai_estimated_cost_usd_total
プロバイダーの使用量オブジェクトは、特にキャッシュされたトークンや推論トークンに関して、異なる場合があります。必要に応じて生の使用量オブジェクトを制限付きの診断ストレージに保持しつつ、プロバイダーをまたいだレポートに必要なフィールドは共通のコストレコードにマッピングしてください。
ステップ 2 の終了条件
- 1つのトレースで、プロダクト操作からすべてのモデル試行までをつなぎます。
- ファーストトークンおよびエンドツーエンドのレイテンシには、明確に文書化された開始点と終了点があります。
- リトライ、フォールバック、サーキットブレーカーの判断が可視化されています。
- ツール呼び出しには子スパンと結果フィールドがあります。
- メトリクスは正規化され、バージョン管理されたイベントから導出されます。
- 負荷テストにより、テレメトリが許容できないレイテンシやカーディナリティを生み出さないことが確認されています。
ステップ3: アプリケーション成功を検証し、コストを照合する
トランスポートの成功は、健全性の1つの層にすぎません。AIの応答は HTTP 200 を返しても、空、形式不正、拒否、サポート外、または実行に安全でないため、プロダクト契約を満たせないことがあります。
検証済み成功の状態マシンを定義する
単一の真偽値ではなく、明示的な状態を使用します:
received
→ transport_succeeded
→ parsed
→ contract_validated
→ business_rule_validated
→ accepted
失敗は適切な段階で停止させる必要があります。例えば:
transport_failed
parse_failed
schema_failed
tool_policy_failed
business_rule_failed
cancelled
timed_out
これにより、チームはプロバイダーの可用性とアプリケーション品質を区別できます。主要な信頼性の分母は、通常、生のプロバイダー応答ではなく、受け入れられたユーザー操作であるべきです。
まず決定論的なバリデーターを追加する
主観的なモデル採点を構築する前に、再現可能な結果を返すチェックを実装します:
- JSON またはスキーマのパース
- 必須フィールドの存在
- 許可されたツール名と引数型
- 機能が引用を必要とする場合の引用の存在
- 拒否状態の処理
- 出力長とフォーマットの制限
- 有効な ID、日付、通貨、または enum 値などのビジネスルール
サンプリングしたオフライン評価は、安定したサンプル ID を使って本番のテレメトリに結合します。メトリクスのラベルに、境界のない評価テキストを入れないでください。モデル変更には、レイテンシとコストを受け入れられた出力率と並べて比較できるよう、繰り返し可能な マルチモデル・プロンプトテストワークフロー を使用します。
受け入れ済みタスクあたりのコストを計算する
リクエストあたりのトークンコストは有用ですが、受け入れ済みタスクあたりのコストのほうが運用指標として優れています:
cost_per_accepted_task =
total_cost_of_all_attempts / accepted_user_operations
失敗した試行、リトライ、フォールバック、拒否された出力を分子に含めます。そうしないと、信頼性の問題が説明のつかない粗利の低下として現れます。
2つのコスト状態を維持します:
- 推定コスト は、レスポンスの usage とバージョン管理された価格表から即座に計算します。
- 照合済みコスト は、利用可能になったときにプロバイダーの請求または usage エクスポートから後で更新します。
各見積もりに使用した price_version または有効時刻を保存します。これがないと、価格更新後に過去のコスト変動を説明できなくなります。財務と運用の設計については、AI API支出管理ガイド を参照してください。
ステップ3の退出条件
- 受け入れられた成功はHTTP成功とは別です。
- 決定論的バリデータは、重要な製品契約をカバーします。
- 評価サンプルは本番リクエストと結合できます。
- コストには、拒否された出力を含むすべての試行が含まれます。
- 推定コストと照合済みコストは別のフィールドです。
- 価格バージョンは履歴分析のために保持されます。
ステップ4: ユーザー成果を中心にSLOとアラートを設定する
アラートは、ユーザーへの害や急速に進行する運用リスクを表すべきです。フォールバックがレイテンシ予算内で成功するなら、単一のプロバイダーエラーが必ずしもユーザーに害を与えるとは限りません。逆に、完全に利用可能なプロバイダーでも、使い物にならない結果を生成することがあります。
まず4つのサービスレベル指標から始める
| SLI | 定義例 | 重要な理由 |
|---|---|---|
| 検証済み成功率 | 受け入れられた操作 / 対象操作 | ステータスコードだけでなく、利用可能な成果を捉えるため |
| 初回成功率 | 再試行やフォールバックなしで受け入れられた操作 / 対象操作 | ユーザーが失敗を見る前に、隠れた劣化を検知するため |
| ユーザー可視レイテンシ | 受け入れられた操作のエンドツーエンド所要時間 | ルーティングと検証後の体験を測定するため |
| 受け入れタスクあたりのコスト | すべての試行コスト / 受け入れられた操作 | 信頼性の意思決定を単位経済性に結び付けるため |
目標は機能とリスク階層ごとに設定します。同期型のコーディングアシスタント、バックグラウンドの文書分類器、支払いサポートのワークフローが、同じレイテンシや検証目標を共有すべきではありません。
バーンレートと変更アラートを使う
静的なしきい値はノイズを生みます。ウィンドウとベースラインを組み合わせて使いましょう。
- 高速バーン: 検証済み成功が5〜15分で急激に低下する。
- 低速バーン: エラーバジェットが数時間にわたって消費される。
- 変更アラート: デプロイまたはルートポリシー更新後に初回成功率が低下する。
- コスト異常: トラフィックが安定しているのに、受け入れタスクあたりのコストが上昇する。
- ルーティング異常: フォールバック比率またはプロバイダー構成が予期せず変化する。
- 品質異常: スキーマ、ツールポリシー、またはビジネスルールの失敗がベースラインを超える。
すべてのアラートには、デプロイバージョン、ルートポリシー、プロバイダー、モデル、エラーカテゴリ、検証ステージ、再試行回数、コスト差分を示す最初の診断ビューへのリンクを含めるべきです。
ページング前にランブックを書く
各ページについて、次を定義します。
- 誰がオーナーか。
- どのユーザー影響を意味するか。
- 最初にどのクエリまたはトレースビューを開くか。
- どの最近の変更を確認するか。
- どの安全な緩和策が許可されるか: ロールバック、ルートの無効化、同時実行数の引き下げ、サーキットの開放、または検証済みフォールバックへの切り替え。
- どの証拠でインシデントをクローズするか。
ステップ4の終了条件
- SLOは機能またはリスク階層ごとに定義されている。
- 検証済み成功と初回成功の両方が可視化されている。
- アラートはウィンドウ、ベースライン、またはエラーバジェットのバーンを使用している。
- コスト異常とフォールバック異常には専用のアラートがある。
- すべてのページにランブックと最初の診断クエリへのリンクがある。
- オンコール演習中にアラートのオーナーシップがテストされている。
ステップ5: ガバナンス付きでオブザーバビリティを展開する
インストルメンテーションは本番変更です。段階的に展開し、オーバーヘッドを測定し、データのライフサイクルを実装の一部にしてください。後から追加するポリシーではなく、実装そのものに組み込みます。
段階的なロールアウトを行う
- ローカルおよびテスト: 合成プロンプトを使って、フィールド名、親子 span、マスキング、バリデーターを検証します。
- シャドーテレメトリ: ルーティング判断に影響を与えたり、ページ通知を発生させたりせずに、本番相当のイベントを出力します。
- 小規模カナリア: 本番トラフィックの限定された割合でテレメトリを有効にし、カーディナリティ、取り込みコスト、トレースの完全性を確認します。
- 機能単位のロールアウト: すべてのワークロードに一度に展開するのではなく、製品機能またはルートごとに拡大します。
- 運用開始: ベースラインデータと runbook が整ってから、SLO レポートとアラートを有効化します。
カナリア期間中にテレメトリのオーバーヘッドを測定します。クライアント側のバッチ処理、エクスポーターの失敗、キューの圧迫、そしてオブザーバビリティのバックエンドが利用不可になった場合に何が起こるかを含めて確認してください。非重要なテレメトリエクスポーターが停止したからといって、モデルのリクエストが失敗してはなりません。
保持期間とアクセスを管理する
データクラスごとに保持期間を定義します。
- 集約メトリクスは、通常、より長く保持できます。
- リクエストのメタデータには、文書化された運用上の保持期間を設定すべきです。
- マスキング済みサンプルは、より短い保持期間とより限定的なアクセスを使用します。
- 生のプロンプトや出力は、許可される場合でも、明確な目的、暗号化、監査ログ、削除動作、インシデント手順が必要です。
API キーとプロバイダー認証情報は、すべてのテレメトリ経路から除外してください。シークレットをサーバー側に保存し、ヘッダーや環境変数がイベントにシリアライズされないようにする secure API key management パターンに従ってください。
スキーマとダッシュボードをコードとして扱う
テレメトリのスキーマ、バリデーター規則、SLO 定義、ダッシュボード、アラートをアプリケーションとともにバージョン管理します。ルートポリシーの変更は、同じリリース内で実装とオブザーバビリティの両方を更新する必要があります。
以下それぞれにオーナーを割り当てます。
- スキーマの進化
- マスキングルール
- コスト価格表
- バリデーターのバージョン
- ダッシュボードの正確性
- アラートの調整
- データ保持とアクセスのレビュー
ステップ 5 の終了条件
- シャドー段階とカナリア段階が、安全でないプロンプトの取得なしに完了している。
- テレメトリのオーバーヘッドとエクスポーター障害時の挙動がテスト済みである。
- 保持期間とロールベースアクセスがデータクラスごとに文書化されている。
- シークレットと認可ヘッダーが除外されている。
- スキーマ、バリデーター、ダッシュボード、アラートがバージョン管理されている。
- モデルまたはルーティング更新後に、指名されたオーナーがテレメトリ変更をレビューする。
30 日間の AI オブザーバビリティ展開計画
| 期間 | 重点 | 成果物 |
|---|---|---|
| 1〜5日目 | 契約とプライバシー | Schema v1、フィールド辞書、プライバシーモード、マスキングテスト |
| 6〜12日目 | リクエストパスの計装 | エンドツーエンドのトレース、試行ごとのスパン、正規化されたメトリクス |
| 13〜18日目 | 検証とコスト | 受理済み成功状態、決定論的バリデータ、価格バージョン |
| 19〜24日目 | SLOとランブック | 機能レベルの目標、ダッシュボード、アラートクエリ、緩和策 |
| 25〜30日目 | カナリアとガバナンス | オーバーヘッド結果、保持ルール、責任分担、本番有効化 |
このスケジュールは意図的に順番通り進めるようにしています。最終週にテレメトリ契約が変更された場合は、アラート有効化を一時停止し、まずスキーマを修復してください。不整合なデータでページングすると、誤った安心感を生みます。
よくある実装ミス
HTTP 200 を成功とみなす
修正: 操作が accepted になる前に、解析、契約、ツールポリシー、およびビジネスルールの検証を追加します。
1つのモデルスパンの中にリトライを隠す
修正: 試行ごとに1つの子スパンと1つのコスト記録を作成します。リトライまたはフォールバックの理由を保持します。
デフォルトであらゆるプロンプトをログに記録する
修正: デフォルトはメタデータのみのテレメトリにします。明示的なユースケースがある場合にのみ、サンプリング済みでマスクされたコンテンツを追加します。
リクエストIDをメトリクスラベルとして使う
修正: 高カーディナリティの識別子はトレースとログに保持します。メトリクスには上限のある次元を使います。
価格バージョンなしでコストを見積もる
修正: すべての見積もりに価格表のバージョンまたは有効時刻を付与し、後で突き合わせます。
ユーザーコンテキストなしでプロバイダーエラーに対してアラートを出す
修正: 検証済み成功、レイテンシ、エラーバジェット消費、危険なコスト変化でページングします。プロバイダーエラーは、ユーザーへの影響を引き起こす場合を除き、診断情報として扱います。
よくある質問
AIオブザーバビリティとは何ですか?
AIオブザーバビリティとは、メトリクス、トレース、構造化イベント、検証結果、ルーティング決定、トークン使用量、コストを通じて、モデルリクエストをアプリケーションの成果に結び付ける実践です。AIリクエストは技術的には成功していても、製品としては利用できない場合があるため、通常のAPIモニタリングを拡張したものです。
AIオブザーバビリティのダッシュボードには何を含めるべきですか?
まずは、検証済み成功率、初回成功率、エンドツーエンドレイテンシ、最初のトークンまでの時間、リトライとフォールバックの割合、検証失敗、トークン使用量、受理済みタスクごとのコストから始めます。診断のためにプロバイダーとモデルのビューを追加しますが、主要なダッシュボードはユーザー向け機能に沿ったものに保ちます。
プロンプトやモデル出力はログに記録すべきですか?
デフォルトでは記録しません。通常の本番運用ではメタデータのみのテレメトリを使用します。コンテンツサンプルが必要な場合は、マスキング、サンプリング、暗号化、短期保持、アクセス制御、明確な目的を適用します。秘密情報や認可ヘッダーは絶対にログに記録しないでください。
ストリーミングAI応答はどのように監視しますか?
最初のトークンまでの時間、最初のトークンから最後のトークンまでの時間、キャンセル状態、送信されたバイト数またはトークン数、そして失敗前に部分コンテンツがユーザーに届いたかどうかを測定します。ストリーミング開始後のリトライとフォールバックについて、安全な挙動を定義します。
AI API のコストはどのように監視すべきですか?
可能であれば、入力、出力、キャッシュ、およびその他プロバイダーから報告される使用量を記録し、バージョン管理された価格表を使用して即時見積もりを算出し、その後プロバイダーの請求データと照合します。承認されたタスクごとのコストを追跡し、失敗した試行や却下された出力も可視化されたままにします。
マルチモデルゲートウェイはどこで計測すべきですか?
アプリケーションの操作とゲートウェイの両方を計測します。アプリケーションは出力が有用だったかどうかを把握し、ゲートウェイはどのモデル、プロバイダー、ルート、リトライ、フォールバック、使用レコードによってその出力が生成されたかを把握します。共有のリクエスト ID とトレース ID を使用して、両方のレイヤーを関連付けます。
チェックリストを実践に移す
有用な AI オブザーバビリティへの最短ルートは、さらに多くのダッシュボードを導入することではありません。成功したユーザー操作が何を意味するのかを合意し、それに寄与するすべての試行をトレースし、品質、コスト、ルーティングに関する意思決定を同じ証拠チェーンの中で可視化することです。
Flatkey は、1 つの API キーとエンドポイントを通じて複数の AI モデルへの OpenAI 互換のパスを提供します。マルチモデルアーキテクチャを評価しているチームであれば、まず Flatkey 統合ガイド から始め、次にこのチェックリストを最初の本番機能に適用してください。コストのベースラインとフォールバックルートを定義する前に、現在のモデルアクセスと価格 も確認できます。



