G-Evalフレームワークを用いた人間に近い回答品質のAI自動スコアリング

脱BLEUスコア:ChatGPTとG-Evalで構築する「人間感覚」に近いAI自動評価システムの実装

この記事は急速に進化する技術について解説しています。最新情報は公式ドキュメントをご確認ください。

約11分で読めます
文字サイズ:
脱BLEUスコア:ChatGPTとG-Evalで構築する「人間感覚」に近いAI自動評価システムの実装
目次

この記事の要点

  • 人間感覚に近いAI回答品質の自動評価
  • 従来の統計的指標(BLEUなど)の課題を解決
  • 大規模言語モデル(LLM)を評価器として活用

RAG(検索拡張生成)システムを本番環境へ導入する際、最も頭を悩ませる課題は「システムの回答精度をどう測るべきか」という点です。皆さんのプロジェクトでも、この壁にぶつかっていませんか?

開発現場では「数件を目視チェックしている」「BLEUスコアが実態と合わない」といった課題が頻繁に報告されています。LLMアプリケーション開発において、評価(Evaluation)は最大のボトルネックになり得ます。毎回人間がレビューしていてはアジャイルな開発スピードが維持できず、従来の機械的な指標ではハルシネーションや表現の揺らぎを正しく判定できません。

そこで注目されているのがG-Evalというフレームワークです。

これはLLM自身を評価者(Judge)とし、Chain-of-Thought(思考の連鎖)確率的重み付けを組み合わせることで、人間の評価と極めて高い相関を実現する画期的な手法です。2026年現在、LLMの推論能力は飛躍的に向上しています。たとえば、Claude Opus 4.6の「適応型思考(Adaptive Thinking)」やGemini 3.1 Proの「Deep Think Mini」など、モデル自体がタスクの難易度に応じて推論の深さを自動調整する機能が実装されました。これにより、従来の手動プロンプトによるCoTから進化し、より精緻な評価が可能になっています。APIを利用する際も、思考レベル(HighやMaxなど)を明示的に制御することで、リソース配分を最適化しながら高度な推論プロセスを評価基盤に組み込めるのです。

既存の評価ライブラリも存在しますが、判定基準のブラックボックス化を避けるため、今回は「素のOpenAI API」を使い、G-Evalのロジックをスクラッチで実装するアプローチを取り上げます。「まず動くものを作る」プロトタイプ思考で、技術の本質を掴みましょう。現在では標準モデルのGPT-5.2やコーディング特化のGPT-5.3-Codexといった最新モデルが利用可能であり、複雑な評価タスクも高速かつ安定して処理できます。

独自の評価ロジックを構築すれば、プロジェクト固有の「良さ」の定義に合わせた柔軟なテスト環境を整備でき、将来的なモデル移行時にも定量的な精度検証が実現します。評価の自動化は、継続的なプロンプト改善やRAGの検索精度向上を支える、ビジネス成功への最短距離を描く強力な基盤となります。

なぜ従来の指標ではなくG-Evalなのか:相関性の壁を突破する

長年標準とされてきたBLEUやROUGEといった指標から脱却すべき理由を、客観的なデータと最新AI技術の進化を踏まえて整理してみましょう。

n-gram一致率の限界と意味的評価の必要性

BLEUやROUGEは「正解データと生成文の間で単語(n-gram)がどれだけ重複しているか」を測定します。これは過去の機械翻訳では有効でしたが、高度な文脈理解を持つ現代の生成AIにおいては致命的な欠点となります。

例えば「日本の首都はどこ?」という質問に対し、以下のケースを想像してください。

  • 正解データ:「日本の首都は東京です。」
  • LLMの回答:「東京が日本の首都として機能しています。」

この2つは意味的に完全に一致していますが、単語の並びや表現が異なるため、n-gramベースの指標では低いスコアが出ることがあります。逆に、意味の通らない不自然な文章でも特定の単語が合致していれば高スコアが算出されるケースも珍しくありません。これでは「ユーザーにとって本当に役立つ回答か」という本質的な品質を正確に測ることは困難です。

G-Evalフレームワークの概要(LLM-as-a-Judge)

そこで重要になるのが、LLMを評価者として活用する「LLM-as-a-Judge」のアプローチです。G-Evalはこのアプローチを体系化した強力なフレームワークと言えます。

提案当初の論文(Liu et al., 2023)から発展し、現在ではGPT-4oをはじめとする高度な推論能力を持つLLMを活用する汎用的な手法として定着しています。最大の利点は、従来の機械的な指標と比較して人間による評価との相関(Spearman相関など)が飛躍的に高いことです。

特に文章要約や対話生成タスクにおいて、G-Evalは0.5以上の相関係数を示すこともあり、BLEUなどが0.1〜0.2程度にとどまるのと対照的です。

Chain-of-Thought(CoT)が評価精度を高めるメカニズム

G-Evalが人間の感覚に近い評価を実現できる最大の理由は、Chain-of-Thought(CoT:思考の連鎖)の活用にあります。「この回答は何点か?」と結果だけを出力させるのではなく、「評価基準に照らし合わせ、どのような思考プロセスを経てその点数に至ったか」を明示的に推論させます。

人間が採点する場合も、理由を言語化してからの方が公平でブレのない評価ができますよね。LLMも同様に、推論過程を展開させることで評価のハルシネーションを抑え、論理的で安定したスコアリングが可能になります。

近年では、GPT-4oや各社の推論特化型モデルにおいて、モデル内部で自動的に深い思考プロセスを実行する機能が標準化されつつあります。これにより、タスクの難易度に応じて動的に推論の深さを調整し、より精緻で信頼性の高い自動評価システムを構築することが可能になっています。

評価用プロンプトテンプレートの設計と実装

それでは、実際にコードを書いていきましょう。まずは評価の土台となるプロンプトの設計です。PythonとOpenAI APIを使用します。

評価基準(Rubrics)の定義構造

評価には明確な基準(Rubric)が必要です。「正確性(Accuracy)」を測るなら、以下のような定義が考えられます。

# 評価基準の定義
EVALUATION_CRITERIA = {
    "name": "Accuracy",
    "description": "提供された情報が事実に基づき、正確であるかどうかを評価します。",
    "criteria": "1: 全く不正確、または虚偽の情報が含まれる。\n"
                "3: 一部不正確な点があるが、主要な事実は合っている。\n"
                "5: 完全に正確で、信頼できる情報源に基づいている。"
}

CoTを誘発するプロンプトエンジニアリング

次に、この基準を使ってLLMに評価させるプロンプトを作成します。重要なのは評価ステップを明示的に生成させることです。

from string import Template

# G-Eval用プロンプトテンプレート
G_EVAL_PROMPT_TEMPLATE = Template("""
あなたはAIアシスタントの回答品質を評価する公平な審査員です。
以下の評価基準に基づいて、ユーザーの質問に対するAIの回答を評価してください。

### 評価対象
[ユーザーの質問]: $input
[AIの回答]: $output

### 評価基準: $metric_name
$metric_description

### スコアリング基準
$rubric

### 評価手順
1. ユーザーの質問の意図を理解する。
2. AIの回答が評価基準を満たしているか詳細に分析する。
3. マイナスポイントとプラスポイントを洗い出す。
4. 最終的なスコア(1-5)を決定する。

まず、上記の評価手順に従って思考プロセス(Evaluation Steps)を出力してください。
その後、最終的なスコアのみを数値で出力してください。
""")

このテンプレートでは、$input$output、評価基準を動的に埋め込みます。「まず思考プロセスを出力してください」という指示がCoTとして機能します。

確率重み付けを用いたスコアリング関数の実装

評価用プロンプトテンプレートの設計と実装 - Section Image

G-Evalの最大の特徴はスコアリング手法にあります。LLMに「1から5の範囲で評価してください」と指示すると単一の整数が返ってきますが、内部的には「4である確率が60%、3である確率が30%」といった確率分布を保持しています。

単一の出力結果のみを採用すると微妙な品質の差が切り捨てられてしまいます。そこで、APIの logprobs オプションを活用して各トークンの生成確率を取得し、期待値(Weighted Score)を算出します。これにより、連続値としてのきめ細やかなスコアを取得できるようになります。

OpenAI APIからの対数確率(logprobs)の取得

OpenAI APIでは、リクエスト時に logprobs=Truetop_logprobs を指定することで、トークンごとの対数確率を取得できます。

以下に、G-Evalのコアとなるスコアリング関数の実装例を示します。

import math
from openai import OpenAI

client = OpenAI()

def g_eval_score(input_text, output_text, criteria):
    # プロンプトの構築
    prompt = G_EVAL_PROMPT_TEMPLATE.substitute(
        input=input_text,
        output=output_text,
        metric_name=criteria['name'],
        metric_description=criteria['description'],
        rubric=criteria['criteria']
    )

    # Step 1: CoT(思考プロセス)の生成
    # 論理的な評価を行うため、まずは思考プロセスを出力させます
    cot_response = client.chat.completions.create(
        model="gpt-4o", # 最新のモデルを指定してください
        messages=[{"role": "system", "content": prompt}],
        temperature=0.0
    )
    cot_content = cot_response.choices[0].message.content
    
    # Step 2: 生成された思考プロセスに基づく確率的なスコア算出
    score_prompt = f"""
    以下の評価プロセスに基づき、最終的なスコア(1から5の整数)を出力してください。
    余計な文字は含めず、数字のみを出力すること。
    
    [評価プロセス]
    {cot_content}
    
    Score:"""

    score_response = client.chat.completions.create(
        model="gpt-4o", # 最新のモデルを指定してください
        messages=[{"role": "user", "content": score_prompt}],
        temperature=0.0,
        max_tokens=1,
        logprobs=True,      # 確率を取得するために必須のパラメータ
        top_logprobs=5      # 上位5つの候補を取得
    )

    # logprobsの解析と期待値計算
    top_logprobs = score_response.choices[0].logprobs.content[0].top_logprobs
    
    weighted_sum = 0.0
    total_prob = 0.0
    
    print("--- Token Probabilities ---")
    for logprob_data in top_logprobs:
        token = logprob_data.token.strip()
        prob = math.exp(logprob_data.logprob)  # 対数確率を通常の確率に変換
        
        # トークンが1〜5の数字であるか判定
        if token.isdigit() and 1 <= int(token) <= 5:
            score_val = int(token)
            weighted_sum += score_val * prob
            total_prob += prob
            print(f"Score {score_val}: {prob:.4f}")
            
    if total_prob == 0:
        return None # 有効なスコアが得られなかった場合の処理
        
    # 正規化による期待値の算出
    final_score = weighted_sum / total_prob
    
    return final_score, cot_content

# 実行例
input_q = "日本の首都は?"
output_a = "東京です。"
score, thought = g_eval_score(input_q, output_a, EVALUATION_CRITERIA)

print(f"\nFinal Weighted Score: {score:.2f}")
print(f"Thought Process: {thought[:100]}...")

コードの解説

  1. 2段階の評価プロセス: はじめにCoTを生成させ、その内容を踏まえてスコア判定を実行することで、評価に対する論理的な裏付けを確保します。
  2. logprobs=True の活用: モデルが出力しようとしたトークンの候補群と、それぞれの生成確率を取得します。
  3. 期待値の算出: 最も確率が高い数字を選ぶのではなく、各確率を用いた加重平均(期待値)を計算します。これが人間の感覚に近い滑らかな評価を実現する重要なポイントです。

RAGシステム評価への応用:コンテキスト依存性の検証

確率重み付けを用いたスコアリング関数の実装 - Section Image

RAGの評価では「質問」と「回答」だけでなく、「検索されたドキュメント(Context)」も含める必要があります。100万トークン級のコンテキストウィンドウと高度な推論能力を備えたGPT-5.2を活用することで、膨大な検索ドキュメント群全体を一度に入力し、正確に文脈の依存性を検証できます。

Retrieval Contextを含めた評価フローの構築

RAG評価の代表的な指標に「忠実性(Faithfulness)」があります。これは「回答が検索されたドキュメントの内容に基づいているか」を測るものです。

プロンプトを修正し、Contextを考慮できるようにします。長文処理と論理的監査に優れた最新モデルを想定した厳格な役割定義を与えます。

FAITHFULNESS_TEMPLATE = Template("""
あなたは情報の整合性をチェックする厳格な監査人です。

### 検索されたコンテキスト
$context

### AIの回答
$output

評価基準:
AIの回答に含まれるすべての主張が、上記のコンテキストによって裏付けられているか評価してください。
コンテキストにない情報を捏造している場合は低評価としてください。

(以下、CoTとスコアリングの指示は同様)
""")

ハルシネーション検出のための実装パターン

実務の現場ではこれらをPandasなどで一括処理します。評価パイプラインのバックエンドを推論精度が向上したGPT-5.2へ移行することで、より人間感覚に近い安定したスコアリングが期待できます。

import pandas as pd

# データセット例
df = pd.DataFrame({
    "question": ["...", "..."],
    "context": ["...", "..."], # 検索されたドキュメント本文
    "answer": ["...", "..."]    # RAGが生成した回答
})

def evaluate_rag_batch(df):
    results = []
    for _, row in df.iterrows():
        # Faithfulnessの評価
        score, _ = g_eval_score_with_context( # 上記関数をコンテキスト対応版に拡張したもの
            context=row['context'],
            output=row['answer'],
            criteria=FAITHFULNESS_CRITERIA
        )
        results.append(score)
    
    df['faithfulness_score'] = results
    return df

# 実行と分析
evaluated_df = evaluate_rag_batch(df)
print(evaluated_df['faithfulness_score'].mean()) # 全体の平均スコア

パイプライン化することで「検索アルゴリズムを変更したらハルシネーションが減ったか」を定量的に比較できるようになります。

実装時の注意点とコスト最適化

本番環境で自動評価システムを安定稼働させるため、評価の精度と運用コストのバランスを最適化する実践的なアプローチを整理します。経営者視点でもコスト管理は非常に重要です。

最新モデル vs 軽量モデル:モデル選定と精度のトレードオフ

「評価にはGPT-5.2を使用する」ことが現在の強い推奨事項です。2026年2月にGPT-4oなどのレガシーモデルが廃止され、GPT-5.2が標準モデルとなりました。

軽量モデルは推論コストが低い反面、複雑な指示(CoT)に従う能力や文脈のニュアンスを汲み取る能力が不足しがちです。GPT-5.2は思考プロセスと即時応答の自動ルーティングが向上しており、長文でも安定した評価推論が可能です。評価を担う中核モデルには推論能力の最も高い最新モデルを選択することが鉄則です。ソースコードの評価にはGPT-5.3-Codexの採用が効果的でしょう。

評価バイアス(Position Bias)への対策

LLMを評価者として用いる場合、選択肢の順番や特定の位置の情報に評価が引きずられる「Position Bias(位置バイアス)」や、極端な数値を避ける傾向に注意が必要です。

バイアス軽減には以下の対策が有効です。

  • 評価基準(Rubric)の明確化: 曖昧な表現を排除し、各スコアの定義を具体的に記述する。
  • Few-shotプロンプティング: 望ましい評価の具体例をプロンプト内に含める。
  • 複数回評価の平均化: 同一入力に対して複数回の評価を実行し、平均値を取ることでノイズを平滑化する。

高度なモデルであっても、これらの基本的なガードレールは設定しておくことを強くお勧めします。

APIコスト試算とキャッシュ戦略

高精度な最新モデルによる全件評価はAPI利用料の増加に直結します。コスト管理を解決するために、以下の戦略の組み合わせを推奨します。

  • サンプリング: 全件ではなく、ランダムに抽出した一定割合(例:10%)のみを評価対象とする。
  • キャッシュ層の導入: 質問、回答、コンテキストの組み合わせが完全に同一であれば、キャッシュされた評価結果を再利用する。
  • 階層的アプローチ: 安価な軽量モデルで簡易スクリーニングを行い、基準を下回った「疑わしい回答」のみを高精度なGPT-5.2で詳細に再評価する。

これらの工夫により、評価品質を落とさずに運用コストを適正範囲に収めることが可能です。

まとめ

RAGシステム評価への応用:コンテキスト依存性の検証 - Section Image 3

G-EvalをはじめとするLLMを用いた自動評価の実装は、本質的には「思考プロセスを促す適切なプロンプト(CoT)」と「確率分布に基づいたスコア算出」の組み合わせです。

今回解説した概念とコード構造をベースに、プロジェクト要件に合致した専用の評価指標を構築できます。ユーザーフィードバックと自動評価スコアを定期的に突き合わせ、プロンプトの評価基準をチューニングしていく反復的なプロセスが効果的です。

信頼できる自動評価の仕組みが整えば、RAGの検索ロジックやプロンプト改修時の影響を即座に定量的に検知できるようになります。このフィードバックループの短縮は、AIアプリケーション開発のスピードと品質を根本から引き上げます。

属人的な感覚や従来の静的な指標から脱却し、より人間の感覚に近い「信頼できる裁判官」をAIパイプラインに組み込むことで、より高度で実用的なシステム構築を目指してください。皆さんのプロジェクトが次のステージへ進むことを期待しています。

脱BLEUスコア:ChatGPTとG-Evalで構築する「人間感覚」に近いAI自動評価システムの実装 - Conclusion Image

参考文献

  1. https://qiita.com/__sgzk__/items/d5196312b0f34f170aa2
  2. https://docs.cloud.google.com/customer-engagement-ai/conversational-agents/ps/reference/rpc/google.cloud.ces.v1beta?hl=ja
  3. https://aws.amazon.com/jp/blogs/news/embodied-ai-blog-series-part-1/
  4. https://dev.classmethod.jp/articles/openclaw-closed-loop/
  5. https://www.gtalent.jp/blog
  6. https://github.com/524y/everything-claude-code-japanese

コメント

コメントは1週間で消えます
コメントを読み込み中...