LLM の採点は 1 回では信頼できません。同じ入力でも採点のたびにスコアが揺れ、その揺れが「誤差」なのか「実際の品質差」なのかが区別できないと、改善を確認する手がかりが得られません。

この記事では 4 つの技法を「問題 → 解決策」の流れで積み上げ、スコアが信頼できる数字になるまでの設計を整理します。

柱1: G-Eval 確率加重でスコアの情報損失をなくす

問題: スコアを 1〜10 の整数で取ると、7 か 8 かの境界付近の微差が消えます。LLM が内部的に「7 寄りの 8」と判断していても、出力は 8 の一字になってしまいます。

解決策: G-Eval 方式で logprobs(各トークンの生成確率)を使い、確率加重スコアを計算します。

score = Σ p(i) × i   (i ∈ {1..10})

たとえば「7 を 60%、8 を 40% の確率で出す」状態なら score = 7.4 になります。整数化による情報損失がなくなり、ケース間の微差が見えてきます。

logprobs を返さない LLM(Bedrock / Claude など)では、出力された整数スコアにフォールバックする設計にします。プロンプトの末尾を「最終行にスコアの整数 1 つだけを出力する」形にして、スコアトークンが末尾に来るようにすることも重要です。そうしないと logprobs の対象トークンが特定できません。

柱2: ペアワイズ比較で位置バイアスを相殺する

問題: ペアワイズ比較(A vs B どちらが良いか)では、先に提示した方が有利になる位置バイアスが生じます。A/B の並び順だけで結果が変わるため、単純な 1 回勝負は信頼できません。

解決策: A/B の順序を入れ替えて 2 回採点し、スコアを合算します。

run1: A=golden, B=generated → generated 勝ち → +1
run2: A=generated, B=golden → generated 勝ち → +1
合計 +2 → generated 圧勝

run1: generated 勝ち → +1
run2: golden 勝ち   → +0
合計 +1 → 引き分け(バイアスが相殺)

run1 と run2 で判定が逆になれば合計は 0 で引き分けとなり、一方のバイアスをもう一方が打ち消します。tie は 0.5 勝として扱い、Wilson 95% 信頼区間で勝率の不確かさを定量化します。Wilson 区間は勝率 0 や 1 の近傍でも破綻しない点で、正規近似より堅牢です。

柱3: 繰り返し採点とブートストラップ CI で「誤差か実差か」を判別する

問題: 1 回の採点では Δ(generated − golden)が誤差か実差か分かりません。Δ = +0.5 は「本当に改善した」のか「たまたまそのスコアが出た」のかを判断できません。

解決策: --repeat N で各ケースを N 回採点し、ペア差のリストを作ります。このリストにブートストラップ 95% 信頼区間を計算します。

# 2000 回復元抽出 → 各リサンプルの平均 → 2.5% / 97.5% パーセンタイル
CI = bootstrap_ci(deltas, n_resamples=2000)
# CI = [+0.38, +0.56]  → 0 を含まない → 有意改善

正規近似(mean ± 1.96 × SE)ではなくブートストラップを使う理由は、スコア分布が歪んでいたり小サンプルのときでも区間が破綻しないためです。

注意点が 1 つあります。温度 0 では各回がほぼ同一の出力になり、リサンプルが無意味になります。--repeat N 指定時に温度が未指定なら 0.7 に自動引き上げる設計にしないと、「繰り返しているが全部同じ値」の CI が出て信頼区間が極端に狭くなりすぎます。

柱4: Benjamini-Hochberg 法で多重比較を補正する

問題: 評価軸が複数あると(具体性・訴求力・論理性など)、真の差がゼロでも一定割合が偶然「有意」に見えます。これが多重比較問題です。5 軸を独立に検定すれば、何もなくても 1〜2 軸は偶然 p < 0.05 になります。

解決策: Benjamini-Hochberg(BH)法で偽発見率(FDR)を制御します。

各軸の p 値を昇順で並べ、ランク k / m × α(m = 軸数、α = 0.05)を閾値として動的に引き下げます。真の差がない軸で「有意=✓」が乱発されなくなります。

使い分けの指針として、個別軸の判定には未補正の有意性を、複数軸にまたがった判定(リリースゲートなど)には BH 補正後の有意性を使うと明確です。

補足: データ汚染を防ぐ

4 柱と合わせて、集計データの品質も守る必要があります。

  • インフラ失敗時はスコアを欠損として除外する(最小値を代替で書くとデータが底に張り付く)
  • 欠損率 20% 以上で警告を出し、再採点を促す
  • STALE 検出(コンテンツハッシュ)で古い世代の CSV 行を集計から除外する

まとめ

LLM 評価のブレを多層的に抑える 4 つの柱を整理しました。

  • G-Eval 確率加重: logprobs で整数スコアの情報損失をなくし、微差を可視化する
  • ペアワイズ順序反転: A/B を入れ替えて 2 回採点し、位置バイアスを相殺する
  • 繰り返し採点 + ブートストラップ CI: Δ が誤差か実差かをデータで判別する(温度 0.7 に引き上げることを忘れずに)
  • BH 多重比較補正: 複数軸の評価で偽陽性の乱発を防ぐ

スコアを 1 回出して終わりにせず、この 4 層を通過させることで初めて「改善したと言える数字」が手に入ります。


関連記事: