目次を表示する

AI エージェントを動かし続ける ─ 運用工学の地図

Continuous evaluation in production ─ tail-based sampling と judge drift

Continuous evaluation in production ─ tail-based sampling と judge drift

第1部 ch9 で「3 層 eval(outcome / trajectory / meta)」を扱った。本章では、それをproduction traffic に常時かける運用を扱う。

なぜ「production 上の eval」が必要か

開発時の eval(CI で goldens を回す)だけでは不十分な理由は 3 つ:

  1. ドリフト(ch3):production の入力分布は CI の goldens と違う。日々変化する
  2. エッジケース:CI の goldens は典型ケースのみ。実 production は予想外のリクエストで埋まっている
  3. 判定基準の変化:ユーザーの期待、ビジネス要件、規制が時間経過で変わる

つまり「CI で eval が通った = production で品質が出る」は成立しない。

Continuous evaluation の枠組み

graph TB
    P[Production Traffic]
    Sample[Sampling]
    Eval[Eval Pipeline]
    Storage[(Eval Storage)]
    Dash[Dashboard / Alert]
    Feed[Feedback to dev]

    P --> Sample
    Sample --> Eval
    Eval --> Storage
    Storage --> Dash
    Dash --> Feed
    Feed -.改善.-> P

このループを 毎日 / 1 時間ごとで回すのが Continuous evaluation だ。

軸 1:Sampling 戦略 ── tail-based が標準

production の全リクエストを eval にかけるとコストが破裂する。Sampling が必要だが、ランダムサンプリングは効率が悪い

tail-based sampling」が 2026 の標準パターン:

✅ Tail-based sampling
─────────
- happy path(成功・低コスト):1〜5%
- error / 高コスト / 低 score:100%
- 異常検知 trigger:100%
- 新機能・新モデル:100%

つまり「面白そうなところは全部、退屈なところは控えめに」。これでコストを抑えつつ、品質劣化の早期検知が可能になる。

軸 2:判定 ── LLM-as-judge と human の組み合わせ

LLM-as-judge は安価で速いが、信頼性に問題がある。

判定方式コスト速度信頼性
Human review高($X / 件)遅(hours)
LLM-as-judge低($0.01 / 件)速(s)
Programmatic checkほぼ 0即時高(限定的)

実本番では 3 つを併用する:

✅ Production eval の階層
─────────
Layer 1:Programmatic check(全件)
  - 「答えに必須キーワード A が含まれているか」
  - 「JSON が valid か」
  - 「禁止語句がないか」

Layer 2:LLM-as-judge(5-10% sampling)
  - faithfulness / answer relevancy / context precision(Ragas 系)
  - 閾値:0.85-0.95

Layer 3:Human review(1-2% sampling、または異常時)
  - LLM-as-judge と human の disagreement を月次で測定
  - judge の信頼性が高い領域は human を減らす

軸 3:Judge drift ── 評価器自身が drift する問題

LLM-as-judge は時間経過で drift する。同じ出力に対して、先月は 0.92、今月は 0.85、というように評価が動く。

原因:

  • judge LLM のモデル更新(ch3 のモデルドリフト)
  • judge prompt のドリフト(ch3 のプロンプトドリフト)
  • 評価対象の分布変化(ch3 のデータドリフト)

対策:月次 calibration

✅ Judge calibration の運用
─────────
1. 月初に「calibration set」を作る
   - 過去の human review 済みデータから 100 件抽出
   - human の評価を ground truth とする

2. 現在の judge LLM で同じデータを評価
   - human 評価との一致率を計算
   - ≥ 90%:judge は健全
   - 80-90%:judge prompt の見直し
   - < 80%:判定方式の再設計

3. 月次でこれを繰り返す

これがないと、judge が壊れていることに気づかないまま production の品質が判定されるリスクがある。

軸 4:Capability-based canary

新バージョンの deploy では、全エージェントを一度に切り替えるのではなく、capability ごとにカナリア配布する。

graph TB
    Old[Old Agent v1]
    New[New Agent v2]
    Cap1[Capability A<br/>tool: search]
    Cap2[Capability B<br/>tool: send_email]
    Cap3[Capability C<br/>tool: charge]

    Old -.5%.-> Cap1
    New -.95%.-> Cap1
    Old -.50%.-> Cap2
    New -.50%.-> Cap2
    Old -.99%.-> Cap3
    New -.1%.-> Cap3

各 capability で異なるリスクなので、カナリア比率を独立に制御する。

✅ Capability-based canary の運用
─────────
- 低リスク capability(read 系):新バージョンに 50% 以上で OK
- 中リスク(write 系):5-20%
- 高リスク(不可逆操作):0-1%

評価軸:
- 各 capability の TCR / DQR / TIE / CpT
- 古いバージョンと新バージョンの比較(A/B テスト)
- 異常検知の閾値(baseline -3% で deploy block)

軸 5:Shadow deployment

新バージョンを表に出さず、裏で並行実行して比較」する戦略。

graph LR
    Req[User Request]
    Old[Old Agent]
    New[New Agent shadow]
    Resp[Response to user]
    Cmp[Comparison Storage]

    Req --> Old --> Resp
    Req -.shadow.-> New
    Old --> Cmp
    New --> Cmp

特徴

  • ユーザーには Old の応答を返す
  • New も並列実行し、結果を log
  • 後で Old vs New を比較
  • 副作用がある tool 呼び出しは New 側でモック化

用途

  • 新モデル(GPT-5 → 5.5)の挙動を本番データで検証
  • プロンプト変更のリスク検証
  • 高リスク capability で慎重に評価したいとき

注意点

  • コストが 2× になる(同じリクエストを 2 回処理)
  • 副作用のモックが正確でないと評価が歪む

CI eval と Production eval の二層

第1部 ch9 で示した「3 層 eval」を、運用フェーズで CI と Production の二層に分離する。

graph TB
    Dev[Dev: PR + CI]
    Prod[Production: traffic + eval]
    
    Dev -->|新バージョン| Canary[Canary deploy]
    Canary --> Prod
    Prod -.feedback.-> Dev

    subgraph DevEval["CI eval"]
        D1[Golden dataset]
        D2[Unit eval]
        D3[Regression test]
    end

    subgraph ProdEval["Production eval"]
        P1[Tail-based sampling]
        P2[LLM-as-judge]
        P3[Programmatic check]
        P4[Drift detection]
    end

    Dev --> DevEval
    Prod --> ProdEval

役割分担

  • CI eval:「変更前と変更後で品質が落ちていないか」を見る
  • Production eval:「実トラフィックで品質が維持されているか」を見る

両方が必要。CI だけでは production の現実を映さず、Production だけでは変更時の早期検知ができない。

Online eval の主要ツール

第1部 ch9 でも触れたが、運用フェーズでの選び方を再整理。

ツール強み用途
LangSmithLangChain/LangGraph 純正、trace → eval → デプロイ一気通貫LangGraph 中心の運用
LangfuseOSS、データ主権、API-firstself-host で運用したい
Arize PhoenixOSS、ML-grade な eval、drift detection が成熟drift 重視の運用
Braintrust開発者寄り、CI/CD ゲート、CI と production を統合CI/CD と continuous eval を統合
GalileoLuna-2 蒸留 evaluator、$0.02/1M tokens で常時 eval が経済的に成立大量 production traffic

A/B テストの運用

A/B テストを continuous eval と組み合わせる:

✅ A/B テストの設計
─────────
1. Baseline group:現バージョンに 80%
2. Treatment group:新バージョンに 20%

Eval:
- 各 group の TCR / DQR / TIE / CpT を測定
- 統計的有意性検定(chi-square / t-test)
- 7-14 日間のデータで判定

判定:
- Treatment が baseline 比 +3% 以上 → 段階的に拡大
- Treatment が baseline 比 -3% 以上 → 即時 rollback
- 中間 → 観測継続

「動き続けながら壊れる」を捕捉する

ch2 で「動き続けながら壊れる(fail while continuing to work)」を中核概念に据えた。Continuous evaluation はこれを実装する仕組みだ。

  • 古典 SRE:応答するか / しないか、を白黒で見る
  • Continuous evaluation:応答の質を連続値で見る

これがないと、エージェントは「動いているのに間違っている」状態をalert なしで続ける

❌ アンチパターン:「CI eval だけで production に出す」

症状
─────────
- CI eval は通っているのに、production でクレームが続出
- 本番のエッジケースで失敗するが、誰も気づかない
- judge LLM が drift して評価が当てにならなくなる

根本原因
─────────
- Production traffic 上の eval を組んでいない
- Tail-based sampling を理解していない
- Judge の calibration が無く、judge 自身が壊れていることに気づかない
- A/B テストとカナリアを使っていない

脱出法
─────────
1. CI eval + Production eval の二層に分離
2. Tail-based sampling を実装(happy 1-5%、error 100%、新機能 100%)
3. Judge を月次で calibrate(human review との一致率 ≥ 90%)
4. Capability-based canary + Shadow deployment
5. baseline -3% を deploy block 閾値に

業務投入の観点で重要な 3 点

  1. CI と Production の二層 eval:Continuous evaluation は production 必須。CI だけは変更時の早期検知に閉じる
  2. Tail-based sampling と Judge calibration:「面白いところを 100%、退屈は控えめ」+ 月次で judge を再較正
  3. Capability-based canary:全エージェント一度に切り替えるのではなく、capability ごとにリスクに応じた比率で

次章への接続

ch9 では、ここまでで作った仕組みをインシデント対応の Runbookとして体系化する。「Agent が応答しない」「Agent が間違ったデータを出した」「Agent が暴走している」を 5 分で止められる手順、6 種のインシデント分類、on-call ローテーションを実装の解像度で扱う。


この章のまとめ

  • CI eval だけでは不十分:Production traffic 上の continuous evaluation が必須
  • Tail-based sampling:happy 1-5%、error / 異常時 / 新機能 100%
  • Judge は月次 calibration:human review との一致率 ≥ 90% が健全ライン
  • Capability-based canary:capability ごとにリスクに応じた canary 比率
  • Shadow deployment:高リスク変更は新バージョンを並行実行し裏で比較
  • A/B テストの判定:baseline ±3% を deploy block / promote の閾値に