実行プログラムと拡張機能

ローカルLLM・RAG品質評価:DeepEvalに変更された設定を確認する

クイック設定が仕事の回答まで良くなったかどうかは別に確認する必要があります

業務上の質問と正解の根拠を固定し、DeepEvalで検索コンテキストと回答を別々に採点します。Ollamaを評価モデルに指定できますが、スコアだけでなく原文、応答時間、メモリの記録も合わせて確認してください。

実行条件と要点
  • 質問ごとに期待する回答と検索されるべき文を記録します。
  • Contextual Recallで検索コンテキストを、Faithfulnessで回答が根拠に基づいているかを確認します。
  • Ollamaを評価モデルに指定して、deepeval test runを実行します。
  • 評価スコアと検索時間、最初のトークンまでの時間、生成時間、最大メモリ使用量を一緒に保存します。

休暇規程に関する質問20件と回答を先に書き出します

例として、社内の休暇規程PDFを検索するRAG1を評価します。一文で答えられる質問、表の例外条件を探す質問、文書に答えがない質問を混ぜて20件用意します。各行に質問、期待する回答、必ず検索されるべき根拠の文、または「文書に根拠なし」を記録します。実際の業務上の質問を使いますが、個人情報や機密文書の原文を評価サービスへ送信してよいか、先に確認してください。

比較の基準となる実行結果を保存してから、モデル、量子化2、チャンク設定のうち一つだけを変更します。両方の設定に同じ質問と期待回答を使い、質問セットの違いを性能差と取り違えないようにします。文書の内容や期待回答が変わった場合は、質問セットも新しいバージョンにして変更を記録してください。

さまざまな種類の質問と根拠を均等に配置した評価セット
簡単な質問と難しい質問、短い入力と長い入力を実際の使用率に合わせて混ぜます。

検索された根拠と回答を別々に採点します

検索の失敗と回答の失敗を区別するには、入力、期待回答、モデルの回答、検索された根拠を評価データに含めます。DeepEvalのContextualRecallMetricは、期待回答に必要な内容が検索コンテキストに含まれるかを確認します。FaithfulnessMetricは生成された回答が検索コンテキストの範囲内かを確認します。AnswerRelevancyMetricは回答が質問に直接答えているかを確認するために使えます。これらの指標は同じものを測るわけではないため、質問ごとのスコアと判定理由を並べて読んでください。

RAGのスコアだけで規程違反を判定しないでください。評価モデルは文の意味を自動比較する補助役であり、正解そのものではありません。「6か月以上」のような必須条件が抜けたら失敗とすべき質問は、検索された実際の文と回答を人が確認します。DeepEvalのLLM3ベース指標は別の評価モデルを呼び出すため、アプリケーションをローカルで実行しているだけでは評価まで自動的にローカルになるわけではありません。

自動評価結果を原文とともにレビューする人
小さなスコアの違いは、原文と判断の理由を人が一緒にチェックします。

評価モデルもローカルに指定して最初のテストを実行します

DeepEvalの公式ドキュメントには、Ollamaをローカル評価モデルとして使う方法が記載されています。Ollamaをインストールしてサーバーを起動し、プロジェクト用の新しいPython仮想環境4にDeepEvalをインストールします。ollama pull deepseek-r1:1.5bは例の評価モデルをダウンロードし、deepeval set-ollama --model=deepseek-r1:1.5bはDeepEvalの既定評価モデルとして指定します。すでにモデルを持っている場合は、ollama listに表示される名前を使ってください。ここではアプリの回答品質を評価するため、以下のテストコードにある例の回答と検索断片を、実際のRAG実行結果に置き換える必要があります。

次の例では、休暇規程の資格条件を検索して回答したケースをテストします。ファイルをtest_rag.pyとして保存し、deepeval test run test_rag.pyを実行してOllamaの評価モデルが実際に接続されることを確認してください。インストールとモデルのダウンロードはネットワークに接続できる環境で行います。モデルを入手できない、または閉域環境で評価モデルの接続を確認できない場合、評価が実行できたことにはなりません。指標の閾値も例示にすぎず、組織の必須質問と人による確認結果に合わせて決めてください。

Ollamaモデルを用意して上記のコマンドを実行できない環境では、この手順をローカル評価の完了と見なさないでください。テストコードを用意しただけでは、評価モデルとの接続が確認されるまで結果は出ません。また、Confident AIなどの外部サービスにログインしたり結果を同期したりすると、実行記録が端末外へ送信される可能性があります。閉域環境では、結果がローカルに保存されることとネットワークが遮断されていることを別々に確認してください。

インストールとローカル評価モデルの設定
python -m venv .venv
source .venv/bin/activate
pip install -U deepeval
ollama pull deepseek-r1:1.5b
deepeval set-ollama --model=deepseek-r1:1.5b
Ollamaモデルをローカルにダウンロードし、DeepEvalの既定評価モデルとして指定します。すでにインストール済みのOllamaモデルを使う場合は、モデル名を置き換えてください。
test_rag.py
from deepeval import assert_test
from deepeval.metrics import (
    AnswerRelevancyMetric,
    ContextualRecallMetric,
    FaithfulnessMetric,
)
from deepeval.test_case import LLMTestCase


def test_vacation_policy_answer():
    test_case = LLMTestCase(
        input="입사 6개월 차 직원도 여름휴가를 쓸 수 있나요?",
        actual_output="입사 후 6개월 이상이면 여름휴가를 신청할 수 있습니다.",
        expected_output="입사 후 6개월 이상이면 여름휴가를 신청할 수 있습니다.",
        retrieval_context=[
            "여름휴가는 입사 후 6개월 이상 근무한 직원이 신청할 수 있습니다."
        ],
    )
    assert_test(
        test_case,
        [
            ContextualRecallMetric(threshold=0.5),
            FaithfulnessMetric(threshold=0.5),
            AnswerRelevancyMetric(threshold=0.5),
        ],
    )
このコードはテストの接続例です。実際の評価では、`actual_output`と`retrieval_context`を自分のRAGシステムの記録で置き換えます。0.5は指標の初期値にすぎず、業務上の合格基準ではありません。

合格基準を決めてから速度とメモリを比較します

実行ごとに、回答モデルと量子化、チャンクサイズ、埋め込みモデル、評価モデル名とバージョン、最初のトークン5までの時間、生成速度、検索時間、最大メモリ使用量を記録します。同じ質問セットの評価スコアだけでは、速くなった設定で実際にどれだけ待つか分かりません。速度だけを見ると、重要な条件の見落としに気づけない場合があります。

全体平均だけで選ばないでください。休暇の資格のように必ず正解すべき質問について、まず失敗数または合格率の基準を決めます。その基準を満たした設定同士で速度とメモリを比較します。たとえば必須質問に対して「根拠なし」を根拠のある回答のように示す設定は、平均スコアが高くても除外できます。スコア差が小さい項目や評価理由が不自然な項目は、原文、検索された断片、回答を人が確認してから次の設定を比較してください。

迅速な回答と根拠が忠実な回答を並べて比較する装置
品質基準を最初に通過した後、その中でより迅速で安価な構成を選びます。

用語の注釈

  1. 検索拡張生成 — 質問に関連する資料を検索してモデル入力に加え、回答を生成する方式です。検索範囲や資料の品質は実装によって異なります。

    本文に戻る
  2. 量子化 — モデルの数値を少ないビット数で表す方法です。メモリ使用量のほか、精度や実行速度も変わることがあり、影響は形式と実装によります。

    本文に戻る
  3. 大規模言語モデル — 大量のテキストデータで学習し、テキストを処理・生成する言語モデルです。機能や対応入力はモデルごとに異なります。

    本文に戻る
  4. Python仮想環境 — プロジェクトごとにPythonパッケージを分けて導入する環境です。版の衝突を減らすもので、仮想マシンとは異なります。

    本文に戻る
  5. トークン — モデルが入力や出力を分けて処理する単位です。1トークンが1文字や一定の時間に相当するわけではありません。

    本文に戻る