「PoCではちゃんと動いていたのに、本番運用に入って3か月、なんだか回答が変なときがある」——ローカルLLMを社内で運用し始めた企業から、こんな相談が増えています。
クラウドのChatGPTやClaudeなら「ベンダーが品質を保ってくれる」のが前提ですが、自社GPUサーバーでOllamaやvLLMを動かしている場合、応答品質の劣化・推論レイテンシの悪化・GPUのVRAMリーク・幻覚率の上昇を検知できるのは自分たち以外にいません。にもかかわらず、ネットワーク機器なら当たり前に行われている「監視(Observability)」は、ローカルLLMの世界ではまだ標準化されていないのが実情です。
この記事では、25年間ネットワーク監視・障害対応の現場(NOC/TAC)に身を置いてきた筆者の視点から、OpenLLMetry・Langfuse・Prometheus・Grafanaを組み合わせて、PoC卒業後のローカルLLMが「いつの間にか壊れていく」現象を検知する監視基盤の設計を解説します。
- 目次
- なぜローカルLLMには「Observability」が必須なのか
- クラウドLLMとローカルLLMで監視論点が違う理由
- 監視すべき5つのコアメトリクス
- 推奨アーキテクチャ:OpenLLMetry+Langfuse+Prometheus+Grafana
- OpenTelemetry GenAI Semantic Conventionsとは
- Ollamaを計装する具体例(Python)
- Langfuse Self-hostedをDockerで構築する
- 応答品質スコアリング:LLM-as-a-Judge設計
- 幻覚率(Hallucination Rate)をどう測るか
- GPU・VRAM・推論レイテンシのPrometheus監視
- モデル更新時のシャドウテスト構成
- アラート設計:何を、いつ、誰に通知するか
- Grafanaダッシュボード設計(5パネル構成)
- PoC→本番移行チェックリスト(実務版)
- よくある質問(Q&A)
- まとめ——「動いているように見える」が一番怖い
- 参考リンク
目次
- なぜローカルLLMには「Observability」が必須なのか
- クラウドLLMとローカルLLMで監視論点が違う理由
- 監視すべき5つのコアメトリクス
- 推奨アーキテクチャ:OpenLLMetry+Langfuse+Prometheus+Grafana
- OpenTelemetry GenAI Semantic Conventionsとは
- Ollamaを計装する具体例(Python)
- Langfuse Self-hostedをDockerで構築する
- 応答品質スコアリング:LLM-as-a-Judge設計
- 幻覚率(Hallucination Rate)をどう測るか
- GPU・VRAM・推論レイテンシのPrometheus監視
- モデル更新時のシャドウテスト構成
- アラート設計:何を、いつ、誰に通知するか
- Grafanaダッシュボード設計(5パネル構成)
- PoC→本番移行チェックリスト(実務版)
- よくある質問(Q&A)
- まとめ——「動いているように見える」が一番怖い
- 参考リンク
なぜローカルLLMには「Observability」が必須なのか
ローカルLLMの導入は、2024〜2025年にかけて中堅企業まで広がりました。社内文書の検索、議事録要約、カスタマーサポートの一次対応——用途は様々ですが、PoCを終えて本番運用に入った企業から、共通して聞こえてくる悩みがあります。
「動いてはいるけど、品質が安定しているか、誰も自信を持って言えない」
この問題は、技術的にはクラウドAPIにも存在します。しかしクラウドの場合、ベンダー側がモデルの品質保証・SLA・冗長化を担保してくれるため、利用者側は「使えればOK」と割り切れます。一方、ローカルLLMは違います。モデルの運用責任を100%自社で負うのです。これは、自社データセンターでネットワーク機器を運用する場合と同じ構造で、監視(Observability)が無いとそもそも「正常か異常か」すら判断できません。
2026年時点で、日本語の「ローカルLLM構築・チューニング」記事は十分に出揃いました。しかし「本番運用後の品質監視・ドリフト検知」については、ほぼ空白地帯のままです。本記事はその空白を埋めることを目的としています。
クラウドLLMとローカルLLMで監視論点が違う理由
同じ「LLMOps」と言っても、クラウド前提とローカル前提では、監視すべき項目がかなり違います。
| 監視論点 | クラウドLLM(ChatGPT/Claude API) | ローカルLLM(Ollama/vLLM) |
|---|---|---|
| レイテンシ | ネットワーク往復+ベンダー側処理 | 自社ハードウェアの処理時間に直結 |
| GPU使用率・VRAM | 監視不可(ベンダー側) | 必須監視項目 |
| モデル更新 | ベンダーが管理(API互換性のみ気にする) | 自社でロールアウト・回帰テスト必要 |
| 量子化精度劣化 | 無関係 | 4bit/8bit量子化で発生する固有問題 |
| オフライン環境 | そもそも動かない | テレメトリ送信先を内部に持つ必要 |
| 応答品質ドリフト | ベンダーが原因の場合は対処不能 | 自社で検知・改善できる |
| コスト管理 | トークン課金 | 電気代・ハードウェア減価償却 |
特に「GPU・VRAM」「量子化精度劣化」「オフライン環境」の3点は、クラウドLLM前提のLLMOps記事では扱われない、ローカルLLM固有の論点です。
監視すべき5つのコアメトリクス
ローカルLLM運用で最低限押さえるべきメトリクスは、以下の5つです。
1. 推論レイテンシ(TTFT / TPS)
- TTFT(Time To First Token):プロンプト投入から最初のトークンが返るまでの時間
- TPS(Tokens Per Second):1秒あたりに生成されるトークン数
ユーザー体験に直結する指標で、これが悪化するとチャットUIの体感品質が一気に落ちます。p50・p95・p99の各パーセンタイルで追うのが基本です。
2. GPU VRAM使用率・温度
VRAMリークが発生すると徐々に空きが減り、ある瞬間にOOM(Out of Memory)でモデルがクラッシュします。nvidia-smi由来のメトリクスをPrometheusに流して、しきい値ベースで監視します。
3. 応答品質スコア(LLM-as-a-Judge)
サンプリングした応答を、別のLLM(より強力なモデルやクラウドAPI)に「これは適切な回答か」を採点させる仕組みです。0〜1のスコアで継続的に追跡し、ベースラインからの乖離を検知します。
4. 幻覚率(Hallucination Rate)
RAG構成の場合、「検索結果に存在しない情報を生成した割合」として測定可能です。RAGなしの場合は、ファクトチェック可能な質問セットを用意して定期実行します。
5. コンテキスト長利用率
「投入プロンプト+出力」がモデルのコンテキストウィンドウのどの程度を消費しているか。これが90%を超えると応答品質が急落することが知られており、早期警告指標として有用です。
推奨アーキテクチャ:OpenLLMetry+Langfuse+Prometheus+Grafana
4つのツールを役割分担させた構成が、2026年時点では最も実用的です。
| レイヤ | ツール | 役割 |
|---|---|---|
| 計装(SDK) | OpenLLMetry(OpenTelemetryベース) | LLM呼び出しを自動でトレース化 |
| LLMトレース蓄積 | Langfuse Self-hosted | プロンプト・応答・スコアを記録 |
| メトリクス収集 | Prometheus + node_exporter + nvidia_gpu_exporter | レイテンシ・GPU・システム指標 |
| 可視化・アラート | Grafana + Alertmanager | ダッシュボード・通知 |
すべてOSS/Self-hostedで構築可能なため、オフライン環境(社内ネットワーク内に閉じたい医療・金融・行政用途)でも完結します。これがローカルLLMを選んだ企業にとっての大きなメリットです。
OpenTelemetry GenAI Semantic Conventionsとは
OpenTelemetryコミュニティでは、LLMの計装に関する標準仕様「GenAI Semantic Conventions」を策定しています。これに従うことで、ベンダー固有のロックインを避けつつ、gen_ai.request.model、gen_ai.usage.input_tokens、gen_ai.response.finish_reasonなどの標準属性でトレースを残せます。
OpenLLMetry(Traceloop社が開発するOSS)は、この仕様に準拠したPython/Node SDKで、Ollama・OpenAI互換API・Anthropic・Cohere・LangChainなど主要なLLMライブラリを自動計装します。
Ollamaを計装する具体例(Python)
Ollamaを使った推論コードに、OpenLLMetryで計装を追加する最小例です。
pip install traceloop-sdk ollama
from traceloop.sdk import Traceloop
from traceloop.sdk.decorators import workflow, task
import ollama
# Langfuseへ送信する設定
Traceloop.init(
app_name="local-llm-prod",
api_endpoint="http://langfuse.internal:3000/api/public/otel",
api_key="lf_pk_xxx_lf_sk_xxx",
)
@workflow(name="rag_qa_workflow")
def answer_question(question: str, context: str) -> str:
return _generate(question, context)
@task(name="ollama_generate")
def _generate(question: str, context: str) -> str:
response = ollama.chat(
model="llama3.1:8b-instruct-q4_K_M",
messages=[
{"role": "system", "content": f"以下の文脈に基づいて回答してください:\n{context}"},
{"role": "user", "content": question},
],
)
return response["message"]["content"]
if __name__ == "__main__":
print(answer_question("当社の有給休暇は何日ですか?", "就業規則第15条..."))
これだけで、すべてのLLM呼び出しがOTLPプロトコルでLangfuseへ送られ、プロンプト・応答・トークン数・レイテンシが自動記録されます。
Langfuse Self-hostedをDockerで構築する
Langfuseは公式にSelf-host用のDocker Composeを提供しています。最小構成は以下のとおりです。
# docker-compose.yml(最小例)
version: "3.8"
services:
langfuse-db:
image: postgres:15
environment:
POSTGRES_USER: langfuse
POSTGRES_PASSWORD: changeme
POSTGRES_DB: langfuse
volumes:
- langfuse_db:/var/lib/postgresql/data
langfuse:
image: langfuse/langfuse:latest
depends_on: [langfuse-db]
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://langfuse:changeme@langfuse-db:5432/langfuse
NEXTAUTH_URL: http://langfuse.internal:3000
NEXTAUTH_SECRET: $(openssl rand -base64 32)
SALT: $(openssl rand -base64 32)
TELEMETRY_ENABLED: "false" # 外部送信を無効化(オフライン要件)
volumes:
langfuse_db:
TELEMETRY_ENABLED: "false"を明示することで、Langfuse自体の利用統計が外部に送信されることを止められます。社内ネットワーク完結を求める運用ではこの設定が必須です。
応答品質スコアリング:LLM-as-a-Judge設計
応答品質を数値化する手法として、LLM-as-a-Judgeが事実上の標準になっています。手順は以下の通りです。
- 本番ローカルLLMの応答を、ランダムサンプリング(例:1%)でLangfuseに記録
- Judge用に別モデル(より強力なローカルLLM、または社内ポリシーで許容されるならクラウドAPI)を用意
- 「以下の質問に対する回答を、関連性・正確性・有用性の3軸で各1〜5点で評価せよ」というプロンプトでJudgeを実行
- スコアをLangfuseの
scoresAPIで該当トレースに紐付ける - 日次・週次の平均スコアを追跡し、ベースラインから2σ以上下振れしたらアラート
注意点として、Judge側のモデルが変わるとスコア基準も動くため、Judgeのモデルは固定し、変更する際は移行期間を設けて新旧並行で評価する必要があります。これはネットワーク監視で「監視サーバの時刻同期がずれると全アラートが信用できなくなる」のと同じ構造です。
幻覚率(Hallucination Rate)をどう測るか
幻覚(Hallucination)の自動検出は2026年時点でも完璧な手法はありませんが、運用上は以下の組み合わせで「だいたい捕まえる」ことが可能です。
| 検出手法 | 適用シーン | 精度感 |
|---|---|---|
| RAG文脈との照合(出力中の固有名詞・数値が検索結果に含まれるか) | RAG構成 | 高 |
| ファクトチェック質問セット定期実行(答えが既知の100問を毎日投げる) | すべての構成 | 中 |
| Self-Consistency(同じ質問を複数回投げて回答の分散を見る) | すべての構成 | 中 |
| LLM-as-a-Judge による事実性評価 | RAG+外部知識 | 中〜高 |
運用上のコツは「幻覚率を絶対値で評価しない」ことです。モデルやドメインによってベースラインが異なるため、初期の1〜2週間で平常値を測定し、そこからの相対変化(例:先週比+30%)で異常検知するほうが実用的です。
GPU・VRAM・推論レイテンシのPrometheus監視
システムレイヤの監視はPrometheusに任せます。GPU監視はnvidia-gpu-exporterまたはdcgm-exporterを使うのが定番です。
# prometheus.yml
scrape_configs:
- job_name: "node"
static_configs:
- targets: ["llm-server:9100"]
- job_name: "nvidia_gpu"
static_configs:
- targets: ["llm-server:9835"]
- job_name: "ollama"
metrics_path: /metrics
static_configs:
- targets: ["llm-server:11434"]
監視すべき主要メトリクス:
nvidia_gpu_memory_used_bytes:VRAM使用量(リーク検知)nvidia_gpu_temperature_celsius:GPU温度(85℃超で警戒)nvidia_gpu_utilization_ratio:GPU使用率(常時95%超ならスケール検討)node_load1:CPU負荷(CPUオフロード時に重要)llm_request_duration_seconds_bucket:推論レイテンシのヒストグラム
「VRAMが時間とともに単調増加していたら、それはリーク」というのは、ネットワーク機器のメモリリーク監視と全く同じ思想です。
モデル更新時のシャドウテスト構成
Llama 3.1 → 3.3、あるいはGemma 2 → Gemma 3のようなモデル更新は、性能向上が期待される一方で、特定タスクで回帰(regression)することがしばしばあります。これを安全に検知するための構成が「シャドウテスト」です。
┌──────────────────────┐
user ──→ │ アプリケーション │ ──→ user
│ (応答は旧モデルから) │
└─────────┬────────────┘
│
┌───────┴────────┐
▼ ▼
┌──────────┐ ┌──────────┐
│ 旧モデル │ │ 新モデル │ ← シャドウ
│ (本番) │ │ (評価のみ)│
└────┬─────┘ └────┬─────┘
│ │
└────→ Langfuse ←──┘
│
▼
LLM-as-a-Judge
で新旧比較
本番応答は従来モデルから返しつつ、同じプロンプトを新モデルにも投げて両方をLangfuseに記録します。一定期間(例:2週間)の比較データを集めてから、Judgeで新旧の品質を評価し、勝率が一定以上なら新モデルへ切り替える——という運用フローです。
この発想自体は、ネットワーク機器のIOSアップグレード前に「ラボ環境で同等トラフィックを流して回帰テストする」のと同じです。LLMの世界でも同様のリスク管理が必要になってきました。
アラート設計:何を、いつ、誰に通知するか
アラートは「鳴りすぎても・鳴らなさすぎても」失敗します。NOC運用の経験から言える鉄則は「Severityを3段階に分ける」「日中と夜間で通知先を分ける」の2点です。
| Severity | 条件例 | 通知先 |
|---|---|---|
| P1(即対応) | サービス完全停止/VRAM 95%超/応答エラー率10%超 | 24/7オンコール(電話) |
| P2(営業時間内対応) | レイテンシp95が直近7日平均の2σ超/品質スコアがベースライン-15% | Slack #llm-ops(メンション) |
| P3(記録のみ) | 幻覚率が先週比+10%/コンテキスト長利用率の上昇傾向 | Slack #llm-monitoring(メンションなし) |
Prometheus Alertmanagerのルール例:
# alerts.yml
groups:
- name: llm_critical
rules:
- alert: LLMVramHigh
expr: (nvidia_gpu_memory_used_bytes / nvidia_gpu_memory_total_bytes) > 0.95
for: 5m
labels:
severity: P1
annotations:
summary: "GPU VRAM使用率が95%を超過(リークの可能性)"
- alert: LLMLatencyHigh
expr: histogram_quantile(0.95, rate(llm_request_duration_seconds_bucket[5m])) > 5
for: 10m
labels:
severity: P2
annotations:
summary: "推論レイテンシp95が5秒を超過"
Grafanaダッシュボード設計(5パネル構成)
Grafanaダッシュボードは、運用者が「3秒で異常に気づける」ことを目標に設計します。推奨パネル構成は以下の5つです。
- サービス可用性:直近24時間の成功率・エラー率(Stat panel)
- レイテンシ:TTFT/TPSのp50/p95/p99(Time series panel)
- GPU状態:VRAM使用率・温度・GPU使用率(Gauge+Time series)
- 品質スコア推移:LLM-as-a-Judge平均スコアの日次推移+7日移動平均(Time series)
- 幻覚率・コンテキスト長:幻覚検知件数とコンテキスト消費率(Time series)
このダッシュボードを大型モニタに常時表示し、運用チームが朝会の最初に1分眺める運用にするだけで、品質劣化の早期発見率は大きく上がります。これも、ネットワーク監視のNOC壁面ダッシュボードと同じ思想です。
PoC→本番移行チェックリスト(実務版)
ローカルLLMをPoCから本番に移行する際、Observability観点で最低限揃えておきたい項目をチェックリスト化しました。
- ☐ OpenTelemetry互換のSDK(OpenLLMetry等)でアプリケーションを計装している
- ☐ Langfuse等のLLMトレース基盤に全リクエストの最低1%をサンプリング保存している
- ☐ GPU・VRAM・温度をPrometheusで5分以下の粒度で収集している
- ☐ 推論レイテンシのヒストグラムからp50/p95/p99を算出できる
- ☐ 応答品質を継続評価する仕組み(LLM-as-a-Judge等)が動いている
- ☐ 「答えが既知」のファクトチェック質問セット(50〜200問)を用意し、日次実行している
- ☐ アラートをSeverity別に分け、P1の通知先と一次対応者が決まっている
- ☐ モデル更新時のシャドウテスト・ロールバック手順がドキュメント化されている
- ☐ Grafanaダッシュボードが運用チームに共有されている
- ☐ 監視基盤自体の冗長化(少なくともバックアップ)を検討している
よくある質問(Q&A)
Q1. クラウドAPIの監視ツール(Datadog LLM Monitoring等)でローカルLLMも監視できますか?
技術的には可能ですが、ローカルLLMを選んだ理由が「データを外に出したくない」場合、テレメトリの送信先がクラウドになるDatadogやNew RelicのSaaS版は要件を満たさないことが多いです。Self-hostedで完結するLangfuse+Prometheus構成を推奨します。
Q2. Langfuseのライセンスは商用利用可能ですか?
Langfuseはコア部分がMITライセンスのOSSで、Self-hostedでの商用利用が可能です。一部のEnterprise機能(SSO等)は有償プランが必要なため、利用予定の機能をライセンスで確認することを推奨します。
Q3. LLM-as-a-Judgeにクラウドのモデルを使うと、結局データが外に出るのでは?
その通りです。要件としてオフライン完結が必須の場合、Judge側もローカルLLM(より強力なモデル、例:本番が8Bなら70Bモデル)を使う必要があります。GPU資源との兼ね合いになりますが、夜間バッチで評価を回す運用なら現実的です。
Q4. 量子化(4bit/8bit)すると品質が下がると聞きますが、監視で検知できますか?
はい、本記事の応答品質スコアと幻覚率のメトリクスで検知可能です。量子化前後で同じ評価質問セットを実行し、スコアの差分を見るのが定石です。一般に4bit量子化はタスクによって5〜15%程度の品質劣化が報告されており、用途によっては許容できないこともあります。
Q5. 個人や小規模チームでも、ここまでの監視基盤は必要ですか?
用途次第です。個人開発や社内の限定ユーザー向けPoCであれば、Langfuseだけでも十分です。一方、社外ユーザーに使わせる場合や、業務に組み込む場合は、本記事レベルの監視基盤は最低ラインとして推奨します。
まとめ——「動いているように見える」が一番怖い
ネットワーク機器の運用現場で何度も目にしてきたのは、「障害が起きた瞬間より、ジワジワと劣化していくほうが対応が遅れる」という現象です。ローカルLLMにも、まったく同じことが起きます。
VRAMがゆっくりリークしていく、量子化モデルが特定タスクで徐々に幻覚を増やす、モデル更新で一部のFAQへの回答が劣化する——これらは、Observabilityがなければ「ユーザーから苦情が来てから気づく」事象です。
2026年、ローカルLLMはPoCから本番運用のフェーズに入ります。「動いているように見える」状態を許容しないこと。それが、ローカルLLMを長く・安全に運用するための第一歩です。
本記事で紹介したOpenLLMetry+Langfuse+Prometheus+Grafanaの構成は、すべてOSSで構築可能で、社内ネットワーク完結も実現できます。まずは1つのモデル・1つのユースケースから、「品質スコアの日次推移」を可視化することから始めてみてください。
参考リンク
- OpenTelemetry GenAI Semantic Conventions(公式)
- OpenLLMetry(Traceloop社)
- Langfuse Self-hosting Documentation
- nvidia_gpu_exporter(Prometheus用GPUエクスポーター)
- NVIDIA DCGM Exporter
- Ollama公式
- Prometheus Alertmanager Documentation
免責事項: 本記事は2026年5月時点で公開されている情報・経験に基づく一般的な設計ガイドであり、特定の製品・バージョンでの動作を保証するものではありません。実装にあたっては、各ツールの最新ドキュメントおよび自社のセキュリティ・コンプライアンス要件をご確認ください。

コメント