LlamaIndexを組み合わせた典型的なAgentアーキテクチャ

2025/03/08に公開

はじめに

現代のAIシステムにおいて、LLM(大規模言語モデル)をベースとしたAgentは強力なツールとなっています。特に外部知識やツールと組み合わせることで、その能力は大幅に拡張されます。本記事では、LlamaIndexという知識ベースインデックス化システムをAgentアーキテクチャに統合する方法について解説します。

典型的なLLM + ツールのAgentアーキテクチャ

典型的なLLMベースのAgentアーキテクチャは、以下の主要コンポーネントで構成されています:

  1. 対話・リクエストインターフェース:ユーザー(または上位システム)が意図や質問を発信する入り口です。

  2. Agent決定モジュール:LLM自体がコンテキストとプロンプトに基づいて思考し、「データベース検索が必要」や「外部APIを使用する必要がある」などの判断を下します。

  3. ツールまたは知識ベース:ここでLlamaIndexの「クエリエンジン」を検索ツールとして活用できます。Agentが「資料を調べる必要がある」と判断した場合、LlamaIndexのインデックスを通じて関連テキストを検索し、その結果をLLMに返します。LLMは他のツール(データベースクエリ、Google検索など)を呼び出すこともあります。

  4. LLMへのフィードバック:検索結果を取得した後、LLMはそれを次のステップでの思考の文脈として使用し、さらなる検索を行うか、最終回答を直接生成するかを決定します。

  5. 出力:最後にAgentはユーザーへの回答を生成(または特定のアクションを実行)します。

つまり、「Agentモード」では、LlamaIndexは「文書検索/QA」というツールインターフェースの役割を果たします。LLMがより多くの知識を必要とするとき、index.query(...)や「クエリエンジン」を呼び出して回答やコンテキストフラグメントを取得します。

LlamaIndexをAgentアーキテクチャに統合する方法

LlamaIndexをAgentアーキテクチャの一部にするための核心は:

  • LLMに「LlamaIndexに問い合わせるというツールを使用して情報を取得できる」ことを知らせるためのプロンプト/テンプレートを設定する。
  • LLMが生成したアクションの中で検索がトリガーされた場合、対応するPython関数query_engine.query(user_question)またはindex.query(...)を呼び出す。
  • 検索結果(テキスト要約、関連段落など)をLLMに返し、「これはLlamaIndexから検索された文書情報です」と促して、LLMがこの情報を統合してさらに思考または回答を続けるようにする。

LangChainとの連携

多くの実際のプロジェクトでは、LlamaIndexLangChainのagent/toolingシステムと組み合わせて使用され、LangChainのAgentがLlamaIndexをツールとして扱えるようにします。LangChainとの連携方法については、以下のようなアプローチがあります:

from langchain.agents import Tool
from langchain.agents import initialize_agent
from llama_index import GPTSimpleVectorIndex

# LlamaIndexのインデックスをツールとして定義
tools = [
    Tool(
        name="LlamaIndex",
        func=lambda q: str(index.query(q)),
        description="LlamaIndexを使用して文書知識ベースに問い合わせる場合に有用"
    )
]

# Agentの初期化
agent = initialize_agent(
    tools, 
    llm, 
    agent="zero-shot-react-description", 
    verbose=True
)

# Agentの実行
agent.run("質問文をここに入れる")

カスタムAgentの実装

LangChainに依存せずに「純粋にLlamaIndexのAPIだけ」を使用してカスタムAgentを作成したい場合は、独自の推論ループを記述することもできます:

from llama_index import GPTSimpleVectorIndex, LLMPredictor
from langchain.llms import OpenAI

def custom_agent(user_query, index):
    # 初期プロンプト
    prompt = f"""
    あなたは知識豊富なアシスタントです。ユーザーの質問に答えるために:
    1. 質問を分析してください
    2. 情報が必要な場合、LlamaIndex検索ツールを使用できます
    3. 得られた情報を統合して回答を生成してください
    
    ユーザーの質問: {user_query}
    """
    
    # LLMを使用して初期思考
    llm = OpenAI(temperature=0)
    initial_thought = llm.predict(prompt)
    
    # LLMが検索を決定したかどうかを確認
    if "LlamaIndex検索を使用する" in initial_thought:
        # 検索の実行
        search_results = index.query(user_query)
        
        # 検索結果をプロンプトに追加
        prompt += f"""
        
        LlamaIndexからの検索結果:
        {search_results}
        
        上記の情報を使用して、質問に対する最終回答を生成してください。
        """
        
        # 最終回答の生成
        final_answer = llm.predict(prompt)
        return final_answer
    else:
        # 検索なしで直接回答
        return initial_thought

# 使用例
index = GPTSimpleVectorIndex.load_from_disk("index.json")
response = custom_agent("私の質問はこちらです", index)
print(response)

まとめ

LlamaIndexをAgentアーキテクチャに統合することで、LLMは大量の文書知識にアクセスでき、より正確で情報に基づいた回答を生成できるようになります。この統合パターンは、特に企業内部の知識ベースや専門文書へのアクセスが必要なアプリケーションにおいて非常に強力です。

LlamaIndexとLLMベースのAgentの組み合わせにより、単なる会話インターフェースを超えて、実際のビジネス課題を解決するための強力なAIソリューションを構築することができます。

Discussion