RAGASによるRAG評価:「直感」からFaithfulness、Answer Relevance、Context Precisionの指標評価へ

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

背景:RAG構築において「直感」を信じてはいけない理由

LangChainやLlamaIndexを使ってRAGボットを構築すること自体は難しくありません。最も難しいのは、「本当にうまく動いているのか?」という問いに答えることです。

最初は、20問ほどの質問を投げて自分で結果を確認する手動テストを行っていましたが、これは非常に手間がかかり、主観的です。ボットがスムーズに回答することもありますが、プロンプトを少し変えるだけで、すぐに「作り話(ハルシネーション)」を始めてしまうことがあります。

RAGAS (RAG Assessment) は、この問題を解決するために生まれました。「ボットは安定している」という曖昧な表現の代わりに、「忠実性(Faithfulness)は0.92/1.0である」と断言できるようになります。これは、具体的な数値を通じてRAGの品質を定量化するためのフレームワークです。

RAGシステムは通常、**Retrieval**(データ検索)と**Generation**(回答生成)の2つのフェーズで失敗します。RAGASは、これらの各プロセスを詳細に検証するための指標(メトリクス)を提供します。

RAGASライブラリのインストール

クリーンなPython環境を用意してください。RAGASはLangChainと非常に相性が良いですが、他のフレームワークを使用していても独立して動作します。

pip install ragas datasets langchain-openai

RAGASは、採点を行う「試験官」として強力なLLM(デフォルトはGPT-4o)を使用します。まずはOpenAIのAPIキーを設定するか、コストを抑えたい場合はローカルでOllamaを使用するように構成します。

import os
os.environ["OPENAI_API_KEY"] = "sk-your-key"

システム最適化のための3つの「黄金」指標

実際のプロジェクト導入経験に基づき、注視すべき最も重要な3つの指標を紹介します。

1. Faithfulness(忠実性)

この指標は、回答が提供された入力データ(コンテキスト)に本当に基づいているかを確認します。ドキュメントに含まれていない情報をAIが勝手に推論してしまうのを防ぐのに役立ちます。

  • 仕組み: RAGASは回答から主要な主張を抽出し、それをコンテキストと照らし合わせます。証拠のない主張は減点対象となります。
  • 例: コンテキストには売上が100億円とあるのに、ボットが120億円と回答した場合、Faithfulnessのスコアは0に近くなります。

2. Answer Relevance(回答の関連性)

AIが正しい事実を述べていても、質問の意図から外れていることがあります。Answer Relevanceは、元の質問に対する回答の関連性を測定します。

  • 仕組み: RAGASは現在の回答から逆に質問を生成します。その後、生成された質問とユーザーの元の質問との類似性を計算します。
  • 注意点: 回答が冗長だったり、的外れな内容が含まれていたりすると、情報の正確性に関わらずこのスコアは低くなります。

3. Context Precision(文脈の精度)

この指標は、**Retrieval**(検索)部分の評価に特化しています。検索されたテキスト断片(チャンク)に必要な情報が含まれているか、また優先順位が正しいかを確認します。

例えば、関連する上位5つのドキュメントを取得したとします。最も重要な情報が1番目ではなく5番目にある場合、Context Precisionのスコアは大きく低下します。

実践的な評価の実装

テストを実行するには、「質問」「AIの回答」「検索されたコンテキスト」「正解例(Ground Truth)」を含むデータセットを準備する必要があります。

以下は、テストセットを素早く実行するためのサンプルコードです:

from datasets import Dataset
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevance, context_precision

data_samples = {
    'question': ['フランスの首都は何ですか?', '電球を発明したのは誰ですか?'],
    'answer': ['パリです。', 'トーマス・エジソンが商用電球を開発しました。'],
    'contexts': [
        ['パリはフランスの首都です。'],
        ['エジソンは最初の人ではありませんが、白熱電球を最適化しました。']
    ],
    'ground_truth': ['パリ', 'トーマス・エジソン']
}

dataset = Dataset.from_dict(data_samples)
score = evaluate(dataset, metrics=[faithfulness, answer_relevance, context_precision])
print(score.to_pandas())

実際には、このステップをGitHub ActionsのCI/CDパイプラインに組み込むことが多いです。プロンプトの修正後に平均スコアが0.8を下回った場合、自動的にマージをブロックするように設定します。

RAGAS活用のための「現場의教訓」

多くのプロジェクトを経て、無駄なコストを抑え、正確な結果を得るための経験則をまとめました:

  • テストセットの選別: 数千件のデータベースすべてを評価するのではなく、代表的な30〜50問(ゴールデンデータセット)を選んで定期的に実行してください。
  • GPT-4oを優先: GPT-3.5は安価ですが、Faithfulnessの採点能力が非常に低いです。性能の低いモデルを試験官にすると、結果が著しく歪む可能性があります。
  • コスト管理: GPT-4oで100サンプルを採点すると、約1〜2ドルかかります。予算を最適化するために、テストの実行頻度を検討してください。
  • 低スコア時の対処: Context Precisionが低い場合は、Chunking(チャンク分割)やEmbedding(埋め込み)手法を見直してください。Faithfulnessが低い場合は、System Promptを厳格に調整してください。

「測定できるものは改善できる」と言います。「ボットは大丈夫だと思います」と言う代わりに、明確な指標グラフを含むレポートをクライアントに提示しましょう。皆さんのボットの最適化が成功することを願っています!

Share: