Agentic RAGとは、AIエージェントが検索戦略を自律的に判断・実行するRAGの進化形だ。固定パイプラインで「1回検索して生成」する従来RAGと異なり、クエリの複雑さに応じて検索ソースの選択・クエリ分解・追加検索を動的に行う。本記事では仕組み・アーキテクチャ・実装パターンをコード例付きで解説する。

Agentic RAGとは何か

従来のRAGは「クエリ受信 → ベクトル検索 → コンテキスト付き生成」という固定パイプラインだ。このアプローチは単純な質問には十分機能するが、「複数のデータソースにまたがる複雑な質問」「検索結果が不十分な場合の追加検索」「クエリを複数のサブクエリに分解する必要がある場合」では限界が生じる。

Agentic RAGは、この限界をAIエージェントのアーキテクチャで突破する。エージェントが「どのソースを検索するか」「検索結果は十分か」「追加検索が必要か」を自律的に判断し、必要に応じて複数ラウンドの検索・推論を繰り返す。

【従来RAG vs Agentic RAGのフロー比較】

【従来RAG】(固定パイプライン)
  ユーザークエリ
       |
  ベクトル検索 (1回)
       |
  コンテキスト付き生成
       |
  回答 ← 検索が不十分でも1回で終了

【Agentic RAG】(動的判断)
  ユーザークエリ
       |
  [ルーティングエージェント]
  「このクエリにはどのソースが最適?」
  「複数サブクエリに分解すべき?」
       |
  +---------+----------+
  |         |          |
  DB-A検索  DB-B検索  Web検索
       |
  [評価エージェント]
  「回答に十分な情報が揃ったか?」
  No → 追加検索 / Yes → 生成へ
       |
  [合成エージェント]
  複数ソースを統合して回答生成
       |
  高精度な回答

Agentic RAGのアーキテクチャ

Agentic RAGは複数の専門エージェントが連携して動作する。主要な構成要素は以下の通りだ。

エージェント 役割 判断内容 ツール 実装例
ルーティングエージェント クエリの分析・振り分け どのソース/ツールを使うか メタデータ分析、クエリ分類 LLM + few-shot分類
検索エージェント 各ソースへの検索実行 検索クエリの生成・最適化 ベクトルDB、全文検索、Web検索 Tool calling + 各DB API
評価エージェント 検索結果の十分性評価 追加検索が必要か判定 LLMによるグレーディング Self-RAG, CRAG
合成エージェント 複数ソースの統合・生成 どの情報を優先するか LLM生成、引用付与 Chain-of-thought生成
from langgraph.graph import StateGraph, END
from langchain_core.messages import HumanMessage
from typing import TypedDict, List

class AgentState(TypedDict):
    query: str
    search_results: List[dict]
    is_sufficient: bool
    answer: str
    iteration: int

def route_query(state: AgentState) -> AgentState:
    """クエリを分析して検索戦略を決定"""
    # 実際にはLLMでクエリを分類・分解
    print(f"クエリを分析中: {state['query']}")
    return state

def search_documents(state: AgentState) -> AgentState:
    """ドキュメントを検索"""
    # ベクトルDB等で検索
    results = vector_db.search(state['query'], k=5)
    state['search_results'] = results
    state['iteration'] = state.get('iteration', 0) + 1
    return state

def evaluate_results(state: AgentState) -> AgentState:
    """検索結果が十分かを評価"""
    # LLMで関連性・十分性を評価
    is_ok = len(state['search_results']) >= 3 and state['iteration'] < 3
    state['is_sufficient'] = is_ok
    return state

def generate_answer(state: AgentState) -> AgentState:
    """最終回答を生成"""
    context = "
".join([r['content'] for r in state['search_results']])
    state['answer'] = llm.generate(f"Context: {context}
Question: {state['query']}")
    return state

# グラフ構築
workflow = StateGraph(AgentState)
workflow.add_node("route", route_query)
workflow.add_node("search", search_documents)
workflow.add_node("evaluate", evaluate_results)
workflow.add_node("generate", generate_answer)
workflow.add_conditional_edges("evaluate",
    lambda s: "generate" if s["is_sufficient"] else "search",
    {"generate": "generate", "search": "search"}
)
workflow.set_entry_point("route")
workflow.add_edge("route", "search")
workflow.add_edge("search", "evaluate")
workflow.add_edge("generate", END)

Agentic RAGが解決する問題

従来RAGが苦手としていた問題の多くに、Agentic RAGは有効な解決策を提供する。

問題 従来RAGの対応 Agentic RAGの対応 改善効果
複数ソースにまたがるクエリ 1つのDBしか検索できない ルーティングで複数DBを並列検索 回答カバレッジが大幅向上
検索結果が不十分な場合 不十分でも1回で終了 評価エージェントが追加検索を指示 幻覚 (ハルシネーション) を大幅削減
複雑な質問の分解 クエリをそのまま検索 サブクエリに分解して各々検索 複雑な質問の正答率が向上
最新情報の取得 ベクトルDB内の情報に限定 Webサーチツールと連携可能 リアルタイム情報の組み込みが可能
検索戦略の最適化 固定のチャンキング・検索手法 クエリに応じて検索手法を動的変更 クエリタイプに最適化された精度向上

実装パターンと事例

Agentic RAGの実装パターンは、複雑さとユースケースに応じて3種類に分類できる。

  • シングルエージェント型: 1つのエージェントが検索・評価・生成を全て担う。最もシンプルで実装コストが低い。小〜中規模のRAGシステムに適している。
  • マルチエージェント型: 検索・評価・合成エージェントが並列に動作。各エージェントが専門化することで精度が向上。大規模な情報ベースに有効。
  • 階層型: オーケストレーターエージェントが複数のサブエージェントを指揮。複数の知識領域やツールを横断する複雑なシステムに適している。
# ルーティングエージェントの実装例
from langchain_anthropic import ChatAnthropic

llm = ChatAnthropic(model="claude-3-5-haiku-20241022")

def routing_agent(query: str, available_sources: list) -> dict:
    """クエリを分析して最適な検索ソースと戦略を決定"""
    system_prompt = f"""あなたはRAGシステムのルーティングエージェントです。
利用可能なデータソース: {available_sources}
クエリを分析し、最適な検索戦略をJSONで返してください。"""
    
    response = llm.invoke([
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": f"クエリ: {query}"}
    ])
    
    # LLMの出力をパース (実際はJSON解析)
    return {
        "sources": ["product_db", "faq_db"],
        "sub_queries": [query],
        "search_mode": "hybrid"
    }

Agentic RAGの課題と注意点

Agentic RAGは強力だが、全てのケースに最適というわけではない。導入前に以下の課題を認識しておく必要がある。

  • レイテンシの増大: 複数のエージェント呼び出しと反復検索により、従来RAGより応答時間が2〜5倍増加することがある。リアルタイム性が重要な用途では注意が必要。
  • コストの増加: LLM呼び出し回数が増えるため、APIコストが増大する。上限イテレーション数の設定など、コスト制御の設計が必要。
  • デバッグの困難さ: 動的なフローにより、問題の原因特定が複雑になる。各エージェントのログを詳細に記録する仕組みが不可欠。
  • 安全性の確保: エージェントが自律的に外部ツールを呼び出すため、アクセス権限の設計とサンドボックス化が重要。

まず従来のRAGを構築し、実運用で不十分な点 (精度・カバレッジ) が明確になってからAgentic化を検討する段階的アプローチを推奨する。

まとめ――Agentic RAGは「RAGの次の進化形」

  • Agentic RAGは固定パイプラインを動的エージェント判断に置き換えたRAGの進化形
  • ルーティング・検索・評価・合成の4エージェントが連携して高精度を実現する
  • 複数ソース・複雑クエリ・不十分検索のリトライという従来RAGの弱点を解消する
  • コスト・レイテンシ増に注意し、まず従来RAGを構築してから段階的にAgentic化する

よくある質問

Q. Agentic RAGとは何ですか?

AIエージェントが検索戦略を自律的に判断・実行するRAGの進化形です。従来の固定パイプラインと異なり、クエリの複雑さに応じて検索ソースの選択、クエリの分解、検索結果の十分性判定を動的に行います。

Q. Agentic RAGと従来のRAGの違いは?

従来のRAGは「検索→生成」の固定フローですが、Agentic RAGはエージェントが「どのソースを検索するか」「検索結果は十分か」「追加検索が必要か」を自律的に判断します。複雑な質問や複数ソースにまたがるクエリで真価を発揮します。

Q. Agentic RAGの導入は難しいですか?

従来のRAGより実装が複雑になります。LangGraphやLlamaIndex等のフレームワークを活用すれば比較的効率的に構築できますが、エージェントの判断ロジックの設計、コスト管理、安全性の確保に追加の工数が必要です。まず従来RAGを構築し、必要に応じてAgentic化する段階的アプローチを推奨します。