Adaptive RAG(アダプティブラグ)
クエリの複雑さに応じて検索戦略を動的に切り替えるRAG手法。単純な質問にはLLM直接回答、複雑な質問には単一/反復検索を自動選択してコストと精度のバランスを最適化。
Adaptive RAG とは
Adaptive RAGは、2024年にJeong Soyeongらが論文「Adaptive-RAG: Learning to Adapt Retrieval-Augmented Large Language Models through Question Complexity」で提案したRAGの動的最適化手法である。すべての質問に対して一律に検索を実行する従来のRAGと異なり、クエリの複雑さを事前に評価して検索戦略を動的に切り替える。
問題意識:一律検索の非効率性
従来のRAGシステムは、すべてのクエリに対して同じ検索パイプラインを実行する。しかし実際のユースケースでは質問の複雑さは様々である:
- 単純な事実確認: 「Pythonの発明者は誰?」→ LLMの学習済み知識で十分
- 最新情報の参照: 「GPT-4の最新版は?」→ 1回の検索で解決
- 複合的な推論: 「A社とB社のGPU製品を比較して財務影響を分析して」→ 複数回の反復検索が必要
すべてに同じ処理を適用するのは、単純な質問にとっては過剰コスト、複雑な質問にとっては不十分という問題がある。
Adaptive RAGの3段階戦略
Adaptive RAGはクエリを3つのカテゴリに自動分類する:
Level A: No Retrieval(検索なし)
- LLMの学習データで十分に答えられる質問
- 歴史的事実・基本的な技術概念・一般知識
- 処理: LLMが直接回答(検索コストゼロ)
Level B: Single-Step Retrieval(1回検索)
- 最新情報や特定の事実確認が必要な質問
- 製品仕様・最新ニュース・統計数値
- 処理: 1回の検索→LLM回答生成
Level C: Iterative Retrieval(反復検索)
- 複数の情報源を組み合わせた複合推論が必要
- 比較分析・多段階推論・因果関係の追跡
- 処理: 複数回の検索→中間結果を次の検索に活用→最終回答
分類器の学習方法
Adaptive RAGでは、小型のLM(分類器)が各クエリのLevel(A/B/C)を予測するよう学習される。学習データは、各クエリに対して3つの戦略を実際に実行した結果の品質スコアを比較して自動生成される(最も効率的な戦略がラベルとなる)。
実装例(概念)
class AdaptiveRAG:
def __init__(self, classifier, retriever, llm):
self.classifier = classifier # 小型分類LM
self.retriever = retriever
self.llm = llm
def query(self, question: str) -> str:
# クエリ複雑さを分類
level = self.classifier.predict(question) # A/B/C
if level == "A":
# 検索なし: LLMの知識のみで回答
return self.llm.generate(question)
elif level == "B":
# 1回検索
docs = self.retriever.search(question)
return self.llm.generate(question, context=docs)
else: # C
# 反復検索
context = []
for _ in range(3): # 最大3回
docs = self.retriever.search(question, context)
context.extend(docs)
if self.llm.is_sufficient(question, context):
break
return self.llm.generate(question, context=context)
効果
論文の実験では、MuSiQue・2WikiMultiHopQA・StrategyQA等のベンチマークで:
- 標準RAGより高い精度(特に単純質問での不要検索排除と複雑質問での反復検索)
- 推論コストの削減(不要な検索をスキップ)
LangGraphやLlamaIndexのエージェント的なRAGフローとの親和性が高く、実運用への適用が増加している。