FiftyOne、LlamaIndex、Milvusでより優れたマルチモーダルRAGパイプラインを構築する

#はじめに
先日のZilliz主催のUnstructured Data Meetupでは、Voxel51の機械学習エンジニア兼開発者エバンジェリストであるJacob Marksが、FiftyOne、LlamaIndex、Milvusを使った堅牢なマルチモーダルRAGパイプライン構築の複雑さについて議論した。
この講演では、より良いマルチモーダルRAGパイプラインを構築するために、私たちがどのようにデータを使用できるかに焦点を当てました。特に、データ管理と可視化のためのFiftyOne、ベクトルストアとしてのMilvus、大規模言語モデル(LLMs)のオーケストレーションのためのLlamaIndexの活用を強調しました。
マルチモーダルRAGを見る前に、一般的なRAGの概要を見てみよう。
テキストベースのコンテキストにおけるRAGの概要
Jacobはまず、テキストベースのRetrieval Augmented Generation (RAG)とその仕組みについて説明する。テキストベースのRAGシステムについては、この4部構成のRAGハンドブックですでに詳しく取り上げているので、ここでは簡単に説明する。
RAGは、大規模言語モデル(LLM)の知識を関連する外部データで補強することで、LLMの能力を向上させる。LLMは、膨大なデータセットで訓練されているにもかかわらず、しばしば知識のカットオフや幻覚のような限界を持っています。RAGは、MilvusやZilliz Cloudのような外部のベクトルデータベースから関連文書を検索して取り込むことで、これらの問題を軽減し、より正確で文脈に関連した応答をユーザーに提供します。
テキストベースのRAGシステムのアーキテクチャはシンプルだ。RAGのプロセスを見てみよう。
検索拡張生成(RAG)](https://assets.zilliz.com/rag_3d94a263d8.png)
図1: LLMとベクトルデータベースを統合するRAGのプロセス_(英語)
上の図では、文書はより小さなテキストセグメントに分割され、ベクトル埋め込みとして知られる数値表現に変換される。これらの埋め込みはMilvusのようなベクトルデータベースに格納される。
ユーザがプロンプトを入力すると、そのプロンプトもベクトル埋め込みに変換され、ベクトルデータベースへの問い合わせに使用される。元のプロンプトと組み合わされることで、これらの関連する文章はLLMにとって文脈に富んだ入力となる。最後に、LLMはこの入力を処理して、より正確で文脈に関連した応答を生成する。
このアプローチは、テキストのみに依存するシステムには非常に効果的である。しかし、テキストベースのRAGシステムは、情報に基づいた意思決定を行うために複数のデータタイプを必要とするシステムには不十分である。例えば、eコマース・ショップ。ユーザーに最も関連性の高い商品を提示するには、テキストだけに頼るわけにはいかない。商品画像や説明文などが必要だ。そこで、Multimodal RAGは、最新のマルチモーダルLLMを活用し、様々なデータモダリティを統合することで、その有用性を証明している。
マルチモーダルLLMとは何か?
GPT-4oやQwen-VLなどのマルチモーダルLLMは、テキスト、画像、音声、動画など、複数のデータタイプを処理・理解できる人工知能システムです。様々なモダリティからの情報を統合・解釈し、画像の説明的キャプションを生成したり、動画に関する質問に答えたり、テキストと視覚的要素を組み合わせたコンテンツを作成したりすることができる。この機能により、多様な入力データをよりよく理解し、文脈を豊かにした回答を生成することができます。
医療サービスや小売業など、さまざまな分野で応用されている。
医療サービス業界では、視覚的な医療画像、テキストベースの臨床ノート、医療領域の医療レポートなどがある。マルチモーダルLLMはこのようなマルチモーダルな情報を合成し、医師の仕事を支援する。その一例がMed-PaLM LLMであり、これはテキストデータとビジュアルデータの両方を活用し、医療上の意思決定を強化し、患者の治療成果を向上させる。
小売業では、マルチモーダルLLMはカスタマイズされた広告を作成し、商品検索機能を強化する。マルチモーダルLLMは、テキストの説明文、商品の画像、顧客とのインタラクションデータ(レビューや検索クエリなど)など、さまざまな種類のデータを処理・統合する。このようなマルチモーダルな情報を分析することで、LLMは個人の嗜好や閲覧履歴に合わせたパーソナライズされた広告を生成することができる。
このような高度な機能を備えていても、マルチモーダルLLMにはテキストベースのものと同じ限界がある。知識のカットオフや幻覚に悩まされるのだ。これらの問題を軽減するためには、マルチモーダルRAGが必要になる。
マルチモーダルRAGの理解
マルチモーダルRAGは、マルチモーダルLLMの能力を強化するために、情報検索と生成モデリングを組み合わせた高度なAI技術である。マルチモーダルRAGがどのように機能するかを理解するために、以下のマルチモーダルRAG検索パイプラインを見てみよう。
図2- マルチモーダルRAG検索パイプライン](https://assets.zilliz.com/Fig_2_Multimodal_RAG_retrieval_pipeline_e5d3e8f393.png)
図2:マルチモーダルRAG検索パイプライン
ユーザが質問をすると、まず埋め込みモデルがその質問を埋め込みに変換する。この埋め込みは、Milvusのようなマルチモーダルなベクトルデータベースへの問い合わせに使われる。ベクトル・データベースは、質問に対する最近傍(nearest neighbors)(https://zilliz.com/glossary/anns)、要するに最も関連性の高い文書を検索する。検索されたドキュメントは元の質問と組み合わされ、テキストとビジュアルの両方のコンテキストを含むマルチモーダルなプロンプトを形成する。そして、マルチモーダルLLMは、より正確で文脈に関連した回答を生成するために、多様なデータタイプを統合し、このエンリッチされたプロンプトを処理する。
次のセクションでは、FiftyOne、LLamaIndex、Milvusを使用して、マルチモーダルRAGパイプラインを実装する方法を実際に試してみましょう。
FiftyOne、LLamaIndex、Milvusを使ったマルチモーダルRAGパイプラインの実装
FiftyOne、LLamaIndex、Milvusを使ってマルチモーダルRAGパイプラインを実装する方法は2つあります。1つは独自のコードを作成する方法で、より多くの制御が可能ですが時間がかかります。もう1つは、FiftyOneアプリに機能を追加できるプラグインを使用する方法です。
このセクションでは、Milvus ベクターデータベースを使用した fiftyone-multimodal-rag-plugin を使用して、マルチモーダル RAG パイプラインの実装について説明します。ゼロからコーディングしたい場合は、Milvus と FiftyOne を使ったマルチモーダルベクトル埋め込み を生成するための初心者向けガイドをご覧ください。
環境のセットアップ
Jacobは講演の中で、インストールされたmultimodalプラグインを使ったデモに飛び込みます。デモにもGitHubのプラグインインストールガイドにも、重要なインストールステップが明示されていません。それはMilvusのインストールステップだ。
このプラグインを使うには、あなたのコンピューターでMilvusインスタンスがすでに稼働している必要があります。FiftyoneプラグインはMilvusに依存し、マルチモーダル埋め込みデータを保存・取得します。このプラグインはMilvusがhttp://localhost:19530。Milvusがインストールされていない場合は、Milvusのドキュメントに従ってインストールと実行を行ってください。
Milvusをインストールして実行した後、以下のインストールガイドラインに従って、fiftyone-multimodal-rag-pluginをインストールして設定してください。セットアップが完了したら、FiftyOneアプリを起動し、利用可能な操作をブラウズして、プラグインが提供する機能を確認してください。
図 3- FiftyOne の利用可能な操作の選択ページ](https://assets.zilliz.com/Fig_3_Fifty_One_available_operations_selection_page_8e948420ed.png)
図 3:利用可能な操作の選択ページ
それでは、RAGパイプラインを作成してみましょう。
ステップ1:LLamaIndexドキュメントからデータセットを作成する
このステップでは、画像とテキストファイルを含むフォルダをコンピュータから選択します。このマルチモーダルデータを埋め込み、Milvusに保存します。データセットのフォルダを読み込むには、Create a Dataset from the LLamaIndex Documentsを選択してください。データセットの名前とディレクトリを選択してください。
図4- LLamaIndexドキュメントからデータセットを作成する](https://assets.zilliz.com/Fig_4_Creating_a_dataset_from_L_Lama_Index_documents_4b7a2cd2b2.png)
図4:LLamaIndex文書からデータセットを作成する
Execute**をクリックすると、データセットが読み込まれ、可視化されます。
図5-FiftyOneにおけるマルチモーダルデータセットの可視化](https://assets.zilliz.com/Fig_5_Visualization_of_a_multimodal_dataset_in_Fifty_One_3da9b3abcb.png)
図5:FiftyOneにおけるマルチモーダルデータセットの視覚化_」()
この可視化では、データセットが画像とテキストで構成され、マルチモーダルになっていることがわかります。次のステップは、上記のデータセットのマルチモーダルRAGインデックスを作成することです。
ステップ2:LlamaIndexとMilvusの統合によるマルチモーダルRAGインデックスの作成
LlamaIndex](https://zilliz.com/product/integrations/Llamaindex)とMilvusを使ってマルチモーダルRAGインデックスを作成するには、マルチモーダルデータを効率的に管理・検索するために、2つのライブラリを統合する必要があります。LlamaIndexはマルチモーダルデータの取り込みとベクトル表現への埋め込みを行います。LlamaIndexはマルチモーダルデータの取り込みとベクトル表現への埋め込みを行い、これらの埋め込みはMilvusに保存され、後でクエリを実行する際に検索されます。
FiftyOneのオペレーション選択ページで、Create Multimodal RAG Index オペレーションを選択します。そしてインデックスに名前を付け、実行をクリックします。
図6- LLamaIndexとMilvusを使用したMultimodal RAGインデックスの作成](https://assets.zilliz.com/Fig_6_Creation_of_a_Multimodal_RAG_index_using_L_Lama_Index_and_Milvus_43127e17ab.png)
図6: LLamaIndexとMilvusを使ったMultimodal RAGインデックスの作成_()
データセットのサイズにもよるが、実行には時間がかかるので、気長に待とう。この過程で、データセットはベクトル埋め込みに変換され、Milvusに格納されます。データセットが大きければ大きいほど、インデックスの作成に時間がかかります。RAGインデックスが作成されたら、クエリを実行します。
ステップ3:マルチモーダルRAGインデックスのクエリ
このクエリステップは、RAGパイプラインの中で実行に最も時間がかかります。ご存知のように、遅いアプリケーションを好む人はいません。そのため、クエリされるベクトルデータベースは、正確であると同時に、検索プロセスにおいて高速である必要があります。そこで、最も広く採用されているオープンソースのベクトルデータベースであるMilvusの出番です。
Jacobs氏は講演の中でMilvusについて語っているが、プラグインはフードの下で起こっていることのほとんどを抽象化しているため、マルチモーダルRAGパイプラインにおけるMilvusの利点を十分に理解できないかもしれない。しかし、**fiftyone-multimodal-rag-pluginの開発者を含む、ほとんどのマルチモーダルRAG開発者がなぜMilvusを使うことにしたのかを見てみよう:
億スケールのベクトル・ストレージと検索:** Milvusは億スケールのベクトル・データを効率的に管理し、ミリ秒レベルのレイテンシで迅速なアクセスを保証します。
水平スケーラビリティ:** Milvusは高いスケーラビリティを持ち、ビジネスの成長とともに変化するニーズに適応します。
RAGに最適:** Milvusは様々なGenAIアプリケーション、特に検索拡張世代(RAG)の構築に不可欠なインフラストラクチャです。
高速検索:** 最適化された検索アルゴリズムにより、Milvusは対話型AIシステムやレコメンデーションエンジンのようなリアルタイムアプリケーションに不可欠な、関連するベクトルの高速かつ正確な検索を可能にします。
Milvusは様々なデータタイプをサポートし、ハイブリッド検索を行うことができます。この機能により、マルチモーダル検索、ハイブリッドスパース検索とデンス検索、ハイブリッドデンス検索とフルテキスト検索を組み合わせることができ、多用途で柔軟な検索機能を提供します。
マルチモーダルRAGインデックスを検索するには、Operations選択ページに移動し、Query Multimodal RAG Indexオペレーションを選択します。次に、クエリを入力し、使用するインデックス、レスポンスを生成するLLM、テキスト結果の数、最後に含める画像結果の数を選択します。
図7- MilvusによるマルチモーダルRAGインデックスのクエリ](https://assets.zilliz.com/Fig_7_Querying_a_multimodal_RAG_Index_powered_by_Milvus_1cca223b17.png)
図7:MilvusによるマルチモーダルRAGインデックスのクエリ
このプラグインは、Milvusを使用して、クエリに基づいて最も関連性の高いエンベッディングを検索するベクトル類似度検索を実行します。検索されたエンベッディングは、選択された大規模言語モデルを使用してレスポンスを生成するためのコンテキストを提供します。上記のクエリの結果は以下の通りです:
図8- マルチモーダルRAGインデックスの検索結果](https://assets.zilliz.com/Fig_8_Results_of_querying_a_multimodal_RAG_Index_7aafe45bc7.png)
図8:マルチモーダルRAGインデックスへのクエリ結果_(英語)
この結果は、クエリを実行する際に使用したインデックスとモデル、および大規模言語モデルによって生成された応答を示しています。
ここまでで、FiftyOne、LLamaIndex、Milvusを使用したマルチモーダルRAGパイプラインの作成手順はすべて完了しました。
結論
Jacob 氏のプレゼンテーションでは、FiftyOne、LlamaIndex、Milvus を統合して強力なマルチモーダル RAG パイプラインを構築する可能性が強調されました。これらのツールは、テキストデータとビジュアルデータを効率的に活用することで、データ検索を改善し、コンテキストに富んだ応答を行うことで、マルチモーダルシステムの機能を強化します。Milvusは堅牢なベクトルストレージと高速検索を提供し、プロジェクトを新たな高みへと導きます。
その他のリソース
読み続けて

Vector Databases vs. Document Databases
Use a vector database for similarity search and AI-powered applications; use a document database for flexible schema and JSON-like data storage.

GPL: Generative Pseudo Labeling for Unsupervised Domain Adaptation of Dense Retrieval
GPL is an unsupervised domain adaptation technique for dense retrieval models that combines a query generator with pseudo-labeling.

Leveraging Milvus and Friendli Serverless Endpoints for Advanced RAG and Multi-Modal Queries
This tutorial has demonstrated how to leverage Milvus and Friendli Serverless Endpoints to implement advanced RAG and multi-modal queries.