RAG-Fusion(ラグフュージョン)
ユーザークエリを複数のサブクエリに変換し並列検索した後、RRF(Reciprocal Rank Fusion)で結果を統合するRAG手法。単一クエリの検索盲点を補完し、より網羅的な文書召喚を実現する。
RAG-Fusion とは
RAG-Fusionは、2023年にZackary Rackauckasがブログ記事「Forget RAG, the Future is RAG-Fusion」で提案し、その後LangChainに実装されたRAG改善手法である。単一のユーザークエリを複数の関連クエリに展開し、それぞれを並列に検索した後、Reciprocal Rank Fusion(RRF)アルゴリズムで検索結果を統合することで、検索の網羅性と精度を向上させる。
従来のRAGの限界
単一クエリによる検索には固有の限界がある:
- 語彙のミスマッチ: ユーザーの言い方と文書の表現が異なると見逃す
- 視点の偏り: 一つの角度からの検索では複合的な情報を見逃す
- 単一クエリの盲点: 関連情報でも検索クエリの表現次第で召喚されない
例: 「PCメモリの選び方」という質問に対して「DDR5 容量 選択基準」「メモリ帯域幅 ゲーム性能」「メモリ互換性 マザーボード」という視点の文書を、単一クエリでは見逃す可能性がある。
RAG-Fusionのフロー
[ユーザークエリ]
↓ LLMによるクエリ展開
[サブクエリ1] [サブクエリ2] [サブクエリ3] ← 並列生成
↓ 各クエリで並列検索
[検索結果1] [検索結果2] [検索結果3]
↓ RRF(Reciprocal Rank Fusion)
[統合スコア付き文書リスト]
↓
[LLM回答生成]
RRF(Reciprocal Rank Fusion)の仕組み
RRFは複数の順位付きリストを統合するアルゴリズムである。各文書のスコアは以下の式で計算される:
RRF_score(d) = Σ (1 / (k + rank_i(d)))
- d: 文書
- k: 定数(通常60)
- rank_i(d): i番目の検索結果リストでの文書dの順位
この式により、複数の検索結果で高順位に現れる文書ほど高スコアになり、単一の検索では低順位だった文書でも複数の検索で一貫して上位なら高評価される。
実装例(LangChainを使用)
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain_openai import ChatOpenAI
# 複数クエリ自動生成リトリーバー
multi_query_retriever = MultiQueryRetriever.from_llm(
retriever=vector_store.as_retriever(search_kwargs={"k": 5}),
llm=ChatOpenAI(model="gpt-4o-mini"),
)
# カスタムRRF実装(概念)
def reciprocal_rank_fusion(results_list: list, k: int = 60) -> list:
doc_scores = {}
for results in results_list:
for rank, doc in enumerate(results, start=1):
doc_id = doc.metadata.get("id", doc.page_content[:50])
if doc_id not in doc_scores:
doc_scores[doc_id] = {"score": 0, "doc": doc}
doc_scores[doc_id]["score"] += 1 / (k + rank)
return sorted(doc_scores.values(), key=lambda x: x["score"], reverse=True)
クエリ展開の品質
RAG-Fusionの効果は、生成されるサブクエリの多様性と品質に依存する。LLMへのプロンプトで「異なる視点から」「異なる専門用語を使って」「異なる質問の角度で」といった指示を加えることで、より多様なサブクエリが生成され、検索の網羅性が向上する。
HyDEとの組み合わせ
RAG-FusionとHyDEを組み合わせる手法も存在する。各サブクエリに対してHyDE(仮想ドキュメント埋め込み)を適用してから検索することで、クエリ多様性と意味空間マッチングの両方のメリットを享受できる。
適用場面
- 複合的な技術調査(複数の観点から情報収集が必要)
- ドメイン専門知識ベースの検索(専門用語のバリエーションが多い)
- 単一クエリで見逃しが多い高精度要求のQ&Aシステム
LangChainのMultiQueryRetrieverとCustom RRFで実装可能であり、既存のRAGシステムへの追加コストが比較的低い改善手法として普及している。