出力品質の評価(lait eval)
ワークフロー/モデル+プロンプトを実際に実行し、contains/jq/llm_judge のアサーションで出力品質を評価する方法。
lait eval は、ワークフローまたはモデル+プロンプトテンプレートを実際のモデルに対して実行し、その出力がテストケースの期待(文字列包含・jq式・LLMによる採点)を満たすかどうかを評価します。
eval 定義と、それが参照する workflow・agent・schema・設定ファイルの読み込み中も Ctrl-C で 実行を中断できます。実行時に読み込む各ファイルは最大16 MiBです。
決定的テスト(lait test)が「制御フローが壊れていないか」を replay で確認する(LLM API へのリクエストを再送しない)のに対して、lait eval は「今のモデル/プロンプトの出力品質が保たれているか」を確認するための仕組みで、常に実際のモデルへ接続します。プロンプトやワークフローの変更が品質を下げていないかを確認する回帰テストとして、モデル更新が頻繁なローカル LLM 運用で特に有用です。
使い方
$ lait eval eval.yml
case 1: 3/3 (100%) PASS
3 of 3 case(s) fully passed
eval.yml のスキーマ
target:
workflow: ./summarize.yml # または model + prompt テンプレート
cases:
- input: "..."
assert:
- type: contains # 文字列包含
value: "結論"
- type: jq # jq 式が真偽値として真であること
expr: '.title | length > 0'
- type: llm_judge # LLM による採点
criteria: "要約が原文の主旨を保っているか"
model: gemma-4-12b
threshold: 0.7
target: は次のいずれか一方の形式を取ります。
| 形式 | 説明 |
|---|---|
workflow: <path> |
このeval.ymlファイルからの相対パスにあるワークフローファイルを、各ケースのinputを初期入力(lait run の PROMPT と同じく、ワークフローの input_schema: に従って解釈)として実行する。ワークフローが inputs: を宣言している場合は、target.inputs: に値を書ける(例: target: {workflow: ./summarize.yml, inputs: {lang: ja}})。 |
model: <name>/prompt: <template> |
prompt: は{{ input }}を参照できるテンプレートで、ケースごとにレンダリングして単発のモデル呼び出しを行う。 |
その他のフィールドは次のとおりです。
| フィールド | 説明 |
|---|---|
cases[].input |
そのケースの入力文字列。 |
cases[].assert |
そのケースの出力に対するアサーションのリスト。lait testのassert:と語彙を共有しており、equals(完全一致)も使えます。 |
assert: の type: に指定できる値は次のとおりです。
type |
説明 |
|---|---|
contains |
出力にvalueが部分文字列として含まれること。 |
jq |
exprを出力に対して評価し、真(jqの真偽値ルール — false/null以外はすべて真)であること。出力がJSONとしてパース可能ならそのJSON値、そうでなければ生文字列をJSON文字列値として評価対象にする。 |
llm_judge |
criteriaをもとにLLMに0.0〜1.0でスコアを付けさせ、threshold(省略時0.7)以上ならpass。modelを省略した場合はevalのtargetが使っているモデル(target.model、またはワークフローのdefault.model)にフォールバックする。判定はStructured Outputsで{"score": number, "reasoning": string}を1回のモデル呼び出しで取得して行う。 |
tool_called/usage/step_output |
実行トレースを参照する trajectory アサーション(決定的テストを参照)。 |
--repeat・複数ケースは並行実行されますが、各 (ケース, リピート) は専用の実行コンテキストを持つため、他のケース/リピートのイベントやトークン使用量が混ざることはありません。
--repeat N
モデルの非決定性を考慮し、各ケースをN回実行してケースごとの成功率を表示します(省略時は1回)。
$ lait eval --repeat 5 eval.yml
case 1: 4/5 (80%) FAIL
run 2: assertion 1: jq expression `contains("結論")` was false for output "..."
0 of 1 case(s) fully passed
いずれかのケースの成功率が100%未満の場合、lait eval全体の終了コードは非ゼロになります。
--format json
$ lait eval --format json eval.yml
ケースごとにcase/input/passed/total/success_rate/runs(各実行のpassed/failures)を持つ配列を出力します。CI での自動判定に利用できます。