「なんとなく」の評価から脱却:RAGASでRAGのパフォーマンスを定量化する

AI tutorial - IT technology blog
AI tutorial - IT technology blog

「雰囲気重視」の評価における問題点

誰もが経験したことがあるはずです。検索拡張生成(RAG)システムを構築し、5つの質問を投げかけ、回答が妥当そうに見えるからといって、それをプロダクション環境に投入できると思い込んでしまう。業界ではこれを「雰囲気(vibe-based)」ベースの評価と呼んでいます。週末の趣味のプロジェクトならそれで十分ですが、プロフェッショナルな環境では失敗を招く原因となります。

私がこれを痛感したのは、テストでは完璧に見えたシステムが、実際のユーザーに使われ始めた途端、存在しない40%割引をハルシネーション(幻覚)として生成し始めた時でした。「測定できないものは改善できない」という言葉があります。埋め込みモデルを変更したり、チャンクサイズを500から1,000トークンに調整したりした場合、システムが実際に改善されたかどうかをデータで知る必要があります。RAGAS(RAG Assessment)は、「LLM-as-a-judge(評価者としてのLLM)」というアプローチを用いることで、客観的なスコアを提供し、この問題を解決します。

RAGの三要素:重要なメトリクス

RAGASは最終的なテキストだけを見るのではありません。ユーザーの質問、取得されたドキュメント、そして生成された回答の間の関係を分析します。これにより、パイプラインのどこで問題が発生しているかを明確に把握できます。

  • Faithfulness(忠実性): 回答が取得されたコンテキストにどれだけ忠実かを測定します。ドキュメントに「上限は500ドル」とあるのに、LLMが「上限は5,000ドル」と回答した場合、忠実性スコアはゼロに近づきます。これはハルシネーションを検知するための最良のツールです。
  • Answer Relevancy(回答の関連性): 回答が実際にユーザーの課題を解決しているかを確認します。無駄な情報を無視し、技術的には正しくても質問の意図を外している回答には低い評価を与えます。
  • Context Recall(コンテキストの再現率): リトリーバー(検索部分)を評価します。人間が検証した「Ground Truth(正解データ)」と比較して、質問に答えるために必要な特定の情報を検索エンジンが実際に見つけられたかどうかをチェックします。

環境のセットアップ

Python環境とLLMプロバイダーのAPIキーが必要です。RAGASはシステムの採点にLLMを使用するため、100件のクエリの評価を実行するには、選択するモデルにもよりますが、通常0.50ドルから2.00ドル程度のコストがかかります。自動化された品質保証(QA)のためのコストとしては、わずかなものです。

まずは必要なパッケージをインストールしましょう。

pip install ragas datasets openai langchain

環境変数を設定します。.envファイルを使用するのがベストプラクティスですが、簡単なテストであればスクリプト内で直接設定することも可能です。

import os
os.environ["OPENAI_API_KEY"] = "ここにAPIキーを入力"

評価データセットの構築

RAGASはライブアプリケーションのコード内で動作するのではなく、システムの最近の出力結果を含むデータセットを読み込ませて使用します。完全なレポートを得るには、データを以下の4つの特定のカラムに整理する必要があります。

  1. Question: ユーザーの元の入力。
  2. Answer: RAGパイプラインによって生成されたテキスト。
  3. Contexts: リトリーバーがデータベースから取得した特定のテキストチャンク。
  4. Ground Truth: ベンチマークとして使用される、人間が作成した理想的な回答。

datasetsライブラリを使用してこれを構造化する方法は以下の通りです。

from datasets import Dataset

data_samples = {
    'question': ['電子機器の返品ポリシーを教えてください。'],
    'answer': ['電子機器は30日以内に返品可能です。'],
    'contexts': [['当社のポリシーでは、レシートがあれば電子機器の返品を30日間受け付けています。']],
    'ground_truth': ['電子機器は30日以内に返品する必要があり、レシートが必要です。']
}

dataset = Dataset.from_dict(data_samples)

評価の実行

データの準備ができたら、評価を実行できます。私は通常、基本的なベクトル検索からBM25を使用したハイブリッド検索に切り替えるなど、検索パラメータを変更するたびにこれらのテストをバッチで実行しています。

from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_recall

# スコアリング処理を実行
results = evaluate(
    dataset,
    metrics=[faithfulness, answer_relevancy, context_recall],
)

df = results.to_pandas()
print(df)

出力結果には、各カテゴリごとに0から1の間のスコアが表示されます。Faithfulness(忠実性)のスコアが0.95であれば優秀です。もし0.40というスコアが出た場合、LLMが提供されたドキュメントを無視して、自身の内部学習データに頼っている可能性があります。

スコアをアクションにつなげる

RAGASの真の価値は診断にあります。もしContext Recallが低いのにFaithfulnessが高い場合、LLMは正直に回答していますが、検索エンジンが失敗しています。チャンク戦略を改善するか、埋め込みモデルをtext-embedding-3-smallから3-largeにアップグレードする必要があるかもしれません。

逆に、Answer Relevancyが低い場合は、リトリーバーは正しいデータを見つけていますが、LLMが本筋から逸れてしまっています。この場合、私は通常、システムプロンプトを簡素化するか、最終的な生成ステップにGPT-4oのようなより強力なモデルを使用します。

ローカルモデルによるスケーリング

数千行の評価を行う際のコストが心配な場合は、Ollamaを使用して評価用モデルをローカルモデルに切り替えることができます。これにより、外部APIにデータを送信することなく、ローカルで大規模なベンチマークを実行できます。

from langchain_openai import ChatOpenAI
from ragas.metrics import faithfulness

# 評価用に特定の高性能モデルを使用する
faithfulness.llm = ChatOpenAI(model="gpt-4o")

これらのメトリクスを標準化したことで、私のAI開発手法は変わりました。推測する代わりに、特定のプロンプト調整によって精度が12%向上したことを証明できるようになりました。まずは20個の高品質な質問からなる「ゴールデン・データセット」を作成することから始めてください。コードに触れるたびにRAGASを実行すれば、ユーザーが気づく前にAIの失敗を防ぐことができるはずです。

Share: