Eval-Driven Development — LLM 機能開発は評価から始める#
LLM を使った機能を作る際、目視確認だけに頼ると品質が安定しない。評価を先に書き、評価が通ることを目指して実装するという進め方が、LLM 時代の TDD に相当する。Eval-Driven Development(EDD)と呼ばれる。
通常の開発との違い#
flowchart LR
subgraph 通常開発
C1[コード実装] --> R1[動作確認] --> D1[完成]
end
subgraph EDD
E[評価セット作成] --> I[実装] --> T{評価実行}
T -->|通過| D2[完成]
T -->|不通過| I
end
評価セットの作り方#
1. 成功例と失敗例を両方用意する
期待する入力に対する期待出力だけでなく、失敗すべき入力(例: 悪意のあるプロンプト、曖昧な依頼)も用意する。
2. 評価軸を分離する
1 つの出力に複数の評価軸が絡む場合、軸ごとに別評価にする。
- 事実正確性: 答えが事実として正しいか
- 形式遵守: 指定フォーマットを守っているか
- 安全性: 有害な出力を返していないか
- スタイル: 期待する口調・トーンか
3. LLM-as-Judge を使う
評価者役の LLM を別途立てて、出力の品質を評価させる。主観的な軸(スタイル等)はこの方式が向いている。
flowchart LR
I[入力] --> M[評価対象<br/>LLM]
M --> O[出力]
I --> J[評価者<br/>LLM]
O --> J
J --> S[スコア + 理由]
評価の運用#
1. 回帰検出
プロンプトを書き換えたり、モデルをアップデートしたら、評価セットを再実行して回帰がないか確認する。
2. 閾値設定
合格ライン(例: 成功例 90% 通過、失敗例 100% 検出)を事前に決めておく。主観で「なんとなく良くなった気がする」を避ける。
3. 評価セットの拡張
本番で見つかった失敗ケースは、評価セットに追加する。同じ失敗を二度繰り返さない仕組みにする。
アンチパターン#
- 評価を書かない: 目視だけで「良くなった」と判断する。再現性が保てない
- 評価セットが小さすぎる: 5 件しかないセットで通ったと喜ぶ。本番では 1000 パターンの入力が来る
- 評価セットを更新しない: 最初に作ったまま放置すると、本番で起きている失敗を捕捉できない
- LLM-as-Judge を盲信: 評価者 LLM 自身がバイアスを持つことがある。人間によるスポットチェックを挟む
まとめ#
LLM を使った機能の品質を担保するには、評価を仕組み化するしかない。評価があれば、プロンプトの改善も、モデルの変更も、安心して進められる。評価がなければ、すべて祈りになる。