LlamaIndexを組み合わせた典型的なAgentアーキテクチャ
はじめに
現代のAIシステムにおいて、LLM(大規模言語モデル)をベースとしたAgentは強力なツールとなっています。特に外部知識やツールと組み合わせることで、その能力は大幅に拡張されます。本記事では、LlamaIndexという知識ベースインデックス化システムをAgentアーキテクチャに統合する方法について解説します。
典型的なLLM + ツールのAgentアーキテクチャ
典型的なLLMベースのAgentアーキテクチャは、以下の主要コンポーネントで構成されています:
-
対話・リクエストインターフェース:ユーザー(または上位システム)が意図や質問を発信する入り口です。
-
Agent決定モジュール:LLM自体がコンテキストとプロンプトに基づいて思考し、「データベース検索が必要」や「外部APIを使用する必要がある」などの判断を下します。
-
ツールまたは知識ベース:ここでLlamaIndexの「クエリエンジン」を検索ツールとして活用できます。Agentが「資料を調べる必要がある」と判断した場合、LlamaIndexのインデックスを通じて関連テキストを検索し、その結果をLLMに返します。LLMは他のツール(データベースクエリ、Google検索など)を呼び出すこともあります。
-
LLMへのフィードバック:検索結果を取得した後、LLMはそれを次のステップでの思考の文脈として使用し、さらなる検索を行うか、最終回答を直接生成するかを決定します。
-
出力:最後に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との連携
多くの実際のプロジェクトでは、LlamaIndexはLangChainの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