RAG入門:AIに知識を与える技術
RAG精度改善(2):高度な検索手法(HyDE, Reranking)
「精度が出ない」のままでは、手が打てない
検索まわりの改善手法には、聞こえのいい名前がたくさん並んでいます。HyDE、RAG-Fusion、リランキング、マルチクエリ、親子チャンク。どれも実在する有効な技法です。
ただ、名前を覚えても順番は決まりません。精度が出ないという状態には、性質のまったく違う 2 つの原因が混ざっているからです。正解の書かれたチャンクが、そもそも検索に引っかかっていないのか。引っかかってはいるが、使われていないのか。
この 2 つは打ち手が正反対です。前者に効く手法は後者にはまったく効きませんし、その逆も同じです。切り分けないまま手法を足していくと、効かない改修に時間を溶かしたうえ、何が効いたのかも分からなくなります。
正解のチャンクは、そもそも来ているか
切り分けの方法は単純です。LLM に渡す直前のチャンクを、そのままログに出してください。
うまく答えられなかった質問を 20 件ほど選び、1 件ずつ、渡されたチャンクの中に答えが書いてあるかを目で確かめます。集計するのは 1 つだけ、答えを含むチャンクが渡っていたかどうかです。20 件のうち何件で来ていたか、を数えます。
答えが渡っていなかったなら、検索の問題です。答えは渡っていたのに回答が外れていたなら、検索は仕事を終えています。直すのはプロンプトの側であって、検索の側ではありません。ここで検索手法を足しても、渡るチャンクが少し入れ替わるだけで、回答は変わりません。
20 件を数えるだけで、次に触る場所が決まります。半日もかからない作業です。この工程を飛ばして手法を選ぶことだけは避けてください。
来ていないのか、順位が低いだけなのか
検索の問題だと分かったら、もう一段だけ切り分けます。取得する件数を 5 件から 30 件に増やして、同じ 20 件を流し直してください。
30 件に増やしたら正解が入ってきたなら、検索は正解を見つけてはいるのに、上位に押し上げられていないということです。ここで効くのがリランキングです。まず広めに 30 件から 50 件を取り、そのうえで、質問と文書をひとまとめにして関連度を測り直す専用モデルにかけ、上位 3 件から 5 件に絞ります。
最初の検索は速い代わりに大雑把、絞り込みは重い代わりに正確、という役割分担です。全件に重いモデルをかけるのは無理でも、50 件になら十分かけられます。なお、件数を増やしただけで終わらせてはいけません。LLM に渡る雑音が増えて、かえって回答が濁ります。必ず絞り直しとセットにしてください。
30 件に増やしても入ってこないなら、質問と資料の形が違いすぎています。「退職金の手続きは」という 10 文字の質問と、規程の本文とでは、含まれている言葉の量が違いすぎて近くに着地しません。
ここで効くのが HyDE です。まず LLM に、答えらしき文章を想像で書かせます。その仮の答えは、内容が間違っていてもかまいません。文章の長さと使われる語彙が資料に近づくので、それを使って検索するとヒット率が上がります。答えで答えを探しにいく、という発想です。
順番としては、先にリランキングを試してください。実装が軽く、効きめもはっきり出ます。それでも届かないときに HyDE を足す。LLM を 1 回余分に呼ぶぶん、遅くなって高くなるので、必要だと分かってから入れる形が現実的です。
復習ミニクイズ
RAGの検索精度を最大化するためにHyDEとRerankingを組み合わせて使用する場合、その処理プロセスとして最も適切なものはどれですか?