受動的RAGから能動的エージェントへ

従来のRAGは受動的な動作モードです:ユーザーが質問→文書を検索→回答を生成。このモードは単純なQ&Aシナリオでは良好ですが、多段階の推論、文書横断的な統合、動的な意思決定を必要とする複雑な問題に直面すると、受動的RAGでは対応が難しくなります。例えば、ユーザーが「A社とB社のAI分野における特許ポートフォリオを比較してください」と尋ねた場合、受動的RAGはA社またはB社の部分的な情報しか検索できず、自動的に複数回の検索と比較分析を行うことはできません。Agentic RAGはまさにこのような複雑な検索シナリオを解決するために生まれました。

Agentic RAGの核となる考え方は、エージェントの自律的な意思決定能力をRAGシステムに導入することです。エージェントは受動的に単一の検索を実行するのではなく、人間の研究者のように動作します:問題を分析→検索計画を立案→検索を実行→検索結果を評価→追加検索が必要か判断→すべての情報を統合→最終回答を生成。このループは、エージェントがユーザーの質問に答えるのに十分な情報を収集したと判断するまで繰り返すことができます。

Agentic RAGのコアアーキテクチャ

Agentic RAGアーキテクチャは4つのコアコンポーネントで構成されています:プランナー(Planner)はユーザーの質問を分析し、検索戦略を立案します——複雑な質問を複数のサブ質問に分解し、各サブ質問がどのタイプの情報を検索する必要があるかを決定します。レトリーバー(Retriever)は実際の検索操作を実行し、ベクトル検索、キーワード検索、構造化クエリなど複数の検索方法をサポートします。評価器(Evaluator)は検索結果の品質を評価します——情報がユーザーの質問に答えるのに十分か、検索戦略を調整する必要があるか、追加検索が必要か。シンセサイザー(Synthesizer)はすべての検索情報を一貫した回答に統合します。

from openai import OpenAI
import json

client = OpenAI(api_key="your-deepseek-api-key", base_url="https://api.deepseek.com")

class AgenticRAG:
    def __init__(self, vector_db, max_iterations=5):
        self.vector_db = vector_db
        self.max_iterations = max_iterations
        self.search_history = []

    def plan(self, question):
        """プランナー:問題を分析し、検索計画を立案"""
        prompt = f"""あなたは検索戦略立案の専門家です。以下の質問を分析し、検索計画を立案してください。

ユーザーの質問:{question}

検索計画をJSON形式で出力してください:
{{
  "sub_questions": [
    {{"query": "サブ質問1の検索語", "source": "knowledge_base/web/internal_docs"}},
    {{"query": "サブ質問2の検索語", "source": "knowledge_base/web/internal_docs"}}
  ],
  "reasoning": "このように分割した理由"
}}"""
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=[{"role":"user","content":prompt}],
            temperature=0.2
        )
        return json.loads(response.choices[0].message.content)

    def retrieve(self, query, source="knowledge_base"):
        """レトリーバー:単一の検索を実行"""
        # 本番環境では、異なるソースにルーティング
        results = self.vector_db.search(query, top_k=5)
        return [r["content"] for r in results]

    def evaluate(self, question, collected_info):
        """評価器:情報が十分かどうかを判断"""
        prompt = f"""現在収集された情報がユーザーの質問に答えるのに十分かどうかを評価してください。

ユーザーの質問:{question}
収集された情報:
{json.dumps(collected_info, ensure_ascii=False)}

JSON出力:
{{
  "is_sufficient": true/false,
  "missing_info": ["さらに必要な情報"],
  "next_queries": ["推奨される次の検索語"],
  "confidence": 0.0-1.0
}}"""
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=[{"role":"user","content":prompt}],
            temperature=0.1
        )
        return json.loads(response.choices[0].message.content)

    def synthesize(self, question, all_info):
        """シンセサイザー:すべての情報を統合して回答を生成"""
        prompt = f"""以下の情報に基づいて、ユーザーの質問に回答してください。

ユーザーの質問:{question}

収集された情報:
{json.dumps(all_info, ensure_ascii=False, indent=2)}

要件:
1. すべての情報を統合して完全な回答を提供
2. 情報の出所を明記(どの情報がどの検索から得られたか)
3. 情報間に矛盾がある場合は、矛盾を指摘し分析を提供
4. 一部の側面で情報が不足している場合は、その旨を明確に述べる"""
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=[{"role":"user","content":prompt}],
            temperature=0.3
        )
        return response.choices[0].message.content

    def run(self, question):
        print(f"ユーザーの質問:{question}\n")
        plan = self.plan(question)
        print(f"検索計画:{len(plan['sub_questions'])} 個のサブ質問")

        all_info = {}
        for i, sq in enumerate(plan["sub_questions"]):
            results = 
self.retrieve(sq["query"], sq.get("source", "knowledge_base")) all_info[f"检索{i+1}:{sq['query']}"] = results print(f" 子问题{i+1}:检索到 {len(results)} 条结果") for iteration in range(self.max_iterations): evaluation = self.evaluate(question, all_info) print(f"第{iteration+1}轮评估:置信度 {evaluation['confidence']:.2f}") if evaluation["is_sufficient"]: break for next_query in evaluation.get("next_queries", [])[:2]: results = self.retrieve(next_query) all_info[f"补充检索:{next_query}"] = results answer = self.synthesize(question, all_info) return answer # 使用 rag = AgenticRAG(vector_db=my_db, max_iterations=3) answer = rag.run("对比分析AI Agent在金融和医疗行业的应用差异") print(answer)

Agentic RAGの高度な戦略

マルチソース統合: エージェントは内部ナレッジベースの検索だけでなく、必要に応じて外部APIを呼び出すことができます。ウェブ検索、データベース照会、専門APIの呼び出しなどです。プランナーは問題の種類に基づいて検索ソースをインテリジェントに選択します。ツール呼び出し: エージェントは計算機を呼び出して数値計算を行ったり、翻訳APIを呼び出して多言語ドキュメントを処理したり、コードインタープリタを呼び出してデータ分析を実行したりできます。これにより、Agentic RAGの能力は従来のRAGをはるかに超えます。自己修正: シンセサイザーが異なるソースからの情報の矛盾を検出した場合、再検索をトリガーするか、人間の介入を要求します。誤った可能性のある答えを盲目的に出力するのではなく。記憶と学習: エージェントは各検索の効果を記録し、検索戦略を徐々に最適化します。どの検索語が効果的か、どの情報源が信頼できるか、といった経験が蓄積されます。

パフォーマンスの考慮事項とコスト管理

Agentic RAGの能力向上は、コストとレイテンシの増加を伴います。各plan→retrieve→evaluateループは追加のLLM呼び出しを発生させます。実際の展開では、以下の点に注意してください:最大反復回数を設定する(推奨3〜5回)。単純な質問には高速パスを使用する(質問タイプが明確で、履歴データが単一検索で十分であることを示している場合は、エージェントループをスキップ)。一般的な検索計画と結果をキャッシュする。各エージェント実行のトークン消費量とレイテンシを監視する。コストに敏感なアプリケーションでは、まず質問の複雑さを判断します。単純な質問は従来のRAGの高速チャネルを通過し、複雑な質問のみエージェントモードを起動します。

Agentic RAGの未来

Agentic RAGはRAGシステムの進化の方向性を表しています。単純な検索拡張から、自律的な推論能力を持つインテリジェントな検索エージェントへ。モデルの推論能力の向上(例:DeepSeek-R1)とツールエコシステムの成熟に伴い、Agentic RAGはますます実用的になるでしょう。将来的には、Agentic RAGはより複雑な能力を進化させる可能性があります:ナレッジベースの情報ギャップを自動的に発見し、補充を提案する、ユーザーの検索好みを積極的に学習する、さらには複数のRAGシステムを横断したフェデレーション検索。Agentic RAGを習得することは、次世代のインテリジェント検索システムのコア能力を習得することを意味します。

Agentic RAGと従来のRAGのパフォーマンス比較

Agentic RAGは能力が高い一方で、コストも高くなります。以下の表は、典型的なシナリオでの両者のパフォーマンスを比較しています。100の複雑な質問を含むテストセットでは、従来のRAGの回答精度は62%、平均トークン消費量は1200/回、平均レイテンシは1.2秒でした。Agentic RAG(3回の反復)の回答精度は84%、平均トークン消費量は4800/回、平均レイテンシは3.8秒でした。ご覧のとおり、Agentic RAGは約4倍のコストで22パーセントポイントの精度向上を実現しています。このトレードオフが価値があるかどうかは、具体的なシナリオによって異なります。カスタマーサービス(精度がユーザー満足度に直接影響する)では、Agentic RAGの追加コストは価値があります。コンテンツレコメンデーション(ユーザーが時折の不正確さを許容する)では、従来のRAGのコストパフォーマンスが優れています。

アーキテクチャ進化の道筋

従来のRAGからAgentic RAGへの移行を検討している場合は、段階的な進化戦略をお勧めします。まず従来のRAGで単純なクエリの80%をカバーし、精度が低いケース(ユーザーのダウンボートデータで特定)にはAgentic RAGを有効にして二次処理を行います。これにより、Agentic RAGの能力の恩恵を受けながら、全体的なコストを制御できます。Agentic RAGの推論コストが徐々に低下するにつれて(モデルが高速化・低価格化)、Agentic RAGの適用範囲を徐々に拡大できます。2027年までに、Agentic RAGがRAGシステムの主流になると予想されます。

このスキルチェーンを自分で編成してみませんか?

スキルチェーンで開く →