AI Engineering Academy · レッスン

LLM-as-Judgeパターン

強力なLLMに正確性、有用性、トーンなどの基準で出力を採点または比較させるプロンプトの作り方と、人手による評価よりも大規模に実施しやすい理由を理解します。

レッスン 1/413 ステップ

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

自動評価が必要な理由

LLM の出力を手作業で評価するには、時間もコストもかかります。人間の評価者からなるチームでも、1 週間に評価できる出力は数百件程度ですが、本番システムでは 1 日に数千件の出力が生成されます。LLM-as-judgeでは、強力な言語モデルを使って他の LLM の出力品質を大規模に評価できます。これにより、大量のアノテーターを雇わなくても、自動回帰テストと継続的な品質監視を実現できます。

1 つの LLM が別の LLM を評価するという基本概念

LLM-as-judge では、評価基準を定義するシステムプロンプト、元の質問、モデルの回答、必要に応じて参照回答を judge モデル(通常は GPT-4o または Claude)に送信します。judge は数値スコア、ラベル、または順位を返します。最先端のモデルは、正確性、有用性、一貫性といった品質の概念を十分に理解できるため、この方法が有効です。

JUDGE_SYSTEM_PROMPT = '''
You are an expert evaluator of AI-generated responses.
Given a question and an AI-generated answer, score the answer on:
- Correctness (0-5): Is the information factually accurate?
- Completeness (0-5): Does it fully address the question?
- Clarity (0-5): Is it easy to understand?
Return a JSON object with scores and a brief rationale.
'''

Judge プロンプトの作成

優れた judge プロンプトでは、「良い」「悪い」のような曖昧な語ではなく、スコアの定義を含む明確な評価基準を指定します。各評価基準について、スコア 5、3、1 が具体的に何を意味するのかを定義してください。質問、評価対象の回答、必要に応じて参照回答を提示します。恣意的な採点を減らすため、スコアの前に推論(chain-of-thought)を求めます。

def build_judge_prompt(question: str, answer: str, reference: str = None) -> str:
    ref_section = f'Reference answer:\n{reference}\n\n' if reference else ''
    return f'''
Question: {question}

{ref_section}Answer to evaluate:
{answer}

Score this answer on correctness (1-5) where:
5 = Completely accurate, no factual errors
3 = Mostly accurate with minor errors
1 = Contains significant factual errors

First explain your reasoning, then provide the score as JSON:
{{"correctness": <1-5>, "rationale": "..."}}
'''

Judge モデルの呼び出し

評価用のプロンプトを使って judge モデルを呼び出します。JSON レスポンスを解析してスコアを取り出してください。judge が解析可能なデータを返すように、常に構造化出力または JSON モードを使用します。テスト対象のシステムと judge に同じモデルを使うと、バイアスが生じる可能性があります。judge には別のモデルを使うか、少なくとも異なる設定を使用してください。

from pydantic import BaseModel
import instructor
from openai import OpenAI

class JudgeScore(BaseModel):
    correctness: int
    completeness: int
    clarity: int
    rationale: str

judge_client = instructor.from_openai(OpenAI())

def judge(question: str, answer: str) -> JudgeScore:
    return judge_client.chat.completions.create(
        model='gpt-4o',  # Use stronger judge than the model being tested
        response_model=JudgeScore,
        messages=[
            {'role': 'system', 'content': JUDGE_SYSTEM_PROMPT},
            {'role': 'user', 'content': build_judge_prompt(question, answer)}
        ]
    )

参照なし評価と参照ベース評価

LLM による評価には 2 つのモードがあります。参照なし評価では、正解となる回答なしで品質を評価するよう judge に求めます。自由形式のチャットのように、正解が存在しない場合に役立ちます。参照ベース評価では、正解となる回答を提示し、モデルの回答がそれと一致するかを尋ねます。正しい回答が決まっている事実ベースの質問応答に適しています。ラベル付きテストセットがある場合は、参照ベース評価を使用してください。

# Reference-free: good for open-ended generation
judge_result = judge(question='What is machine learning?', answer=model_answer)

# Reference-based: better for factual QA
judge_result = judge(
    question='What year was Python created?',
    answer=model_answer,
    reference='Python was created by Guido van Rossum and released in 1991.'
)

Judge のバイアスの制御

LLM の judge には、既知のバイアスがあります。たとえば、長い回答(冗長性バイアス)、自信ありげに聞こえる回答、学習データのスタイルに一致する回答を好む傾向があります。冗長性バイアスを抑えるには、評価基準で不要な長さを明示的に減点してください。ペア比較における位置バイアスを減らすには、どちらの回答を先に表示するかをランダム化し、両方の順序で得たスコアの平均を取ります。

# Anti-verbosity note in rubric:
ANTI_VERBOSITY_CLAUSE = '''
Note: A concise, accurate answer should score higher than a long,
rambling answer that happens to contain the correct information.
Do not reward length for its own sake.
'''

# Position-debiasing for pairwise comparison:
async def debiased_pairwise(q, a, b):
    score_ab = await compare(q, answer_a=a, answer_b=b)
    score_ba = await compare(q, answer_a=b, answer_b=a)
    # A wins if it wins in both orderings
    a_wins = (score_ab == 'A' and score_ba == 'B')
    return 'A' if a_wins else 'B' if (score_ab == 'B' and score_ba == 'A') else 'tie'

高速化のための評価のバッチ処理

大規模なテストセットをすばやく評価するため、judge による評価を並列実行します。asyncio とセマフォを使えば、1 分あたり数百件の出力を評価できます。judge の呼び出しにもトークンが必要になるため、judge 呼び出し用に別のレート制限予算を確保してください。また、深い推論を必要としない評価基準には、GPT-4o-mini のような小型でも十分な能力を持つ judge モデルを使用し、最も重要な評価基準には GPT-4o を使うことも検討してください。

import asyncio

async def batch_judge(qa_pairs: list, concurrency: int = 20) -> list:
    sem = asyncio.Semaphore(concurrency)

    async def judge_one(item):
        async with sem:
            return await async_judge(item['question'], item['answer'])

    return await asyncio.gather(
        *[judge_one(item) for item in qa_pairs],
        return_exceptions=True
    )

Judge スコアの集計

テストセットの評価後、平均値、中央値、品質しきい値(正確性 ≥ 4 など)を上回るスコアの応答の割合といった要約統計量にスコアを集計します。これらの集計値を、モデルのバージョン間やプロンプトの変更前後で比較してください。しきい値以上の割合が 5% を超えて低下した場合は、新しいバージョンをデプロイする前にレビューを実施します。

import statistics

def summarize_judge_results(scores: list) -> dict:
    correctness = [s.correctness for s in scores if isinstance(s, JudgeScore)]
    return {
        'n': len(correctness),
        'mean_correctness': round(statistics.mean(correctness), 2),
        'median_correctness': statistics.median(correctness),
        'pct_above_4': round(100 * sum(1 for s in correctness if s >= 4) / len(correctness), 1)
    }

Judge による LLM バージョンの比較

LLM-as-judge を使って、システムの 2 つのバージョン(たとえばプロンプト変更の前後)を比較します。同じテスト質問のセットを両方のバージョンで実行し、すべての出力を評価して、勝率を計算します。勝率とは、バージョン B のスコアがバージョン A を上回ったケースの割合です。100 件以上のサンプルで勝率が 55% を超えていれば、通常は新しいバージョンをリリースする根拠として十分な統計的有意性があります。

async def ab_compare(test_questions: list, version_a, version_b) -> dict:
    a_wins = b_wins = ties = 0
    for q in test_questions:
        answer_a = await version_a.answer(q)
        answer_b = await version_b.answer(q)
        winner = await debiased_pairwise(q, answer_a, answer_b)
        if winner == 'A': a_wins += 1
        elif winner == 'B': b_wins += 1
        else: ties += 1
    total = len(test_questions)
    return {'a_win_rate': a_wins/total, 'b_win_rate': b_wins/total, 'tie_rate': ties/total}

Judge スコアの人間による評価とのキャリブレーション

50〜200 件の例からなるキャリブレーションセットで人間の評価と比較し、judge を検証します。judge のスコアと人間のスコアのピアソン相関を計算してください。相関が 0.7 を超えていれば、judge は信頼できると判断できます。相関が低い場合は、judge が人間と意見の異なる箇所を確認するために judge プロンプトを監査し、評価基準に例や説明を追加してください。キャリブレーションなしで judge を本番環境に導入してはいけません。

from scipy.stats import pearsonr

def calibrate_judge(human_scores: list, judge_scores: list) -> dict:
    corr, p_value = pearsonr(human_scores, judge_scores)
    mean_abs_error = sum(abs(h - j) for h, j in zip(human_scores, judge_scores)) / len(human_scores)
    return {
        'pearson_r': round(corr, 3),
        'p_value': round(p_value, 4),
        'mean_abs_error': round(mean_abs_error, 2),
        'reliable': corr >= 0.7
    }

LLM-as-judge を使用しない場合

LLM-as-judge は、すべての評価シナリオに適しているわけではありません。次のような場合は避けてください。judge モデルにない専門知識が評価基準に必要な場合(医療診断の正確性や法令遵守など)、法的に説明可能な評価が必要な場合(人間によるレビューが必要です)、judge より強力なモデルを評価する場合(judge は自分が生成できない出力を信頼性高く評価できません)、評価予算が追加の API コストをまかなうには厳しい場合です。このような場合は、人間による評価または決定論的なメトリクスを使用してください。

# Appropriate uses of LLM-as-judge:
# YES: General helpfulness, clarity, tone, factual accuracy (general knowledge)
# YES: Code correctness for common languages
# YES: Translation quality comparison
# YES: Content safety classification
#
# NOT appropriate:
# NO: Medical/legal/financial accuracy (needs domain expert)
# NO: Evaluating GPT-4o with GPT-4o (same capability ceiling)
# NO: Formal compliance audits (non-deterministic judge)
# NO: Streaming quality at individual token level

クイックチェック

LLM-as-judge による評価パターンについての理解度を確認します。

レッスンのまとめ

このレッスンでは、LLM-as-judgeによって、明確な評価基準を使い、強力なモデルで大規模に品質を評価する方法、異なる評価シナリオに適した参照なしモードと参照ベースモード、そして人間の評価とのキャリブレーションによって、本番環境で使用する前に judge の信頼性を検証する方法を学びました。次は、ポイントワイズ評価とペアワイズ評価の戦略を実装します。

無料で開始

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

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

コース
30
レッスン
120

よくある質問

「LLM-as-Judgeパターン」レッスンは無料ですか?

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

「LLM-as-Judgeパターン」で何を学びますか?

強力なLLMに正確性、有用性、トーンなどの基準で出力を採点または比較させるプロンプトの作り方と、人手による評価よりも大規模に実施しやすい理由を理解します。 ブラウザで直接実行するハンズオンコードでAI Engineering Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「LLM-as-Judgeパターン」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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