AI Engineering Academy · レッスン

評価者モデルを人間の評価に合わせて調整する

人間の選好判断による正解データセットを収集し、Cohen's Kappaで判定者と人間の一致度を測定して、体系的なバイアスを減らすよう判定者をプロンプトチューニングします

レッスン 3/413 ステップ

「評価者モデルを人間の評価に合わせて調整する」はCoddyKit上の無料AI Engineering Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Engineering Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Engineering Academyコースには全4レッスンが含まれています。

キャリブレーションが不可欠な理由

キャリブレーションされていないLLM評価者は、人間よりも体系的に高く、または低く出力を採点したり、特定の文体を好んだり、評価基準が想定していなかったエッジケースで失敗したりする可能性があります。そのような評価者をデプロイの判断に使うことは、バイアスのある測定器を信頼するのと同じです。キャリブレーションでは、人間の正解データに対して評価者を検証し、本番でスコアに依存する前に、どの程度信頼できるかを定量化します。

キャリブレーションデータセットの構築

人間が採点した回答例を100~500件集めて、キャリブレーションセットを作成します。多様性を確保し、高品質な回答(スコア5)、中程度の品質の回答(スコア3)、明らかに悪い回答(スコア1)を含めます。各例を3~5人の独立した評価者に採点してもらい、評価者間の一致度を測定します。そのうえで、平均または最頻値を用いて合意による正解スコアを算出します。

# Calibration dataset structure:
# [
#   {
#     'question': 'What causes inflation?',
#     'response': '...',
#     'human_scores': [4, 4, 3, 5, 4],  # 5 raters
#     'human_consensus': 4,              # mean or mode
#     'rater_ids': ['r1', 'r2', 'r3', 'r4', 'r5']
#   },
#   ...
# ]

# Typical calibration set composition:
# 30% excellent responses (score 4-5)
# 40% adequate responses (score 2-4)
# 30% poor responses (score 1-2)
# Include adversarial / edge cases

評価者間一致度の測定

人間のスコアを正解データとして信頼する前に、評価者同士の判定が一致していることを確認します。Cohenのカッパ係数は、偶然の一致を超えた2人の評価者間の一致度を測定します。0.6超は許容範囲、0.8超は優秀とされます。5段階尺度では、重み付きカッパ(線形重み)を計算します。評価者間一致度が低い場合、タスクの定義が曖昧であることを意味します。スコアを評価者のキャリブレーションに使う前に、評価者向けガイドラインを改善してください。

from sklearn.metrics import cohen_kappa_score
import numpy as np

def measure_inter_rater_agreement(rater1_scores: list, rater2_scores: list) -> dict:
    kappa = cohen_kappa_score(rater1_scores, rater2_scores, weights='linear')
    exact_agreement = sum(a == b for a, b in zip(rater1_scores, rater2_scores)) / len(rater1_scores)
    adjacent_agreement = sum(abs(a - b) <= 1 for a, b in zip(rater1_scores, rater2_scores)) / len(rater1_scores)
    return {
        'weighted_kappa': round(kappa, 3),
        'exact_agreement': round(exact_agreement, 3),
        'adjacent_agreement': round(adjacent_agreement, 3),
        'acceptable': kappa >= 0.6
    }

キャリブレーションデータに対する評価者の実行

本番で使用する予定のプロンプトと同じプロンプトを使い、キャリブレーションセットのすべての例に対してLLM評価者を実行します。各例について、評価者のスコアを人間の合意スコアと並べて収集します。要素ごとに比較できるよう、この2つのリストの対応関係を維持してください。この比較によって、体系的なバイアスやスコア範囲の違いが明らかになります。

async def run_judge_on_calibration(calibration_set: list) -> list:
    pairs = []
    for item in calibration_set:
        judge_result = await async_judge(item['question'], item['response'])
        pairs.append({
            'question': item['question'],
            'human': item['human_consensus'],
            'judge': judge_result.correctness,
            'judge_rationale': judge_result.rationale
        })
    return pairs

評価者と人間の相関の計算

評価者のスコアと人間の合意スコアの間のPearson相関を計算します。これは線形的な一致度を測定するもので、相関が1.0なら評価者が人間の順位付けを完全に追跡していることを意味します。平均スコア差を把握するため、平均絶対誤差(MAE)も計算します。5段階尺度で相関が0.7を超え、MAEが0.8ポイント未満であれば、通常は本番利用に十分信頼できる評価者だと判断できます。

from scipy.stats import pearsonr, spearmanr
import numpy as np

def calibration_metrics(pairs: list) -> dict:
    humans = [p['human'] for p in pairs]
    judges = [p['judge'] for p in pairs]
    pearson_r, p_val = pearsonr(humans, judges)
    spearman_r, _ = spearmanr(humans, judges)
    mae = np.mean([abs(h - j) for h, j in zip(humans, judges)])
    return {
        'pearson_r': round(pearson_r, 3),
        'spearman_r': round(spearman_r, 3),
        'p_value': round(p_val, 5),
        'mae': round(mae, 3),
        'reliable': pearson_r >= 0.7 and mae <= 0.8
    }

体系的なバイアスの特定

相関だけでなく、体系的なバイアスも確認します。評価者は一貫して過大評価または過小評価していないでしょうか。評価者のスコアと人間のスコアをプロットし、回帰直線が原点を通っていないか確認します。人間が平均3を付ける回答に評価者が4を付けるなら、インフレーションバイアスがあります。ルーブリックを調整するか、実際のスコアに線形キャリブレーション変換を適用して補正してください。

import numpy as np
from scipy import stats

def detect_score_bias(pairs: list) -> dict:
    humans = np.array([p['human'] for p in pairs])
    judges = np.array([p['judge'] for p in pairs])
    slope, intercept, r, p, se = stats.linregress(judges, humans)
    bias = np.mean(judges - humans)  # positive = judge over-scores
    return {
        'mean_bias': round(bias, 3),  # > 0 means judge inflates
        'calibration_slope': round(slope, 3),
        'calibration_intercept': round(intercept, 3),
        # Corrected score = slope * judge_score + intercept
        'correction_formula': f'human_score ≈ {slope:.2f} * judge + {intercept:.2f}'
    }

キャリブレーション補正の適用

キャリブレーション回帰の傾きと切片が得られたら、それを適用して評価者の生スコアを、人間の判断により近いキャリブレーション済みスコアへ変換します。この線形補正は簡単で効果的です。回帰によって有効範囲外の値が生じないよう、補正後のスコアを有効範囲(1~5)に収めます。キャリブレーションデータが増えた際に過去との比較ができるよう、生スコアと補正後のスコアの両方を保存してください。

def calibrate_score(raw_judge_score: float, slope: float, intercept: float,
                    min_score: int = 1, max_score: int = 5) -> float:
    corrected = slope * raw_judge_score + intercept
    return max(min_score, min(max_score, round(corrected, 1)))

# Example: if judge inflates by 0.5 points on average
# slope=0.85, intercept=0.3
# raw_score=4 -> corrected = 0.85*4 + 0.3 = 3.7

体系的な誤差パターンの発見

キャリブレーション誤差を質問の種類、回答の長さ、トピック領域ごとに分類し、パターン化された失敗を見つけます。評価者は技術的なコーディング質問では信頼性が低く、事実に関する質問では正確かもしれません。また、非常に長い回答を過大評価し、短く簡潔な回答を過小評価することもあります。こうしたパターンは、キャリブレーションが最も弱い領域に対する、対象を絞ったルーブリックの改善やトピック固有の評価者プロンプトの設計に役立ちます。

from collections import defaultdict

def error_by_category(pairs: list) -> dict:
    by_cat = defaultdict(list)
    for p in pairs:
        error = abs(p['judge'] - p['human'])
        by_cat[p.get('category', 'unknown')].append(error)
    return {
        cat: {
            'mean_error': round(sum(errs)/len(errs), 2),
            'max_error': max(errs),
            'n': len(errs)
        }
        for cat, errs in by_cat.items()
    }

データの増加に伴う再キャリブレーション

キャリブレーションは一度だけ行えばよい作業ではありません。人間による評価が増え、モデルの更新によって評価者の挙動が変わるため、四半期ごとにキャリブレーションを再実行します。キャリブレーション指標を経時的に追跡し、Pearson相関が0.7を下回った場合は、モデルの更新によって評価者のスコア分布が変わっていないか調査します。キャリブレーションパイプラインを自動化し、1つのコマンドで再実行して更新された補正係数を生成できるようにしてください。

def run_calibration_pipeline(calibration_data: list) -> dict:
    # 1. Measure human inter-rater agreement
    ira = measure_inter_rater_agreement(
        [d['rater_1'] for d in calibration_data],
        [d['rater_2'] for d in calibration_data]
    )
    # 2. Run judge on all items
    pairs = run_judge_on_calibration(calibration_data)
    # 3. Compute correlation metrics
    metrics = calibration_metrics(pairs)
    # 4. Detect bias
    bias = detect_score_bias(pairs)
    return {'ira': ira, 'metrics': metrics, 'bias': bias}

評価者設定の文書化

評価者モデル、プロンプトのバージョン、キャリブレーションデータセットのサイズと日付、キャリブレーション指標、補正係数を、バージョン管理に登録した評価者設定ファイルに記録します。これにより監査証跡が作成され、将来のチームメンバーがスコアの理由を理解できるようになります。また、指標の変化が評価者の再設定によるものか、本当の品質変化によるものかを判別できます。

# judge_config.yaml
# judge_model: gpt-4o-2025-01-01
# judge_prompt_version: v3.2
# calibration_date: 2026-05-15
# calibration_set_size: 312
# calibration_metrics:
#   pearson_r: 0.81
#   spearman_r: 0.79
#   mae: 0.54
# bias_correction:
#   slope: 0.88
#   intercept: 0.45
# next_recalibration: 2026-08-15

指標別の評価者プロンプト

複数の指標を一度に採点する単一の評価者プロンプトでは、スコア間に相関が生じやすくなります。評価者が最初の印象に引きずられ、明確さを高く評価したために正確性も高くする、といったことが起こるためです。指標別のプロンプトでは、別々のAPI呼び出しで各基準を独立して評価します。コストは高くなりますが、本当に独立した測定値となる、より信頼性の高いスコアが得られます。スコアが独立して変動すると想定される指標には、別々のプロンプトを使用してください。

async def multi_dimension_judge(question: str, answer: str) -> dict:
    # Run each dimension as a separate judge call
    correctness, helpfulness, clarity = await asyncio.gather(
        judge_single_dimension(question, answer, 'correctness'),
        judge_single_dimension(question, answer, 'helpfulness'),
        judge_single_dimension(question, answer, 'clarity')
    )
    return {
        'correctness': correctness,
        'helpfulness': helpfulness,
        'clarity': clarity,
        'composite': 0.5 * correctness + 0.3 * helpfulness + 0.2 * clarity
    }

クイックチェック

人間の評価に対するLLM評価者モデルのキャリブレーションについての理解度を確認します。

レッスンのまとめ

このレッスンでは、人間の合意スコアを含むキャリブレーションデータセットが評価者の信頼性を測定するための正解データとなること、Pearson相関とMAEが評価者による人間の判断の再現度を定量化すること、そして線形バイアス補正が体系的な過大評価や過小評価を調整することを学びました。次は、CI/CDに統合した継続的な評価パイプラインを構築します。

無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「評価者モデルを人間の評価に合わせて調整する」レッスンは無料ですか?

はい。「評価者モデルを人間の評価に合わせて調整する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Engineering Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Engineering Academyコースには全4レッスンが含まれています。

「評価者モデルを人間の評価に合わせて調整する」で何を学びますか?

人間の選好判断による正解データセットを収集し、Cohen's Kappaで判定者と人間の一致度を測定して、体系的なバイアスを減らすよう判定者をプロンプトチューニングします ブラウザで直接実行するハンズオンコードでAI Engineering Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Engineering Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Engineering Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「評価者モデルを人間の評価に合わせて調整する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Engineering Academyレッスンでコードを書いて実行できますか?

はい。すべてのAI Engineering Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. LLM-as-Judgeパターン
  2. ポイントワイズ評価とペアワイズ評価
  3. 評価者モデルを人間の評価に合わせて調整する
  4. 継続的評価パイプラインの構築
← AI Engineering Academyに戻る