46.6kデモを予約するログイン無料で始める

MilvusとLlamaIndexによるRAG用AIエージェントの構築

Mar 11, 20241 min read

2023年、大規模言語モデル(LLM)の人気が大爆発し、その結果としてLLMアプリケーションが登場した。最前線に登場した2つの最も人気のあるタイプのLLMアプリケーションは、検索拡張世代(RAG)とAIエージェントである。RAGはMilvusのようなベクトルデータベースを使って文脈データを注入することである。AIエージェントは、LLMを使って他のツールを使うことです。ノートブックはGitHubにあります](https://github.com/ytang07/ai_agents_cookbooks)。

OpenAIに導入は必要ない。OpenAIのサービスにアクセスするには、openaiのapiキーを追加する必要があります。特に、エンベッディングやChatGPTのような機能には必要です。

この記事では、この2つを組み合わせます。この記事では、この2つを組み合わせます:

  • 技術スタック:MilvusとLlamaIndex

    • Milvus Lite

    • Docker Compose上でのMilvus

    • ラマインデックス

  • RAG用AIエージェントの構築

    • Milvusを紡ぐ

    • LlamaIndex経由でMilvusにデータをロードする

    • AIエージェント用クエリーエンジンツールの作成

    • RAG用AIエージェントの作成

  • MilvusとLlamaIndexを使ったRAG用AIエージェントの構築のまとめ

RAG用MilvusとLlamaIndexの紹介

MilvusとLlamaIndexは、RAG(Retrieval-Augmented Generation)システムを構築するために併用できる2つの強力なツールである。Milvusはベクトルデータベースで、大量のデータの効率的な保存とクエリを可能にし、LlamaIndexはMilvusや他のベクトルデータベースと対話するためのシンプルで柔軟な方法を提供するライブラリです。これら2つのツールを組み合わせることで、開発者は、与えられたプロンプトに基づいてテキストを効率的に検索・生成できるRAGシステムを構築することができる。

Milvusは大規模なベクトルデータの扱いに優れており、高性能な類似検索を必要とするアプリケーションに最適である。一方、LlamaIndexはこのデータのインデックス作成とクエリのプロセスを簡素化し、開発者にシームレスなインターフェースを提供します。これらは共にRAGシステムの強固な基盤を形成し、関連情報の検索と文脈に即した正確な応答の生成を可能にします。

技術スタックMilvus Vector StoreとLlamaIndex

RAGを行うこのAIエージェントには、実際には3つのテクノロジーを使用しています:Milvus、LlamaIndex、そしてOpenAIです。OpenAIは紹介するまでもないでしょう。OctoAI](https://zilliz.com/blog/building-rag-without-openai-mixtral-milvus-octoai)やHuggingFace LLMをドロップインとして使うこともできます。後日、これらのいずれかを使用したバージョンを更新するかもしれません。

Milvusを使う方法はたくさんあります。Jupyterノートブックで直接起動できるMilvus Liteや、Docker経由のMilvusがあります。Milvus LiteはPyPiからpip install milvusでインストールできます。milvusベクトルストアは、データをロードし、クエリーベクトルに基づいた検索機能を可能にする。そして、ノートブックで直接スピンアップ、使用、スピンダウンすることができる。

Milvusは分散システムなので、当然Milvus with Docker Composeをスピンアップするのが理にかなっています。docker compose ファイルはこのページと Milvus GitHub にあります。Docker ComposeでMilvusをスピンアップすると、3つのコンテナが表示され、デフォルトではポート19530を通じてMilvusに接続されます。

LlamaIndex

LlamaIndexは、LLMアプリを構築するための最も人気のあるフレームワークの1つです。LlamaIndex、LangChain、Haystack](https://medium.com/dev-genius/langchain-vs-llamaindex-vs-haystack-0d12d25b189e)の3つの人気プロジェクトのうちの1つです。LlamaIndexの主な焦点は、検索タスクに特化したフレームワークを提供することである。さらに、AIエージェントを構築するためのツールも提供している。

RAGとAIエージェントを構築する方法はたくさんある。この例は、私のオリジナルのRAG AIエージェントのチュートリアルに基づいています。この2つの例の主な違いは、この例ではMilvusをPersistent vector store with LlamaIndexとして使用していることです。LlamaIndexのインポートは変わりません。LlamaIndexのコア部分から得られる3つのインポートは、ディレクトリリーダー、ベクターストアインデックス、ストレージコンテキストです。

また、クエリエンジニアツールとツールメタデータオブジェクトを取得し、RAG用のツールを作成して記述します。前バージョンと比較すると、LlamaIndex用のMilvusVectorStoreオブジェクトのインポートが追加されています。これら全てを取得するには、pip install -U llama-index llama-index-vector-stores-milvus pymilvus llama-index-llms-openai llama-index-readers-file を実行する必要がある。

from llama_index.core import (
   SimpleDirectoryReader、
   VectorStoreIndex、
   ストレージコンテキスト
)
from llama_index.core.tools import QueryEngineTool, ToolMetadata です。

from llama_index.vector_stores.milvus import MilvusVectorStore

ベクターデータベースのバックエンドでRAGを行う上で重要なステップは、ベクターデータベースをスピンアップすることです。Milvusは市場で唯一の分散型ベクターデータベースで、2つの方法でスピンアップすることができます。まず、 default_server を直接インポートして start() する。二つ目は、Docker Composeを使って起動する方法だ。両方のコードを以下に示す。

from milvus import default_server
default_server.start()

または、ターミナルで docker-compose.yml ファイルと同じディレクトリで docker compose up -d を実行してください。

データを保持するMilvusインスタンスの違いはコレクション名だけです。運用中のデータの整合性を確保するために整合性レベルを設定することが重要であり、デフォルトの設定は'Strong'である。

LlamaIndexを介したMilvusへの文書データのロード

RAGアプリを構築する最初のステップは、データをベクターデータベースにロードすることです。このチュートリアルでは、LlamaIndexを使ってこれを行います。シンプルなディレクトリリーダーを使って入力ファイルを読み込みます。このケースでは、LyftとUberの財務ドキュメントを見ています。コレクション作成のプロセスでは、データが構造化されインデックスが付けられたデータベースをセットアップし、効果的なデータ管理と検索を保証します。

# データをロードする
lyft_docs = SimpleDirectoryReader(
   input_files=["./data/10k/lyft_2021.pdf"]
).load_data()
uber_docs = SimpleDirectoryReader(
   input_files=["./data/10k/uber_2021.pdf"]
).load_data()

データがロードされたら、それを保持するためにLlamaIndexにMilvusVectorStoreオブジェクトを作成する必要があります。この例では埋め込みモデルとLLMの両方にOpenAIを使っているので、1536次元を渡す。データを保持するMilvusインスタンスの違いはコレクション名だけです。必要であれば、同じ名前で既存のコレクションを上書きすることも可能である。

Docker Compose経由のMilvusではなくMilvus Liteを使用する場合は、正しいポートに接続するためにホストとポートも渡す必要があります。listen_port`オプションでデフォルトのサーバからポートを取得する必要があります。

# インデックスの作成
vector_store_lyft = MilvusVectorStore(dim=1536, collection_name="lyft", overwrite=True)
vector_store_uber = MilvusVectorStore(dim=1536, collection_name="uber", overwrite=True)

# milvusライトユーザー用
もし milvuslite:
   vector_store_lyft = MilvusVectorStore(host="localhost", port=default_server.listen_port, dim=1536, collection_name="lyft", overwrite=True)
   vector_store_uber = MilvusVectorStore(host="localhost", port=default_server.listen_port, dim=1536, collection_name="uber", overwrite=True)

単にデータをロードするだけでなく、データを渡せるようにしなければならない。LlamaIndex は StorageContext オブジェクトを提供することで、この抽象化を処理している。LyftとUberの両方がデータをやり取りできるように、ベクターストアをストレージコンテキストに渡します。そして、それらのベクターストアにインデックスを作成する。このブロックの最後の2行は、これらのベクターストアをローカルディスクに永続化し、次回ストレージから取り出せるようにする。

storage_context_lyft = StorageContext.from_defaults(vector_store=vector_store_lyft)
storage_context_uber = StorageContext.from_defaults(vector_store=vector_store_uber)
lyft_index = VectorStoreIndex.from_documents(lyft_docs, storage_context=storage_context_lyft)
uber_index = VectorStoreIndex.from_documents(uber_docs, storage_context=storage_context_uber)

# インデックスを保持する
lyft_index.storage_context.persist(persist_dir="./storage/lyft")
uber_index.storage_context.persist(persist_dir="./storage/uber")

AIエージェント用のクエリーエンジンツールの作成

AIエージェントがRAGを行うためには、ベクトルデータベースに対してクエリを実行するためのツールを使用できる必要がある。この次のブロックでは、作成したベクトルインデックスを、最も類似した結果のトップ3を取得するクエリーエンジンに変える。

lyft_engine = lyft_index.as_query_engine(similarity_top_k=3)
uber_engine = uber_index.as_query_engine(similarity_top_k=3)

次に、クエリーエンジンをツールに変える。LlamaIndexのReActエージェント(次のセクションでインポートする)は、ツールのリストを入力として受け取る。そこで、このセクションでは、ツールのリストを作成する。作成するツールは2つだけで、どちらもほぼ同じ構造である。クエリーエンジンツールは、クエリーエンジンとメタデータを必要とする。メタデータは、ツールに名前を付け、LLMにツールの機能と使用方法を伝えるために使用される。

query_engine_tools = [ クエリーエンジンツール
   QueryEngineTools(
       query_engine=lyft_engine、
       metadata=ToolMetadata(
           name="lyft_10k"、
           description=(
               "2021年のLyftの財務に関する情報を提供する。"
               "ツールの入力として、詳細なプレーンテキストの質問を使用してください。"
           ),
       ),
   ),
   クエリーエンジンツール(
       query_engine=uber_engine、
       metadata=ToolMetadata(
           name="uber_10k"、
           description=(
               "2021年のUberの財務に関する情報を提供する。"
               "ツールの入力として詳細なプレーンテキストの質問を使用してください。"
           ),
       ),
   ),
]

最後のピースであるエージェントのピースを組み合わせるための準備はすべて整った。ここでは、LlamaIndexからReActエージェントツールとOpenAIをインポートします。LLMはGPT-3.5と定義しますが、実際にはどのLLMを使ってもかまいません。エージェントには、先ほどのツールのリストとLLM、そしてこの例では "verbose "を渡して、エージェントの "考え "を見る。

from llama_index.core.agent import ReActAgent
from llama_index.llms.openai import OpenAI
llm = OpenAI(model="gpt-3.5-turbo-0613")

agent = ReActAgent.from_tools(
   query_engine_tools、
   llm=llm、
   verbose=True
)

response = agent.chat("2021年のLyftの収益の伸びは?")
print(str(response))

2021年のLyftの収益成長率を尋ねられたとき、我々は以下のような応答を期待する。

Milvus とLlamaIndexによるデータの照会と取得

MilvusとLlamaIndexを使ってデータを検索するには、Milvusコレクションを作成し、LlamaIndexを使ってインデックスを作成する必要があります。Milvusコレクションはベクターの集合を格納するコンテナであり、インデックスはベクターの効率的なクエリを可能にするデータ構造です。コレクションを作成し、インデックスを作成したら、LlamaIndexを使用してコレクションを照会し、関連するベクトルを取得することができます。

LlamaIndexを使用してMilvusコレクションを照会するには、照会ベクトルと類似度メトリックを提供する必要があります。クエリーベクトルはデータを取得したいプロンプトまたはクエリーを表し、類似度メトリックは2つのベクトルがどれだけ似ているかを測定します。LlamaIndex は類似度メトリクスを使用してコレクション内のベクトルをランク付けし、 トップランクのベクトルを返します。

例えば、あるドキュメントに類似したドキュメントを取得したい場合、そのドキュメントを表すクエリベクトルを作成し、LlamaIndex を使ってコレクションにクエリをかけます。LlamaIndexは、クエリ・ドキュメントに類似するドキュメントのリストを、その類似度スコアとともに返します。このプロセスにより、最も関連性の高い文書が確実に取得され、さらなる分析やテキスト生成のための強固な基盤となります。

AIエージェントの構築と統合

AIエージェントをMilvusとLlamaIndexで構築・統合するには、エージェントがテキスト生成に使用するデータを格納する知識ベースを作成する必要があります。知識ベースはMilvusコレクションとすることができ、それぞれがテキストの一部を表すベクトルの集合を格納します。

AIエージェントをMilvusおよびLlamaIndexと統合するには、LlamaIndexを使って知識ベースに問い合わせ、関連するベクトルを取得する必要があります。AIエージェントはこれらのベクトルを使って、与えられたプロンプトに基づいてテキストを生成することができます。

例えば、特定のトピックに関する質問に答えられるAIエージェントを作りたい場合、そのトピックに関連する文書を表すベクターのセットを格納する知識ベースを作成することができます。エージェントが質問を受けると、LlamaIndex を使って知識ベースに問い合わせ、関連するベクトルを取得することができます。エージェントはこれらのベクトルを使って、質問に対する答えを生成することができます。

全体として、MilvusとLlamaIndexは、RAGシステムとAIエージェントを構築するための強力なツールの組み合わせを提供する。これらのツールを併用することで、開発者は、与えられたプロンプトに基づいて効率的にテキストを検索・生成できるシステムを構築することができ、カスタマーサポートからコンテンツ生成まで、様々なドメインでのアプリケーションに非常に有用である。

MilvusとLlamaIndexによる検索拡張生成AIエージェントの構築のまとめ

本稿では、Milvus、LlamaIndex、GPT 3.5を用いてRAG用のAIエージェントを構築した。RAGはLLMベースのアプリ・アーキテクチャで、ベクター・データベースを使用して、データをコンテキストとしてLLMに注入します。AIエージェントは、他のツールを使用できるLLMベースのアプリケーションです。AIエージェントでRAGを行うために、AIエージェントにベクターデータベースのクエリに必要なツールを提供します。

このチュートリアルでは、LyftとUberのサンプルデータを使って、このアーキテクチャを構築する方法を紹介します。まず、RAGができるようにMilvusにデータを注入しました。そして、Milvusコレクションをクエリーエンジンにし、クエリーエンジンを使えるツールにした。最後に、これらのツールをAIエージェントに渡し、ドキュメントに対してRAGを実行するために使用しました。

Updated on Jul 09, 2026