Tech カテゴリのイメージ

RAGの検索をどう評価する?正解資料を見つけたかと、回答が正しいかを分けて測る

RAGの回答が間違ったとき、LLMに渡した資料が間違っていたのか、正しい資料を渡したのに読み違えたのか。この二つを分けなければ、検索器の調整とプロンプトの調整のどちらが必要か分からない。最初に調べるべきなのは、答えに必要な根拠が検索結果の中に入ったかどうかだ。

例えば、架空の規程について「緊急時の申請期限は?」と尋ねる。検索上位に「原則3日前」の段落だけが入り、「緊急時は当日連絡」の例外が入らなければ、回答生成の前に材料が欠けている。この例は評価方法を説明するためのものであり、実在する規程や実測値ではない。

正解は「回答文」だけでなく、必要な根拠の位置にも付ける

検索評価のために、代表的な質問と、その質問へ答えるために必要な文書IDや断片IDを対にする。文書を改訂する運用なら、版や更新日時も正解側へ含める。古い版の同じ見出しを拾っても正解とはしない。複数の断片を合わせて初めて答えられる質問では、どの断片が必要なのかを明示する。

実際の質問を使う場合、個人情報や閲覧権限の異なる文書を評価データへ不用意に混ぜない。また「答えが資料に存在しない」という質問も入れる。検索器が何かを返したことと、その資料が回答の根拠になることは別だ。

質問の言い方も一種類だけでは足りない。正式な用語で尋ねる人、略称や製品番号で尋ねる人、資料にはない言い換えで尋ねる人がいる。BEIRの論文は異なる領域と検索課題をまたぐ評価の重要性を示したが、公開ベンチマークでの順位をそのまま自分の文書集合の性能とみなすことはできない。

Hit@kは「少なくとも一つ見つけたか」

上位 kk 件に正解断片が一つでも含まれる質問を「ヒット」とし、その割合をHit@kとする。例えば3問中2問で上位3件に正解があれば、Hit@3は 2/32/3 だ。ただし、必要な根拠が二つある質問では、一つだけを見つけてもヒットと数えてしまう。そこで、必要な根拠をいくつ拾ったかというRecall@kも見る。TRECの評価資料は、Recallを関連文書全体のうち検索された関連文書の割合として定義している。

さらに、正解が3位にある場合と1位にある場合は同じHit@3でも、後段で使いやすさが違う。最初の正解の順位を rr として 1/r1/r を計算し、質問ごとに平均したものがMRR(Mean Reciprocal Rank)だ。正解が評価範囲にない質問の値は0とする。LlamaIndexの検索評価資料も、正解文書IDを用いたHit RateとMRRの評価を紹介している。

次は検索器なしで順位表だけを測る標準Pythonの例だ。各質問に正解断片が一つだけある、説明用の最小例としている。

examples = [
("rule-new", ["rule-old", "rule-new", "faq"]),
("manual", ["manual", "notice", "faq"]),
("exception", ["notice", "faq", "rule-old"]),
]
k = 3
reciprocal_ranks = []
for correct, ranked in examples:
top_k = ranked[:k]
rank = top_k.index(correct) + 1 if correct in top_k else None
reciprocal_ranks.append(1 / rank if rank else 0)
hit_at_k = sum(score > 0 for score in reciprocal_ranks) / len(examples)
mrr_at_k = sum(reciprocal_ranks) / len(examples)
print(f"Hit@{k}: {hit_at_k:.3f}")
print(f"MRR@{k}: {mrr_at_k:.3f}")

出力は Hit@3: 0.667 と MRR@3: 0.500 になる。1問目は2位で 1/21/2、2問目は1位で 11、3問目は見つからず 00。合計 1.51.5 を3問で割った値がMRR@3だ。これは順位表の計算確認であり、検索モデルの性能を測定した結果ではない。

検索スコアと、回答の品質は別の数字

Hit@kが高くても、取得した断片が例外条件を欠いたままなら答えは不完全になりうる。検索された正解断片が実際に生成器へ渡されたか、渡された資料から作った回答が条件を守っているかを別に確認する。逆に、検索に失敗した質問にLLMがたまたま正答しても、そのRAGの検索が成功した証拠にはならない。

比較するときは質問集合、文書の版、分割方法、閲覧権限、検索件数 kk、検索から生成へ渡す件数を固定する。検索器だけ変えてHit@kを比べたあと、同じ質問で回答の根拠と正確さを確認すれば、改善がどの段階で起きたかを追える。kk を増やしてヒットを稼ぐだけでは、不要な断片が増え、文脈の上限や回答の読み違いにも影響する。

まず十数問でも、根拠のある質問と答えのない質問を分けて記録する。正解資料を見つけられないのか、見つけた後で答えを誤るのか。その区別が、RAGを修正する最短の手掛かりになる。

参照資料

生成AI・機械学習講座の一覧へ