🎓 レベル:標準 | 重要度:A(必須)
📎 前提:LLMアプリの構成(プロンプト・推論・オーケストレーション) | 関連:評価・ハルシネーション・安全性(機械学習)
⚠️ 要最新確認:モデル単価・評価ツール・ガードレール製品は変化が速い。数値・具体名は執筆時点(2026-06)の例。
要点(BLUF)
- LLM 運用の3つの難所:評価(正解が一意でない出力をどう測るか)・ガードレール(幻覚・危険出力をどう抑えるか)・コスト管理(トークン課金をどう制御するか)。
- 評価は3手法を使い分けます:参照ベース(正解と比較)・LLM-as-judge(別の LLM に採点させる)・人手評価。決定的でない出力には、複数手法と明確な評価基準(ルーブリック)が要ります。
- ガードレールは入力・出力の両側でチェックし、危険・幻覚・逸脱を弾きます。コスト管理はトークン量を監視し、モデルルーティング(簡単な問いは安いモデルへ)やキャッシュで単価を下げます。LLM 評価・安全性の理論は機械学習(評価・ハルシネーション・安全性)へ。
1. なぜ LLM の評価は難しいのか
分類なら「正解と一致したか」で精度が出ます。しかし「この文章を要約せよ」の出力は、正解が一意でなく、複数の良い答えがあります。だから従来の精度では測れません。LLM 評価は「何をもって良しとするか」を明示的に定義することから始まります。
2. 評価の3手法
| 手法 | やり方 | 長所 | 短所 |
|---|---|---|---|
| 参照ベース | 正解例と比較(類似度等) | 自動・安価 | 正解が要る・表現揺れに弱い |
| LLM-as-judge | 別のLLMに基準で採点させる | 柔軟・スケール | 採点者LLMのバイアス・コスト |
| 人手評価 | 人がルーブリックで採点 | 最も信頼できる | 高コスト・遅い |
実務では「LLM-as-judge で広くスクリーニング+人手で抜き取り検証」のように組み合わせます(要最新確認)。
3. ガードレールとコスト管理
flowchart LR IN["ユーザー入力"] --> GI["入力ガード:禁止内容 PII 注入検知"] GI --> LLM["LLM推論"] LLM --> GO["出力ガード:幻覚 有害 形式逸脱を検査"] GO -->|"合格"| OUT["応答"] GO -->|"不合格"| FIX["再生成 or 定型応答"] LLM -.->|"トークン量を計測"| COST["コスト監視・上限"]
- ガードレール:入力側(禁止トピック・PII・プロンプトインジェクション)と出力側(幻覚・有害表現・形式逸脱)の両方で検査する。
- コスト管理:トークン課金なので、入出力トークンを計測し、モデルルーティング(簡単な問いは安いモデル)・キャッシュ(同じ問いは再利用)・上限/アラートで制御する。
4. 動く最小例:コスト試算とルーティング、簡易ガードレール
トークンからコストを試算し、ルーティングで節約する計算と、簡易な出力ガードを実装します(単価は例・要最新確認)。
# モデル単価(1000トークンあたりドル):例。実際は要最新確認
PRICING = {
"small": {"in": 0.0005, "out": 0.0015},
"large": {"in": 0.005, "out": 0.015},
}
def cost(model, in_tokens, out_tokens):
p = PRICING[model]
return in_tokens/1000*p["in"] + out_tokens/1000*p["out"]
def route(query_len):
# 短い・単純な問いは small、長い・複雑は large(簡易ルーティング)
return "small" if query_len < 200 else "large"
# 1000リクエスト:80%が短文、20%が長文と仮定
n = 1000
short, long = int(n*0.8), int(n*0.2)
# 全部 large に投げた場合 vs ルーティングした場合
all_large = short*cost("large", 150, 300) + long*cost("large", 500, 600)
routed = short*cost("small", 150, 300) + long*cost("large", 500, 600)
print(f"全リクエストを large : ${all_large:.2f}")
print(f"ルーティング適用 : ${routed:.2f}")
print(f"削減率 : {(1-routed/all_large)*100:.1f}%")
# 簡易出力ガード:禁止語・最大長・出典の有無を検査
def output_guard(text, has_citation):
issues = []
if any(w in text for w in ["絶対確実", "100%保証"]):
issues.append("過大表現")
if len(text) > 2000:
issues.append("長すぎ")
if not has_citation:
issues.append("出典なし")
return (len(issues) == 0), issues
print("\n出力ガード(健全):", output_guard("MLOpsは運用規律です。", has_citation=True))
print("出力ガード(危険):", output_guard("これは100%保証された結果です。", has_citation=False))
出力:
全リクエストを large : $6.50
ルーティング適用 : $2.72
削減率 : 58.2%
出力ガード(健全): (True, [])
出力ガード(危険): (False, ['過大表現', '出典なし'])
出力の意味:簡単な問い(80%)を安い small モデルにルーティングするだけで、コストを 58.2% 削減できました(単純な問いに高価なモデルを使うのは無駄)。出力ガードは「100%保証」という過大表現と出典欠如を捉えて弾きました——幻覚や過剰な断定をユーザーに届ける前に止めます。コストはルーティング・キャッシュで下げ、品質はガードで守る——これが LLM 運用の2大レバーです(単価は例なので実装時は要最新確認)。
5. 運用の勘所
- 評価基準(ルーブリック)を明文化する:「良い出力」の定義を先に決める。曖昧なまま LLM-as-judge を使っても揺れる。
- ガードを入出力の両側に置く:入力でインジェクション・PII を、出力で幻覚・有害・形式逸脱を検査する。
- コストを監視し上限を設ける:トークン量・リクエスト数を計測し、週次ベースライン超過でアラート。暴走を早期に止める。
- ルーティングとキャッシュで単価を下げる:簡単な問いは安いモデルへ、同じ問いはキャッシュ再利用。
- 回帰評価をCIに入れる:プロンプト/モデルを変えたら、評価セットで品質が落ちていないか自動チェック(MLパイプラインのオーケストレーションとCI/CD/CT)。
なぜそうするのか
評価・ガードレール・コストを運用の柱にするのは、LLM の3大リスク(品質が測りにくい・危険出力・コスト爆発)に直接対応するためです。出力が確率的で正解が一意でないから、評価を明示的に設計しないと品質を管理できません。自信ありげに嘘をつく(幻覚)から、ガードで危険出力を止めないとユーザーに害が及びます。トークン課金で従量だから、監視・ルーティングなしではコストが青天井になります。この3つは LLM を「実験」から「本番運用」に引き上げるための必須装置です。
⚠️ よくある落とし穴
- 評価基準を決めずに測る:何が良い出力か曖昧なまま採点し、結果が信用できない。ルーブリックを先に。
- 出力ガードだけにする:プロンプトインジェクション・PII は入力側で防ぐ必要がある。両側に置く。
- コスト上限・監視がない:暴走・想定外の高負荷でコストが爆発する。計測とアラートを置く。
- 全部を最高性能モデルで処理する:単純な問いに高単価モデルは無駄。ルーティングする。
- LLM評価・安全性の理論をここで詳述する:幻覚の原理・評価指標は機械学習(評価・ハルシネーション・安全性)。
対応 lab
- なし(概念ノート)。コスト試算・ルーティング・簡易ガードは本文 §4。
関連ノート
- LLMアプリの構成(プロンプト・推論・オーケストレーション)(プロンプト/出力の評価対象)
- RAGとベクトルデータベース(検索品質の評価・出典)
- エージェントの運用と評価(軌跡の評価・コスト上限)
- MLパイプラインのオーケストレーションとCI/CD/CT(回帰評価をCIに)
- 評価・ハルシネーション・安全性(機械学習・評価と安全性の理論)
- 第7章 LLM・生成AIの運用基盤 目次
- MLOps・AI基盤 全体目次