evaluate-rag について
RAG パイプラインを評価するスキルで、まずトレースを分析し、検索と生成を分けて測定する手順を示します。評価データセット、検索指標、チャンク最適化、回答品質の診断を扱います。
主な機能
- 01エンドツーエンドのトレースを先に確認
- 02検索と生成を個別に評価
- 03クエリとチャンクの評価データセットを作成
- 04Recall@k、MRR、NDCG@k などを使用
- 05グリッドサーチでチャンクを最適化
- 06回答の忠実性と関連性を確認
活用シーン
- 01RAG の検索・生成の問題を特定
- 02初回検索と再ランキングの品質測定
- 03マルチホップ検索の網羅性評価
- 04チャンク設定の比較
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ai-evals-course/ evals-skills --skill evaluate-ragインストール後、Claude Code で/evaluate-ragを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yaml
詳細
RAG の評価
概要
- まずエンドツーエンドのトレースをエラー分析します。失敗の原因が検索、生成、またはその両方のどれにあるかを判断します。
- 検索評価用データセットを作成します。クエリと、関連するドキュメントのチャンクを組み合わせます。
- Recall@k を使用して検索品質を測定します(初回の検索で最も重要です)。
- 生成を個別に評価します。忠実性(コンテキストに基づいているか)と関連性(クエリに答えているか)を確認します。
- ボトルネックが検索にある場合は、生成の調整より先にグリッドサーチでチャンク分割を最適化します。
前提条件
指標を選ぶ前に、RAG パイプラインのトレースをエラー分析します。何が検索されたかと、モデルが何を必要としていたかを確認します。問題が検索、生成、またはその両方のどれにあるかを判断します。まず検索を修正します。
主な指示
検索と生成を個別に評価する
各コンポーネントを個別に測定します。検索の各段階に適した指標を使用します。
- 初回の検索: Recall@k の最適化を目指します。ノイズが増えるとしても、関連するドキュメントをすべて含めます。
- 再ランキング: Precision@k、MRR、または NDCG@k の最適化を目指します。関連性の最も高いドキュメントを上位に並べます。
検索評価用データセットの作成
クエリと、正解として関連性が確認されたドキュメントのチャンクを組み合わせる必要があります。
手動で選定(最高品質): 現実的な質問を作成し、それぞれの質問に対する回答を含む正確なチャンクを対応付けます。
合成 QA の生成(拡張性に優れる): 各ドキュメントチャンクについて、LLM に事実を抽出させ、その事実だけから回答できる質問を生成させます。
合成 QA プロンプトのテンプレート:
Given a chunk of text, extract a specific, self-contained fact from it.
Then write a question that is directly and unambiguously answered
by that fact alone.
Return output in JSON format:
{ "fact": "...", "question": "..." }
Chunk: "{text_chunk}"
敵対的な質問の生成: 複数のチャンクの内容に似ているものの、1 つのチャンクだけで回答できる難しいクエリを作成します。
手順:
- 明確な事実を含む対象チャンク A を選びます。
- 埋め込み検索を使って類似チャンク B、C を見つけます(用語は共通するものの、答えを含まないチャンク)。
- LLM に、B と C の用語を使いながら、チャンク A だけで回答できる質問を書くよう指示します。
例:
- チャンク A:「2020 年 4 月、同社は四半期収益が 17%減少したと報告しました。これは 2008 年以来最大の減少でした。」
- チャンク B:「同社は金融危機のあった 2008 年に大きな損失を経験しました。」
- 生成された質問:「2008 年の金融危機以来、同社の収益が最も大きく減少したのはいつですか?」
答えを含むのはチャンク A だけです。チャンク B はもっともらしい誤答候補です。
合成質問のフィルタリング: 少数例を使った LLM のスコアリングにより、合成クエリの現実性を評価します。現実的と評価されたもの(1~5 の尺度で 4~5)だけを残します。ここではリッカート尺度が適切です。目的はデータセットの選定に向けた曖昧な順位付けであり、失敗率の測定ではないためです。
検索指標
Recall@k: 上位 k 件の結果に見つかった関連ドキュメントの割合です。
Recall@k = (relevant docs in top k) / (total relevant docs for query)
初回の検索では再現率を優先します。LLM は無関係な内容を無視できますが、見つからなかった内容から生成することはできません。
Precision@k: 上位 k 件の結果のうち、関連性があるものの割合です。
Precision@k = (relevant docs in top k) / k
再ランキングの評価に使用します。
平均逆順位(MRR): 最初の関連ドキュメントがどれだけ上位に表示されるかを測定します。
MRR = (1/N) * sum(1/rank_of_first_relevant_doc)
必要なチャンクが 1 つだけの、単一事実の検索に最適です。
NDCG@k(正規化割引累積利得): ドキュメントの有用性に差がある、段階的な関連性の評価に使用します。関連性の高い項目を上位に配置すると、より高く評価されます。
DCG@k = sum over i=1..k of: rel_i / log2(i+1)
IDCG@k = DCG@k with documents sorted by decreasing relevance
NDCG@k = DCG@k / IDCG@k
注意点:関連性の低いドキュメントを最適に順位付けした場合、関連性の高いドキュメントを下位に置いた場合より高いスコアになることがあります。Recall@k を併用してください。
k の選択: k の値はクエリの種類によって異なります。事実の検索では k=1~2、統合クエリ(「市場動向を要約する」など)では k=5~10 を使用します。
指標の選択
| クエリの種類 | 主な指標 |
|---|---|
| 単一事実の検索 | MRR |
| 幅広い網羅性が必要 | Recall@k |
| 順位付きの品質が重要 | NDCG@k または Precision@k |
| マルチホップ推論 | 2 ホップ Recall@k |
チャンク分割の評価と最適化
チャンク分割は調整可能なハイパーパラメーターとして扱います。同じリトリーバーを使っていても、チャンク分割だけで指標は変動します。
固定サイズのチャンク分割に対するグリッドサーチ: チャンクサイズとオーバーラップの組み合わせをテストします。設定ごとにコーパスを再インデックス化し、評価データセットで検索指標を測定します。
検索グリッドの例:
| チャンクサイズ | オーバーラップ | Recall@5 | NDCG@5 |
|---|---|---|---|
| 128 トークン | 0 | 0.82 | 0.69 |
| 128 トークン | 64 | 0.88 | 0.75 |
| 256 トークン | 0 | 0.86 | 0.74 |
| 256 トークン | 128 | 0.89 | 0.77 |
| 512 トークン | 0 | 0.80 | 0.72 |
| 512 トークン | 256 | 0.83 | 0.74 |
コンテンツを考慮したチャンク分割: 固定サイズのチャンクで関連情報が分割されてしまう場合:
- ドキュメントの自然な境界(セクション、段落、手順)を使用します。
- チャンクにコンテキストを追加します。埋め込みの前に、各チャンクの先頭にドキュメントのタイトルとセクションの見出しを付加します。
生成品質の評価
検索が機能することを確認したら、取得したコンテキストを LLM がどのように扱うかを、次の 2 つの観点で評価します。
回答の忠実性: 出力は取得したコンテキストを正確に反映していますか? 次の点を確認します。
- ハルシネーション: ソースドキュメントに存在しない情報です。RAG では、LLM 自身の知識に基づく正しい事実であっても、ハルシネーションに該当します。
- 情報の欠落: コンテキストにある関連情報が出力で無視されていることです。
- 誤解釈: コンテキストの情報が不正確に表現されていることです。
回答の関連性: 出力は元のクエリに答えていますか? コンテキストには忠実でも、ユーザーの質問に答えていない場合があります。
エラー分析を使って、パイプラインにおける具体的な問題の現れ方を特定します。どのような情報がハルシネーションとして生成されるのか、どの制約が欠落するのかを明らかにします。
指標のパターンによる失敗の診断
| コンテキストの関連性 | 忠実性 | 回答の関連性 | 診断 |
|---|---|---|---|
| 高 | 高 | 低 | 正しいドキュメントの中で、生成モデルが誤ったセクションに注目した |
| 高 | 低 | -- | 取得したコンテンツのハルシネーションまたは誤解釈 |
| 低 | -- | -- | 検索の問題です。チャンク分割、埋め込み、またはクエリの前処理を修正します |
マルチホップ検索の評価
複数のチャンクから情報を取得する必要があるクエリの場合:
2 ホップ Recall@k: 正解の 2 つのチャンクがどちらも上位 k 件の結果に含まれる 2 ホップクエリの割合です。
TwoHopRecall@k = (1/N) * sum(1 if {Chunk1, Chunk2} ⊆ top_k_results)
失敗を、ホップ 1 の見落とし、ホップ 2 の見落とし、または上位 k 件からの順位落ちに分類して診断します。
アンチパターン
- 検索と生成の評価を分けずに、単一のエンドツーエンドの正確性指標を使用する。
- 最初にトレースを読まず、いきなり指標に進む。
- 合成評価データに過剰適合する。実際のユーザークエリを定期的に使って検証する。
- 類似度指標(ROUGE、BERTScore、コサイン類似度)を主要な生成評価として使用する。エラー分析に基づく二値評価器を使用する。
- コンテキストに根拠があるかを確認せずに、生成を評価する。