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は強力な評価ツールになると思います。ぜひ一度試してみてください!
Discussion