「AI 開発してます」を見極める 10 の質問 — 素人のための解説|2026-08 版
第 9 章Q7

Q7 LLM の監視・運用

トレース・トークン・レイテンシ・エラー・ドリフト — 何を測れば異常に早く気づけるか

Q7. LLMの監視・運用

本番でLLMの挙動を監視するとき、トレースやトークン数、レイテンシ、エラー、ドリフトなどを実際にどう見ていますか? 異常に早く気づくためにどんなダッシュボードやアラートを組んでいて、そこから改善につなげた経験があれば教えてください。

出典: @voidwarriorchan の投稿(2026-08-25)
この章で分かること

この質問は何を聞いているのか

質問文には専門用語が並ぶ。本番(production)とは開発中の試作ではなく実際のユーザーがLLMを使う環境のことだ。トレース(trace)は「1回のリクエストが処理される一部始終」の記録で、その中の1つ1つの処理ステップをスパン(span)と呼ぶ。レイテンシ(latency)は応答が返るまでの待ち時間、ドリフト(drift)は本番で観測される中身が過去の基準からずれていく現象を指す。ダッシュボードは指標をまとめて表示する画面、アラートはしきい値超過を人へ通知する仕組みだ。

つまりこの質問は、LLMを使ったアプリを動かしっぱなしにするのではなく、「1件のリクエストの中で何が起きているか」「トークンとお金がどれだけ動いているか」「どれくらい待たされているか」「エラーは何が原因か」「入力やモデルの中身が知らぬ間に変わっていないか」の5つを数値として取り出し、しきい値を決めてアラートを組み、改善した経験があるかを尋ねている。ログを流し見するだけでは答えられず、指標設計・アラート運用・改善までの経験がないと具体的に話せない。候補者が「動かして終わり」でなく「動かし続ける」仕組みを構築した経験があるかを測る質問だ。

invoke_agent (ルートスパン) コンテキスト取得 (retriever) 1回目の生成 (generation) ツール実行 (tool) 2回目の生成 (generation) 実行順(時間軸)
図 9-1 1件のリクエスト(トレース)は、実行順に並んだ複数のステップ(スパン)から成る木構造として記録される。生成(generation)の種類を持つスパンが、トークン数・コスト・モデル名を持ち、ストリーミングなら最初のトークンまでの時間(TTFT)も持つ。

各社はこの木構造を少しずつ違う言葉で呼ぶが、指している概念は同じだ。対応関係を押さえておけば、面接で聞かれても混乱しない。

概念OpenTelemetryLangfuseLangSmithPhoenixDatadog
1ステップspanobservationrunspanspan
1リクエストtracetracetracetracetrace
複数ターンの会話gen_ai.conversation.idsessionthreadsessionsession
アプリ単位の入れ物resource / serviceprojectprojectprojectml_app

仕組みの解説① — レイテンシとトークンを測る

レイテンシの内訳 — TTFTとTPOT、prefillとdecode

「応答が遅い」を1つの数字で語ると原因を見誤る。LLMの処理は読み込み段階(prefill)――入力全体を一括で読み込んで理解する処理――と、書き出し段階(decode)――理解した内容をもとに1トークン(= モデルが文章を扱う最小単位)ずつ生成する処理――の2段階に分かれ、レイテンシもTTFT(Time To First Token、最初の1トークンが出るまでの時間)とTPOT(Time Per Output Token、2トークン目以降の1トークンあたりの生成時間)の2つに分けて測るのが標準的だ。OpenTelemetry(以下OTel。特定ベンダーに依存しない、測定用コードをアプリに仕込む=「計装」の共通規格)の定義では、TTFTは「キュー待ち(サーバーで順番待ちしている時間)+prefillの時間」、TPOTは「decode段階の性能」を表す。

出力トークン数がレイテンシを支配する点は見落とされやすい。OpenAIの公式ガイドは「出力トークンを50%減らせばレイテンシもおよそ50%減る」一方、「プロンプトを50%短くしても改善は1〜5%程度」と明記している。「遅い」対策はまず出力を短くする・不要な生成をやめることが効きやすく、プロンプト圧縮の優先度は低い。ストリーミング(トークンを都度クライアントへ送る方式)は体感の待ち時間を最も削る手段として公式が挙げ、「読み始められる時刻」をTTFTまで前倒しできる。

処理段階 prefill decode TTFT ストリーミングなし 応答は最後に一括表示 ストリーミングあり 待ち 生成されるたびに表示 総レイテンシ(最後のトークンまで)
図 9-2 サーバー側は常にprefill(読み込み)の後にdecode(生成)を行う。ストリーミングが無いと応答は最後に一括表示されるが、ストリーミングがあれば最初のトークンが出た時刻(TTFT)から少しずつ読み進められる。

トークンとコストの内訳 — 二重に数えない

入力トークンは一枚岩ではない。プロンプトキャッシュ(prompt caching)――直前までの入力の計算結果を保存し使い回す仕組み――を使うと、1回のリクエストの入力トークンは「キャッシュ読み取り分(cache read)」「キャッシュ書き込み分(cache creation)」「キャッシュに関与しない分」の3種類に分かれる。Anthropicではこの3種類で課金倍率とレート制限(一定時間あたりに送れる量の上限)への算入有無が異なり、読み取り分は基準価格の0.1倍でほとんどのモデルでは入力トークンのレート制限(ITPM = 1分あたりの入力トークン上限)にも数えられない。書き込み分は保持5分なら1.25倍・1時間なら2倍でレート制限に数えられ、残りは基準価格でレート制限に数えられる(いずれも2026-08時点)。ストリーミング中のusageは差分でなく累積値なので、逐次足し算すると二重計上になる。

ここで初心者がつまずくのが、規約によって「入力トークンの合計」の指す範囲が違うことだ。OpenTelemetryのGenAI規約では入力トークン数はキャッシュ分も含めた総和として定義される。一方でAnthropicのAPIが返すinput_tokensは、キャッシュの区切り(cache breakpoint)より後ろのトークンだけを指し、キャッシュ読み取り・書き込み分は含まない。合計はcache_read_input_tokens + cache_creation_input_tokens + input_tokensを自分で足す必要がある。同じ「input_tokens」でも意味が逆なので、ダッシュボードでは集計の定義を揃えないと数字が合わなくなる。

合計入力トークン(OTelのinput_tokens) キャッシュ読み取り 0.1倍・ITPM対象外 書き込み 1.25〜2倍・対象 非キャッシュ入力 1倍・対象 Anthropicの input_tokens はここだけ
図 9-3 入力トークンはcache_read(0.1倍・ITPM対象外)、cache_creation(保持5分なら1.25倍・1時間なら2倍でITPM対象)、非キャッシュのinput_tokens(1倍・ITPM対象)の3種に分かれる(2026-08時点、ITPMの扱いは大半のモデルの場合)。OTelの合計とAnthropic APIの input_tokens が指す範囲が違う点に注意する。

仕組みの解説② — エラー・品質・ドリフトを見張る

エラーとレート制限 — 429は一つではない

429エラー(レート制限やアクセス過多を示すHTTPステータス)は原因によって対応がまったく変わる。一時的なレート制限ならレスポンスにretry-afterヘッダ(待つべき秒数)が付き、SDK(APIを呼ぶための公式ライブラリ)が指数バックオフ(待ち時間を倍々に伸ばす再試行方式)で自動的に再試行する。Anthropicの場合、支出上限(スペンドキャップ)による429にはretry-afterヘッダが付かず、上限解除まで何度リトライしても失敗し続ける。Anthropicはerror.details.error_code(例: enforced_spend_limit_reached)でこの2つを見分けており、OpenAIも429を5つの意味に分け、一時的なレート制限以外の4つにはcredit_balance_exhausted・organization_spend_limit_exceeded・project_spend_limit_exceeded・organization_usage_limit_exceededというコードが付く。急激なリクエスト増加はAnthropicではacceleration limitによる429、OpenAIでは503「Slow Down」として返り、対策はどちらも急にペースを増やさないこと(Anthropic: 徐々にランプアップ、OpenAI: 元のペースに戻し15分維持後に段階的に上げる)である。

もう1つの落とし穴は、ストリーミング応答ではHTTP 200を返した後にエラーイベント(event: error)が来ることがある点だ。HTTPステータスだけで集計すると、ストリーミング中の失敗を取りこぼしてエラー率を過小評価する。

429エラーを受信 原因(エラーコード)で分岐 一時的 支出上限等 急増 一時的なレート制限 バックオフして再試行 支出上限・クレジット枯渇 再試行しても無駄 急増(acceleration) 徐々にランプアップ
図 9-4 同じ429でも意味は一つではない。Anthropicはretry-afterヘッダの有無とerror_codeで、OpenAIはエラーコードで原因を見分ける。一時的レート制限はバックオフして再試行できるが、支出上限・クレジット枯渇は再試行しても失敗し続け、急増(acceleration limit、Anthropicでは429・OpenAIでは503として返る)は徐々にランプアップし一定ペースを保つしかない。
プロバイダ状況retry-after対応
Anthropicrate_limit_error(一時的)ありバックオフして再試行
Anthropicenforced_spend_limit_reachedなし上限解除まで再試行しても失敗し続ける
OpenAI一時的なrate limit付くことがある(付いていれば最低待ち時間として従う)バックオフ+ジッター(再試行の時刻を少しランダムにずらし、多数のクライアントが同時に再試行しないようにする)で再試行
OpenAIorganization_spend_limit_exceeded等(公式に記述なし)付いていても再試行では解決しないユーザー側の対応が必要

品質とドリフト — LLM-as-a-Judgeと2種類の変化

LLM-as-a-Judge(別のLLMを「判定器」として使い、採点基準〈rubric〉に沿って出力の質をスコア化する評価手法)は、本番トレースに継続的に走らせるオンライン評価と、変更前にデータセットへ走らせるオフライン評価の両方で使われる。LangfuseのFAQは、優れた判定モデルは人間の評価者と80〜90%程度一致し、これは人間同士の評価者間一致率と同程度だと説明している。裏返せば判定器も人間と同じ程度にはぶれるので、少数の人手ラベルと突き合わせて較正(calibrate)することを同じFAQが勧めている。判定器自身も小さな機械学習システムとして、継続的な検証の対象になる。

ドリフトは2つの現象を指す。1つは入力データの分布変化――ユーザーの質問の傾向が過去と変わること――で、テキストでは基準期間(reference)と直近期間(current)を区別する2値分類モデル(ドメイン分類器)を訓練し、うまく区別できるほどドリフトが疑われる。もう1つはモデル提供側の変化――モデル自体がプロバイダによって更新・非推奨化・廃止されること――で、Anthropicはライフサイクルを Active(現行)→ Legacy(更新終了)→ Deprecated(非推奨、代替と廃止日を提示)→ Retired(提供終了、失敗する)の4段階で定義し、廃止の少なくとも60日前に通知する(2026-08時点)。

①入力データのドリフト 基準期間 (reference) 直近期間 (current) ドメイン分類器で比較 分類器の判別スコア(ROC AUC)が0.55超でドリフト ②モデル提供側の変化 現行 (Active) 更新終了 (Legacy) 非推奨 (Deprecated) 提供終了 (Retired) 更新停止 移行先提示 60日前に通知
図 9-5 ドリフトには2系統ある。上段は入力データの分布変化(基準期間と直近期間をドメイン分類器で比較)。ROC AUCは2期間をどれだけ区別できたかを0.5(区別不能)〜1(完全に区別)で表す指標で、観測数1,000件超の既定設定では0.55超をドリフトと判定する。下段はモデル提供側の変化(Active→Legacy→Deprecatedで60日前通知→Retired)で、実際に応答したモデル名(gen_ai.response.model)を集計の軸(ディメンション)に持つと切り分けられる。

実務では何をするのか

マネージドAPIを使う場合

AnthropicはUsage & Cost Admin APIを提供しており、トークン使用量は時間バケット(集計の区切り幅。1m=1分/1h=1時間/1d=1日)で、コストは日次(1d)のみで集計できる。データは通常リクエスト完了から5分以内に反映される(遅れることもある。2026-08時点)。1分に1回のポーリング(定期的に問い合わせて取得すること)が想定される。公式ユースケースは「キャッシュ効率の測定」「予算超過アラート」「レート制限の最適化」。Rate Limits APIで現在の制限値を読み取り、使用量と突き合わせて内部アラートを組むことも推奨される。anthropic-ratelimit-*ヘッダ(上限・残量・回復時刻)はリアルタイム監視に使える。OpenAIも同様に時間バケット・グルーピング指定可能なUsage/Costs APIとx-ratelimit-*ヘッダを持つ。

観測基盤・自前ホスティングを使う場合

モデルを自前のサーバーで動かす場合、OpenTelemetryのGenAI規約は「モデルサーバー側」の指標としてgen_ai.server.time_to_first_token(キュー待ち+prefillの時間)とgen_ai.server.time_per_output_token(decode段階の性能)を定義しており、これに沿って計装すればprefillとdecodeの性能を分けて観測できる(まだ「Development」段階=安定版ではない)。Langfuseはこの OpenTelemetry の上に作られており、Phoenix・Datadog も送られたgen_ai.*属性を受け取れる。LangSmith も run(= OTel の span 相当)で同じ概念を扱う。トークン数・モデル名が送られれば価格表からコストを自動計算するが、推論(思考)トークンを使うモデルはトークン数が無いとコストを推定できない。

これらの基盤は監視項目を①運用メトリクス(量・レイテンシのp50/p95/p99〈p95 = 全体の95%がそれより速く、残りの遅い5%がそれより遅い、という境界の値。平均には出ない一部の遅さを表す。p50は中央値、p99は上位1%〉・TTFT・エラー率・トークン・コスト)②トレース(個別リクエストの生データ)③品質スコアの3層で標準ダッシュボードとして用意している。アラートはLangfuse・LangSmithともに対象メトリクス・しきい値・集計ウィンドウを設定して発報する仕組みが用意されている(詳細は後述の表)。サンプリングには、開始時に一定割合だけ残す「head sampling」(速いが失敗トレースを取りこぼす恐れ)と、全スパンを保持してから属性で選別する「tail sampling」(正確だが重い)があり、分散システムではparentbased_traceidratioでトレース単位の一貫性を保つ。

改善につなげる仕組みとして、本番トレースをエラー・低評価スコアや数%サンプリングで注釈キュー(人が見るキュー)やデータセットへ流し込み、人手評価やLLM-as-a-Judgeの較正・比較実験を経てCI(自動テストの仕組み)でリグレッション(以前できていたことができなくなる退行)をブロックしてから再デプロイする、というループを各社が公式機能として用意する。本文はOpenTelemetryの既定では記録されず、記録時はマスキング(送信前に機微情報を伏せる処理)が必要になる。

基盤データソース/対象しきい値ウィンドウ
LangfuseObservations/数値・カテゴリ・真偽スコア警告(WARNING)・アラート(ALERT)の2段階(アラート側は必須、警告側は任意)1時間〜1週間など任意
LangSmithRun数・コスト・エラー・フィードバック・レイテンシ平均/割合/件数で指定5分または15分
Evidently失敗テスト・カスタム条件is_criticalで警告と区別テスト失敗時・メトリクス条件で発報(バッチ/スケジュール実行)

回答を見極めるポイント

良い回答に含まれる要素
弱い回答のサイン

深掘り質問の例

つまずきポイント

HTTPステータスだけでエラー率を測っている。ストリーミング中は200レスポンスの後にエラーイベントが来ることがあり、ステータスコードだけではその失敗を取りこぼしてエラー率を過小評価する。

トークン数を「合計」だけで見て、キャッシュ・推論トークンの内訳を無視している。内訳を見ないとコストやレート制限の消費量を読み違える。

平均レイテンシだけを追いかけ、p95・p99やTTFTを見ていない。平均が正常でも、一部ユーザーの極端な遅さを見逃す。

スパンの名前にモデル名やリクエストIDのような動的な値を入れている。名前基準のダッシュボードのフィルタや評価器は、モデルやIDが変わるたびに静かに機能しなくなる。

理解度チェック

Q1. 「トレース」と「スパン」の違いは何ですか?

トレースは1件のリクエストが処理される一部始終、スパンはその中の1ステップ(LLM呼び出し・ツール実行・検索など)を指す。スパンは親子関係で木構造をなし、複数ターンの会話はLangfuse・Phoenix・Datadogではセッション、LangSmithではスレッド、OpenTelemetryではgen_ai.conversation.id属性として表される。

Q2. TTFTとTPOTはそれぞれ何を表しますか?

TTFTは送信から最初のトークンが出るまでの時間で、キュー待ちとprefill(読み込み段階)の性能を表す。TPOTは2トークン目以降の1トークンあたりの生成時間で、decode(書き出し段階)の性能を表す。

Q3. 429エラーでretry-afterヘッダが無いとき、なぜ単純にリトライしてはいけないのですか?

retry-afterヘッダの有無だけでは判断できない。Anthropicではretry-afterが無い429は支出上限のサインになるが、OpenAIはヘッダに頼らずcredit_balance_exhaustedのようなエラーコードで原因を見分ける。支出上限やクレジット枯渇が原因なら上限解除まで何度リトライしても失敗し続けるため、コードで判別してから対応を決める必要がある。

Q4. LLM-as-a-Judge(判定モデル)を使うとき、判定器自体について何を検証すべきですか?

判定器自体も小さな機械学習システムであり、人手ラベルと突き合わせて一致率を較正・検証する必要がある。優れた判定モデルは人間の評価者と80〜90%程度一致し、人間同士の評価者間一致率と同程度だが、裏返せば判定器も同じ程度にぶれるため較正が欠かせない。

Q5. ドリフトの「2つの系統」とは何ですか?

1つは入力データの分布変化(質問の傾向が過去の基準からずれること)、もう1つはモデル提供側の変化(モデルがプロバイダによって更新・非推奨化・廃止されること)。前者はドメイン分類器などの統計的手法で、後者はライフサイクル通知で検出する。

まとめ

次章のQ8「モデル選定の判断基準」では、ここで見た指標を使ってタスクごとにどのモデルを選ぶかを見る。

参考リンク