📚

DeepEvalではじめるChatbot精度の自動評価 – LLM-as-a-Judgeの実践

に公開

はじめに

こんにちは、Rehab for JAPANの ui です。
現在弊社では、Difyを活用してRAGをベースとしたFAQを回答するChatbotを開発しています。
より効率的に回答の正確性や品質を検証するため、LLM as a Judgeという評価手法の導入を試みました。

本記事では、DeepEvalを利用してChatbotの回答をどのように評価したかをご紹介します。

LLM-as-a-Judgeとは

LLM(大規模言語モデル)の出力を、同じくLLMを使って評価する手法です。
評価プロンプトを定義し、特定の指標に基づいてスコアを割り当てることで機能します。
評価指標には、G-Evalや回答の関連性、忠実性、バイアスの有無などが含まれます。

参考: LLM-as-a-judge Simply Explained: A Complete Guide to Run LLM Evals at Scale

LLM-as-a-Judgeのメリット

私が実際に試してみて感じた利点は以下の通りです:

  • 大量の評価を短時間で実行可能
  • 出力形式を整形せずそのまま評価に使える
  • 複数のメトリクスで柔軟に評価できるため、アプリケーションの目的に応じた分析がしやすい

DeepEvalで利用できる評価指標

全指標の詳細は公式ドキュメントにありますが、私の理解した範囲で要点を抜粋してまとめます。

指標名 概要
Answer Relevancy 出力が入力とどの程度関連しているか。生成モデルの出力品質を評価。
Faithfulness 出力がretrieval_context(検索で取得した関連情報)と一致しているか。生成内容の信頼性を評価。
Contextual Precision 入力に関連するノードがretrieval_context内で上位にランクされているか。Retrieverの性能を評価。
Contextual Recall retrieval_contextとexpected_outputの一致度。Retrieverの網羅性を評価。
Contextual Relevancy retrieval_contextの全体的な関連性。Retrieverの妥当性を評価。
Tool Correctness 期待されるツールが正しく使用されたかを検証。
Bias 性別、人種、政治などのバイアスの有無を判定。
Toxicity 有害な表現が含まれていないかを評価。
Summarization 正確な要約が行われているかを検証。
Prompt Alignment プロンプトに沿った出力ができているかを評価。
Hallucination 出力に事実と異なる情報が含まれていないかを評価。
Json Correctness 正しいJSONスキーマで出力されているかを評価。

今回行ったこと

今回は以下の3つの指標を用いてChatbotの回答を評価しました。

  • Answer Relevancy
  • Faithfulness
  • Contextual Relevancy

これらはFAQのChatbotにおいて、次のような理由で有効と判断しました:

  • FAQのように期待される出力があらかじめ定義しづらいケースでは、あらかじめ正解の回答(expected_output)」を用意せず、Chatbotの入力、出力、参考にした情報(retrieval_context)を使って、回答の妥当性や信頼性を評価が可能である
  • 回答の根拠となるknowledgeの品質を検証できる

事前準備

まずは以下の準備を行います:

  • pip install deepevalでライブラリをインストール
  • OPENAI_API_KEY.env や環境変数で設定(例:export OPENAI_API_KEY=your-api-key

たとえばAnswer Relevancyの評価は以下のように実装できます:

from deepeval import evaluate
from deepeval.metrics import AnswerRelevancyMetric
from deepeval.test_case import LLMTestCase

class AnswerRelevancyEval:
    def test_correctness(self, input, actual_output):
        metric = AnswerRelevancyMetric(
            threshold=0.7,
            include_reason=True
        )
        test_case = LLMTestCase(
            input=input,
            actual_output=actual_output
        )
        metric.measure(test_case)
        print(metric.score, metric.reason)
        return metric.score, metric.reason

Faithfulness、Contextual Relevancy もほぼ同様のコードで記述できます。


実行結果

弊社プロダクトの「デイリー」におけるFAQに対して実施した評価の一例をご紹介します。
(retrieval_contextは都合により非公開ですが、FaithfulnessやContextual Relevancyの評価には含まれています)

LLM input

運動プログラムの内容を確認する方法を教えてください。

LLM output

運動プログラムの内容は、機能訓練記録の「機能訓練内容を記録」の欄で確認できます。作成済みの計画書があれば、自動的に記載されます。

また、タブレットやPCのWeb画面から参考動画を検索・閲覧することも可能です。ただし、一部のプログラムは動画がなく、画像のみの表示になることがあります。

評価結果

  • Answer Relevancy: 1.00
    「入力と完全に一致した回答で、明確かつ適切。無関係な記述なし。」

  • Faithfulness: 1.00
    「retrieval contextとの矛盾が一切ない。完璧な一貫性。」

  • Contextual Relevancy: 0.8125
    「一部に無関係な情報(例:'タブレットまたはPC')が含まれるが、全体としては目的に合致している。」

※実際の「」内の理由は英語で出力されています。

評価結果を分析する

高スコアの例を紹介しましたが、中にはAnswer Relevancyが1.00でもFaithfulnessが低いケースなども存在します。
そのような場合、retrieval contextの見直しやRetrieverの改善が必要になります。

DeepEvalの良い点は、各スコアの根拠(reason)が取得できるところです。
これを活用してknowledgeの修正や、評価LLMの精度向上(例:追加のファインチューニング)につなげることが可能です。
初期コストはかかるものの、安定すれば継続的な品質管理の強力な武器になります。

最後に

RAGアプリケーションの品質を継続的に改善していくには、定量的な評価の導入が不可欠です。
DeepEvalは、評価プロンプトなしでも柔軟な評価が行え、理由付きのスコア出力にも対応しているため、実運用において非常に心強いツールだと感じました。

特に、FAQのように期待される出力があらかじめ定義しづらいケースでも、「faithfulness」「contextual relevancy」などの指標により実用的な評価が可能です。

今後は、スコアが一定基準を下回ったケースの自動通知や、CI/CDパイプラインへの組み込みによる自動評価なども視野に入れ、RAGアプリの品質向上をさらに推進していく予定です。

RAG開発に取り組まれている方にとって、DeepEvalは強力な評価ツールになると思います。ぜひ一度試してみてください!

Rehab Tech Blog

Discussion