Eval (評価)
LLM アプリの品質を 継続的に測る 仕組みは不可欠です。 コードのテスト同様、Eval なしの LLM アプリは未テストのコード と思ってください。
Eval の構成
- Goldset (理想解答付きデータ) を作る (50〜500 件)。
- 指標 を定義する:
- 正答率 (exact / contain)
- LLM-as-Judge スコア
- 人手評価サンプル
- レイテンシ / コスト
- プロンプト・モデル変更時に必ず実行。
簡単な eval スクリプト
def eval_prompt(prompt_template: str, cases: list[tuple[str, str]]) -> dict:
correct = 0
rows = []
for inp, expected in cases:
out = run_claude(prompt_template.format(input=inp))
ok = expected.strip() in out
if ok:
correct += 1
rows.append({"input": inp[:50], "expected": expected, "output": out[:80], "ok": ok})
return {"score": correct / len(cases), "rows": rows}
LLM-as-Judge
別の Claude (高性能モデル) に 採点役 をさせる手法。
def judge(question, gold, predicted) -> dict:
prompt = f'''
基準:
- factuality: 0-2 (事実性)
- concision: 0-2 (簡潔性)
- format: 0-2 (形式遵守)
質問: {question}
理想: {gold}
出力: {predicted}
採点を JSON で返してください: {{"factuality": x, "concision": y, "format": z, "comment": "..."}}
'''
res = client.messages.create(
model="claude-opus-4-7",
max_tokens=200,
temperature=0.0,
messages=[{"role": "user", "content": prompt}],
)
import json, re
m = re.search(r"\{.*\}", res.content[0].text, re.DOTALL)
return json.loads(m.group(0))
判定モデルは 被評価モデルと別 にするのが望ましい。
Eval ツール
- Anthropic Workbench: Console 内蔵 (詳細は次レッスン)
- promptfoo: ローカル CLI
- LangSmith: クラウド + 高機能
- Inspect: 安全性評価向け
- Ragas: RAG 専用評価
Regression テスト
- CI で eval を回す。
- 一定スコアを下回ったら fail。
- 失敗例を Goldset に追加して育てる。
# .github/workflows/eval.yml
name: LLM Eval
on: [push, pull_request]
jobs:
eval:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run evals
run: python -m evals.runner --threshold 0.8
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
モニタリング
- Production trace logging: 実際のリクエスト/出力をサンプリング保存。
- 異常検知: 出力長・拒否率・toxicity スコアの傾き。
- ユーザーフィードバック: thumbs up/down を集める。
- 異常時に Slack 通知。
失敗例分析の重要性
スコアが上がっても、特定パターンで劣化する場合があります。 - カテゴリ別 (タスク/言語/長さ) でブレイクダウン - 失敗例を 10 件は手で読む - 新しい失敗パターンが Goldset に追加されているか
試す
Eval 設計を Claude に依頼。
▶ Eval 設計依頼
「請求書 PDF から金額・発行日・取引先名を JSON 抽出」する LLM 機能の評価セットを設計してください。境界ケース 5 種、必須指標 4 つ、判定方法 (exact / fuzzy / LLM-as-judge) を表で。