コンテンツにスキップ

モジュール XII — 品質、評価、テスト

モジュール XII は一つの問いに答えます — 自分のエージェントはまだ正しいことをしているか? — 候補出力をバージョン管理されたゴールデンスイートに対してスコアリングし、その結果を正規の モジュール横断エビデンスとして発行することによって。これは Intelligence レイヤーのモジュールです: 測定するだけであり、対象を実行することも、インフラに作用することもありません。本ページは、 評価モジュールが現在何を行うか、そしてその誠実な限界についてのリファレンスです。

何を測定するか(そして何を決して実行しないか)

Section titled “何を測定するか(そして何を決して実行しないか)”

XII は測定レイヤーであって、実行レイヤーではありません。候補出力は既に生成された状態で XII に 到達します — テストサンドボックス(モジュール XVII)から、CI から、リクエスト内のインラインで、 あるいはサンプリングされた実セッションのシグナルとして — そして XII はそれをスイートのケースに 対してスコアリングします。XII が呼び出す唯一のモデルはジャッジです(llm_judge スコアラー 用); 対象のエージェントやモデル自体を実行することは決してありません。出力の生成はサンドボックスの 仕事であり、XII の仕事ではありません。

スコアラーのセットはプラグ可能です。決定論的で純粋な組み込みスコアラーが一般的な契約を カバーします — exact、contains、not_contains、regex、json_valid、json_equal、 numeric_range。それらと並んで、Judge ポートを通じてモデルを呼び出しルーブリックに対して採点する llm_judge スコアラーが存在します。

スイート、ラン、そして正規のアーティファクト

Section titled “スイート、ラン、そして正規のアーティファクト”

スイートはバージョン管理されたゴールデンデータセットです: そのケース、デフォルトスコアラー、 合格しきい値、回帰しきい値を保持します。ケースはバージョンごとに追記専用かつ不変です — ケースの 修正は新しい suite_version を発行するのであって、その場での編集ではありません。そのため、過去の いかなる判定を生み出したデータセットも常に再構築可能です。

ランはスイート内の各ケースをスコアリングし、score と pass_rate を集約し、3 つのものを 永続化します: 追記専用のケースごとのエビデンス、可変なラン集約、そして 1 つのコア EvalResult — 正規のアーティファクト(Suite、SubjectKind、SubjectID、Score、 Passed、OccurredAt、Metrics)であり、コンプライアンス(XIII)と UI が XII 自身の テーブルを知ることなく読み取ります。ランは同期的に実行されます; ラン上の SSE ストリームは 永続化されたランをリプレイするもの(ケースごとのフレーム、その後サマリー)であって、作用は しません。回帰は 1 件のベースラインランとの比較です。スコアの低下がスイートの regression_threshold を超え、かつ合格率の差の 95% 区間(Newcombe 法、Wilson 区間の差)が 0 を含まない場合に、ランは regressed をセットし、コア Finding (Kind = eval_regression)を書き込みます。しきい値を超える低下でも区間が 0 を含む場合は、 回帰ではなく inconclusive_noise と記録されます。比較には区間と双方の分母が表示されるため、 小さなスイートでは検出される Finding が減ります。自動ベースラインは、 同じスイートと同じサブジェクト、バリアントが指定されている場合は同じバリアントの、 直近の完了ラン(inconclusive_noise と記録されたランを除く)です。そのランは別のスイートバージョン、モデル、またはスコアラーを 使っていることがあり、比較はどれが変わったかを報告しません。スイートバージョンを 変えた後は、明示的なベースラインを渡すか、1 件をピンしてください(POST /baselines)。 Finding は、デリバリーモジュール(ヘルス/通知)がルーティングできるよう、 ベストエフォートで finding.reported としてバス上に発行されます。 読み取り側では、スコアカードがサブジェクトごとに合格率、平均スコア、トレンドを集約し、 CSV/JSON としてエクスポートします。

候補出力は決して永続化されません — どのソースからのものであっても。ケースごとの結果は、 一方向の詳細ハッシュと、UI 用にクランプされ除去されたラベルのみを格納します; 除去はストレージの 前にハンドラーが行うものであり、ストアに対して前提とすることは決してありません。モニターは 実セッションの行動シグナル — その状態、ファインディング数、最大重大度、トークン/コストの数値 (コアの Session、Finding、CostRecord シグナルから引かれる)— をスコアリングするのであって、 プラットフォームが一切永続化しない生の出力テキストは決してスコアリングしません。ゴールデン フィクスチャは一つの限定された例外です: オペレーター認可済み、オプトイン、非本番のコンテンツで、 スイートを実際に実行できるよう書き込み前にハンドラーがクランプします。

ジャッジのキャリブレーション、バイアス緩和、CI 回帰ゲート

Section titled “ジャッジのキャリブレーション、バイアス緩和、CI 回帰ゲート”

ジャッジの判定は測定された後にのみ信頼されます。人手でラベル付けされたキャリブレーションセット (ガイド付き olivares evals label セッションで構築)がキャリブレーションランに投入され、 人間のリファレンスに対してジャッジを測定します: 95% Wilson 区間付きの一致率、Cohen のカッパ (クラス不均衡の下では一致率だけでは弁護できない)、分母付きの感度/特異度、そして冗長性バイアスの 相関。レポートは追記専用のエビデンスです; 目標 — 一致率 ≥ 0.85 かつ 定義済みカッパ ≥ 0.6 — はランごとに引き上げられますが、決して引き下げられません。人間ラベルがすべて合格のセットは 偶然補正された一致率を測定できず、何も証明しません。

バイアス緩和は組み込まれており、かつ測定されます: ジャッジプロンプトは判定の前に推論を 強制し(分析は処理途中で破棄される — 最小データ)、長さに報酬を与えないよう指示します; A/B 比較のオプトイン・ペアワイズモードは、共有された各ケースを提示順序を入れ替えて 2 回判定し、 両方の順序が一致したときにのみ勝者を宣言し、測定された position_consistency レートを 報告します。

回帰ゲート(POST /gate、CLI evals gate)は、これらすべてをブロッキングな CI 判定に 変換します: ベースラインに対する回帰、スイートしきい値を下回る合格率、または未キャリブレーション のジャッジはゲートを失敗させます(exit 1); ジャッジ資格情報の欠如は宣言された警告に ディグレードし、決してサイレントな合格にはなりません。ゲートのシードはサンプルする ケースを選びます。遠隔モデルを決定論的にはしません。コンテンツ、ジャッジモデルのピン、 プロンプトバージョンをキーとする判定キャッシュのヒットは、保存された判定を返します。 ミス、およびこのゲートの外の通常の llm_judge ランは、遠隔ジャッジを再度呼び出し、 結果が異なり得ます。FinOps のプリフライトはこのゲートだけで動きます。ジャッジの呼び出しに ブロックまたはスロットルする FinOps の予算が適用されない場合、ゲートは支出を許します。 予算ストアを読み取れない場合、ゲートは支出を拒否し、budget_blocked で失敗します。 ブロックまたはスロットルする予算は支出を止めます。 失敗したゲートからの唯一の脱出口はガバナンス下のオーバーライド — 管理者ティア、書面理由、 監査済み — であり、これは CI が再チェックする実効判定を変えるのであって、記録された判定を変える ことは決してありません。報告されるすべてのレートはその分母と 95% 区間を伴って提供され、回帰の比較も同様です。 完全な方法論とソースについてはリポジトリ内の docs/EVAL-METHODOLOGY.md を参照してください。