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化する段階的アプローチを推奨します。