
RAG システムの品質は、検索が適切な文書を引けているかと、生成された回答がその文脈に忠実かの2軸で決まる。LLM-as-a-Judge は、この品質判定そのものを大規模言語モデルに任せる手法だ。まずは従来の評価手段が抱える限界と、LLM をジャッジに使う発想がなぜ生まれたのかを整理する。
RAG の回答品質を測る従来の方法は、大きく人手評価とルールベース評価の2つだった。どちらも RAG が本番規模になると行き詰まる。
人手評価は、人間が回答を読んで正確さや有用性を採点する方法だ。判断の質は高いが、評価対象が数百〜数千件に増えると時間とコストが跳ね上がり、評価者によって基準がぶれる。リリースのたびに全件を採点し直すのは現実的でない。
ルールベース評価は、BLEU や ROUGE のように正解文との表層的な一致度を機械的に測る方法だ。高速で再現性はあるが、表現が違っても意味が正しい回答を低く採点したり、文字面が似ているだけの誤答を高く採点したりする。意味の正しさを問う RAG の評価には向かない。
つまり、人手評価はスケールせず、ルールベース評価は意味を捉えられない。この空白を埋めるのが LLM-as-a-Judge だ。
LLM-as-a-Judge は、回答の意味を理解できる大規模言語モデルを評価者(ジャッジ)として使い、人手評価に近い判断を自動かつ大量に下す手法だ。
ジャッジ用の LLM に「質問・取得された文脈・生成された回答」を渡し、あらかじめ定義した基準(例: 文脈に忠実か、質問に答えているか)でスコアや合否を返させる。これにより、人手では追いつかない件数を短時間で評価でき、基準もプロンプトで固定するため評価者ごとのばらつきを抑えられる。
ルールベース評価と違い、表現が異なっても意味が正しければ正しく採点できる点が大きい。一方で、ジャッジ自身も LLM である以上、後述するバイアスや判定のばらつきという固有の弱点を抱える。だからこそ、評価基準の設計と検証が品質を左右する。
LLM-as-a-Judge をゼロから実装することもできるが、実務では評価フレームワークを使うのが一般的だ。代表的なのが RAGAS で、RAG 専用の評価指標と、それを LLM ジャッジで計測する仕組みをまとめて提供する。
RAGAS は「忠実性」「回答関連性」「コンテキスト適合率」といった RAG に適した指標を標準で備え、内部でジャッジ用 LLM を呼び出してスコアを算出する。自前でプロンプトと採点ロジックを組むより立ち上げが速く、指標の定義も共通化される。
他にも汎用の評価ライブラリは複数あるが、本記事では RAG 評価で広く使われる RAGAS を軸に LLM-as-a-Judge の実装手順を説明する。なお、各指標の意味と RAG 精度改善への活かし方はRAG の精度を上げる方法で詳しく扱っているため、本記事は評価の自動化に焦点を絞る。

評価パイプラインは、いきなり指標を回す前に土台を整えることで精度と再現性が決まる。ここでは、評価対象の整理・ジャッジ LLM の選定・テストセットの準備という3つの前提を確認する。
最初にやるべきは、何を評価するのかを明確にすることだ。RAG パイプラインは「検索(リトリーバル)」と「生成」の2段階に分かれ、評価指標もそれぞれに対応する。どちらのどの出力を測るのかを決めておかないと、指標を選んでも当てはめられない。
具体的には、評価のために最低でも次の3つを記録できる状態にする。ユーザーの質問、検索で取得された文脈(チャンク)、そして最終的に生成された回答だ。指標によっては、これに加えて正解(リファレンス)も必要になる。
既存の RAG が回答しか保存していない場合、取得した文脈をログに残すよう改修する必要がある。文脈が取れないと、検索品質を測る指標が計算できないからだ。評価設計は、この出力形式の整理から始まる。
ジャッジに使う LLM は、評価対象の回答を生成したモデルと同等以上の判断力を持つものを選ぶのが基本だ。判断力が低いモデルをジャッジにすると、評価そのものが信用できなくなる。GPT・Claude・Gemini などのフロンティアモデルが候補になる。
選定では次の3点を確認する。第一に、長い文脈(質問・取得文脈・回答をまとめて渡す)を扱えるコンテキスト長があるか。第二に、評価を安定させるため出力をスコアや JSON で構造化して返せるか。第三に、評価件数に応じた API レートとコストに耐えられるか。
社内データを評価に流す場合は、データの取り扱いにも注意がいる。機密性が高いデータであれば、外部 API ではなくオンプレやプライベート環境で動くローカル LLMをジャッジに使う選択肢も検討する。
評価の信頼性は、テストセット(ゴールデンデータセット)の質でほぼ決まる。これは「想定される質問」と、必要に応じて「期待される回答や根拠となる文脈」をひとまとめにした評価用データだ。
良いテストセットの条件は3つある。実際のユーザーが投げる質問の分布を反映していること、簡単な質問だけでなく曖昧・複合・意地悪な質問も含むこと、そして本番データから継続的に更新されることだ。開発者が思いつく質問だけで作ると、本番で起きる失敗を捉えられない。
件数は多いほど安定するが、まずは代表的なユースケースを網羅する数十〜数百件から始め、本番で見つかった失敗例を継続的に追加していくのが現実的だ。なお、テストセットの作り方を誤ると評価結果が信用できなくなる。その典型的な失敗は後半のセクションで詳しく扱う。

RAG の評価指標は数多くあるが、やみくもに全部を測っても解釈に困る。ここでは、ジャッジが採点する代表的な指標と、RAGAS との対応づけ、そしてユースケースごとの優先順位の決め方を順に見ていく。
LLM-as-a-Judge で RAG を評価するとき、中心になる指標は次の3つだ。それぞれ「ジャッジが何を見て採点するか」という判定観点が異なる。
忠実性(Faithfulness):生成された回答が、取得された文脈に裏づけられているか。ジャッジは回答の各主張が文脈から導けるかを確認し、文脈にない情報を回答が述べていれば(=ハルシネーション)低く採点する。
回答関連性(Answer Relevancy):回答が質問の意図にきちんと答えているか。ジャッジは、正確でも的外れな回答や、冗長で要点がぼやけた回答を減点する。
コンテキスト適合率(Context Precision):検索で取得した文脈のうち、回答に必要なものがどれだけ含まれているか。これは生成ではなく検索段階の品質を測る指標だ。
忠実性と回答関連性は生成の質を、コンテキスト適合率は検索の質を見る。問題がどちらの段階にあるのかを切り分けられる点が、指標を分けて測る価値だ。
前項の指標は、RAGAS では標準メトリクスとして実装されており、内部で LLM ジャッジを呼び出して自動算出される。忠実性は faithfulness、回答関連性は answer relevancy、検索品質は context precision / context recall に対応する。
LLM-as-a-Judge を自前で実装する場合も、この対応関係を押さえておくと指標設計の指針になる。RAGAS を使うなら、各メトリクスがどのデータ(質問・文脈・回答・正解)を必要とするかを確認し、テストセットがその入力を満たすように整える。
各メトリクスが数値として何を意味し、低スコアをどう RAG の改善(リランキングやハイブリッド検索など)につなげるかは、RAG の精度を上げる方法:ハルシネーション削減とハイブリッド検索で体系的に解説している。本記事では、これらの指標を「ジャッジでどう自動採点し、運用に乗せるか」に集中する。
すべての指標を等しく重視する必要はない。RAG の用途によって、まず守るべき指標は変わる。
社内規程や法令、医療・金融など正確さが致命的に重要な用途では、忠実性を最優先にする。文脈にない情報を答える(ハルシネーション)ことが最大のリスクだからだ。一方、カスタマーサポートや社内ヘルプデスクのように回答のわかりやすさが効く用途では、回答関連性の比重を上げる。
検索対象の文書が多く、ノイズが混ざりやすいナレッジベースでは、コンテキスト適合率を見て検索段階の品質を継続的に監視する。
優先順位を決めたら、それを合否ライン(閾値)に反映させる。たとえば「忠実性は基準値未満を不合格」のように、用途のリスクに応じて指標ごとに基準を変えるのが実務的だ。すべてを高水準で求めると、改善の焦点がぼやけてしまう。

ここからは、RAGAS を使って LLM-as-a-Judge の評価パイプラインを実装する流れを4ステップで示す。環境構築から、ジャッジプロンプトの設計、スコアの集計・出力までを順に組み立てる。
まず評価環境を整える。Python 環境に RAGAS と、ジャッジ用 LLM のクライアント(利用するモデルの SDK)を用意する。
次に、評価データを RAGAS が受け取れる形式にそろえる。基本となるのは、質問・取得された文脈・生成された回答・(必要なら)正解の4要素だ。RAGAS ではこれらを列に持つデータセットとして渡す。
1from datasets import Dataset
2
3data = {
4 "question": ["就業規則の有給休暇の付与日数は?"],
5 "contexts": [["入社6か月で10日付与される..."]],
6 "answer": ["入社6か月後に10日付与されます。"],
7 "ground_truth": ["6か月継続勤務で10日付与。"],
8}
9dataset = Dataset.from_dict(data)ここで重要なのは、contexts に「実際に検索で取得した文脈」を入れることだ。理想の文脈ではなく本番と同じ検索結果を渡さないと、検索品質を含めた評価にならない。入力形式を固定したら、次はジャッジの中身を設計する。
LLM-as-a-Judge の品質は、ジャッジに渡すプロンプトの設計でほぼ決まる。RAGAS の標準メトリクスを使う場合は内部プロンプトに任せられるが、独自基準で採点したい場合は自前のジャッジプロンプトを設計する。
設計の要点は3つある。第一に、採点基準を曖昧な形容詞ではなく具体的な観点で書く。「良い回答か」ではなく「回答の各主張が文脈に裏づけられているか」と問う。第二に、出力をスコアや JSON など構造化された形式に固定し、後段で機械的に集計できるようにする。第三に、判定理由も一緒に出させると、低スコアの原因を後で追える。
1あなたは厳格な評価者です。以下の回答が、与えられた文脈だけに基づいているかを判定してください。
2文脈にない情報が含まれる場合は faithful=false とします。
3出力は {"faithful": true/false, "reason": "..."} の JSON 形式のみ。評点を1〜5のような段階にするか、合否の2値にするかは用途による。段階評価は傾向を追いやすく、2値は合否判定を自動化しやすい。
個々の採点ができたら、テストセット全体で集計し、人が見て判断できるレポートに落とす。RAGAS では evaluate を呼ぶと、データセット全体に対して各メトリクスのスコアをまとめて算出できる。
1from ragas import evaluate
2from ragas.metrics import faithfulness, answer_relevancy, context_precision
3
4result = evaluate(
5 dataset,
6 metrics=[faithfulness, answer_relevancy, context_precision],
7)
8print(result)集計の出力は、指標ごとの平均スコアだけでなく、低スコアだった個別ケースを抽出できるようにしておく。平均だけ見ても、どの質問でなぜ失敗したかが分からないからだ。
レポートは、指標ごとの平均・閾値との比較・不合格ケースの一覧という構成にすると、改善のアクションにつなげやすい。この出力を後述の CI/CD に組み込むことで、評価を一度きりでなく継続的なプロセスにできる。

LLM-as-a-Judge は強力だが、ジャッジ自身が LLM であるがゆえの固有の落とし穴がある。ここでは、評価結果を信用できなくする3つの典型的な失敗と、その回避策を扱う。これらはこの手法に特有で、見落とすと「評価しているのに品質が上がらない」状態に陥る。
ジャッジに使う LLM には、いくつかの既知のバイアスがあることが報告されている。代表的なのが、長い回答を高く採点しがちな傾向や、最初に提示された選択肢を好む傾向、そして自分(同じモデル)が生成した回答を甘く採点する自己評価バイアスだ。
特に注意したいのが自己評価問題だ。回答を生成したモデルと、それを採点するジャッジに同じモデルを使うと、評価が甘くなる恐れがある。回避策としては、生成とは別系統のモデルをジャッジに据える、複数のモデルで採点して結果を突き合わせる、といった方法が有効だ。
バイアスを完全に消すことはできないが、影響を減らすことはできる。採点基準を具体化してジャッジの裁量を狭める、回答の長さや順序が結果に効いていないか定期的に確認する、そして要所では人手評価と照合してジャッジの妥当性そのものを検証する。ジャッジを盲信せず、ジャッジ自体を評価対象に含める姿勢が重要だ。
同じ回答を評価しているのにスコアが安定しない場合、原因の多くはジャッジプロンプトの曖昧さにある。
「回答の質を10点満点で採点せよ」のような指示は、何をもって高得点とするかがジャッジに委ねられ、実行のたびに結果がぶれる。採点基準を具体的な観点に分解し、それぞれを個別に判定させることでばらつきは大きく減る。
ばらつきを抑える実務的な工夫としては、温度(temperature)を低く設定して出力を安定させる、判定基準と出力形式を例示(フューショット)でジャッジに示す、同じケースを複数回採点して一致度を確認する、といった方法がある。
評価を始める前に、少数のケースで「同じ入力を繰り返し採点しても結果が安定するか」を必ず確認したい。ここが不安定なまま大量評価に進むと、出てきたスコアの差が品質の差なのか、ジャッジのぶれなのか区別できなくなる。
テストセットの汚染(データコンタミネーション)とは、評価に使うデータが評価結果を不当に良く見せてしまう状態を指す。LLM-as-a-Judge では主に2つの形で起きる。
ひとつは、テストセットの質問や正解が、RAG の対象文書やプロンプトの例として混入してしまうケースだ。これでは「答えを知っている問題」を解かせることになり、本番の実力を測れない。評価データと、RAG に与える知識・例示は明確に分離する。
もうひとつは、テストセットが古くなり本番データと乖離するケースだ。本番で実際に来る質問が変わっているのに、古い質問だけで評価していると、スコアは良くても現場では失敗する。
回避策は、評価データを RAG の知識ベースから物理的に切り離して管理すること、そして本番で見つかった失敗例を定期的にテストセットへ反映し、評価の鮮度を保つことだ。汚染した評価は、ないより危険なことがある。良い数字が油断を生むからだ。

評価は一度きりでは意味が薄い。RAG はデータやモデルの更新で品質が変動するため、変更のたびに自動で評価が走る仕組みが要る。評価パイプラインを CI/CD に組み込み継続評価にする全体設計はエンタープライズ RAG を本番運用に乗せる実装ガイドでも扱っている。ここでは LLM-as-a-Judge を自動評価として回す要点を示す。
継続評価の典型は、コードやプロンプト、データの変更を起点に評価を自動実行する構成だ。GitHub を使うなら、プルリクエストや特定ブランチへのマージをトリガーに、評価スクリプトを走らせる。
1name: rag-eval
2on:
3 pull_request:
4 branches: [main]
5jobs:
6 evaluate:
7 runs-on: ubuntu-latest
8 steps:
9 - uses: actions/checkout@v4
10 - run: pip install ragas datasets
11 - run: python eval/run_ragas.py
12 env:
13 LLM_API_KEY: ${{ secrets.LLM_API_KEY }}ジャッジ用 LLM の API キーは、リポジトリのシークレットとして安全に渡す。評価は API コストがかかるため、毎コミットではなくプルリクエスト単位など、頻度を制御するのが現実的だ。テストセットが大きい場合は、変更に関係する一部だけを回す軽量評価と、定期的な全件評価を分けるとコストと網羅性を両立できる。
自動評価を価値あるものにする最後の鍵が、閾値(合否ライン)の管理とアラートだ。スコアをただ記録するだけでは、品質が落ちても気づけない。
まず、指標ごとに合否の閾値を決め、それを下回ったら CI を失敗させる。たとえば忠実性が基準を割ったプルリクエストはマージをブロックする、といった運用だ。これにより、品質を下げる変更が本番に入る前に止められる。
閾値は固定で運用を始め、現場の実態に合わせて調整する。厳しすぎると正当な変更まで止まり、緩すぎると劣化を見逃す。過去のスコア推移を見ながら、用途のリスクに見合う水準に寄せていく。
アラートは、CI の失敗通知に加え、本番運用中のスコアを定期的にサンプリングして劣化を検知する仕組みがあると望ましい。評価を「リリース前のゲート」と「運用中の監視」の両輪で回すことで、RAG の品質を継続的に保てる。LLM-as-a-Judge は、その自動化を支える中核の手法だ。
Chi
ラオス国立大学で情報科学を専攻し、在学中は統計ソフトウェアの開発に従事。データ分析とプログラミングの基礎を実践的に培った。2021 年より Web・アプリケーション開発の道に進み、2023 年からはフロントエンドとバックエンドの両領域で本格的な開発経験を積む。当社では AI を活用した Web サービスの設計・開発を担当し、自然言語処理(NLP)、機械学習、生成 AI・大規模言語モデル(LLM)を業務システムに統合するプロジェクトに携わる。最新技術のキャッチアップに貪欲で、技術検証から本番実装までのスピード感を大切にしている。