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

vLLMとMilvusを用いたマルチモーダルRAGシステムの展開

Nov 13, 20242 min read

APIプロバイダーを通じて、特定のLLMを中心にAIアプリケーションを微調整するのに何ヶ月も費やしたとしよう。すると突然、メールが届いた:「あなたが使っているモデルを廃止し、新しいバージョンに切り替えます。聞き覚えがあるだろうか?クラウドAPIプロバイダーは、パワフルですぐに使えるAI機能という利便性を提供する一方で、それだけに頼ることはいくつかの重大なリスクをもたらす:

  • コントロールの欠如:コントロールの欠如:モデルのバージョンやアップデートをコントロールできない。
  • 予測不可能性**:モデルの動作や能力が突然変化する可能性があります。
  • 限られた洞察力**:パフォーマンスや使用パターンの可視性が限られていることが多い。
  • プライバシーに関する懸念**:データのプライバシーは、特に機密情報を扱う場合、重大な問題となる可能性があります。

では、どのような解決策があるのでしょうか?どのようにしてコントロールを取り戻すことができるのでしょうか?システムの能力を高めながら、これらのリスクを軽減するにはどうすればいいのでしょうか?その答えは、オープンソースのソリューションを使って、より強固で独立したシステムを構築することにあります。

このブログでは、MilvusとvLLMを使ってMultimodal RAGを作成する方法を説明します。オープンソースのベクトルデータベースとオープンソースのLLM推論を組み合わせることで、複数のタイプのデータ-テキスト、画像、音声、さらには動画-を処理し理解することができるシステムを設計することができます。このアプローチでは、テクノロジーを完全にコントロールできるだけでなく、従来のテキストベースのソリューションを凌駕する、強力で汎用性の高いシステムを実現することができます。

##私たちが構築するもの:完全にあなたのコントロール下にあるマルチモーダルRAG

MilvusとvLLMを使ってMultimodal RAGシステムを構築し、LLMをセルフホストしてAIアプリケーションを完全にコントロールする方法を説明します。このチュートリアルでは、複数のデータタイプを統合することのパワーを示すStreamlitアプリケーションの作成方法を説明します。以下はその内容です:

1.フレームの抽出と音声の転写によるビデオ入力の処理

2.Milvusを使ってマルチモーダルデータを保存し、効率的にインデックスを作成する。

1.OpenAI CLIP](https://zilliz.com/learn/exploring-openai-clip-the-future-of-multimodal-ai-learning)を用いて画像を埋め込み符号化し、Milvusで検索できるようにする。 2.テキストはMistral Embeddingモデルを用いて埋め込み符号化する。

3.Milvusを使用して、ユーザークエリに基づいて関連するコンテキストを取得する。

4.vLLMで動作するPixtralを使用して、視覚とテキスト理解の両方を活用した応答を生成します。

このチュートリアルが終わるころには、APIの廃止や予期せぬ変更に悩まされることなく、柔軟でスケーラブルなシステムを完全にコントロールできるようになっていることでしょう。

Milvusとは?

Milvusは、高次元のベクトル埋め込みを通して、10億スケールの非構造化データを保存、索引付け、検索することができる、オープンソースの高性能で拡張性の高いベクトルデータベースです。検索拡張世代(RAG)、セマンティック検索、マルチモーダル検索、推薦システムなどの最新のAIアプリケーションの構築に最適です。Milvusは、ラップトップから大規模分散システムまで、様々な環境で効率的に動作する。

vLLM とは?

vLLM (Virtual Large Language Model)の核となる考え方は、効率的なメモリ管理技術を利用することにより、LLMの提供と実行を最適化することです。以下はその主要な側面である:

  • 最適化されたメモリ管理:** vLLMは、利用可能なハードウェア・リソースを十分に活用するために、高度なメモリ割り当てと管理技術を実装しています。この最適化により、大規模な言語モデルを効率的に実行し、パフォーマンスを妨げるメモリ・ボトルネックを防ぎます。
  • 動的バッチ処理**: vLLMは、基盤となるハードウェアのメモリと計算能力に基づいて、バッチサイズとシーケンスを適応させます。この動的な調整により、処理スループットが向上し、モデル推論中の待ち時間が最小限に抑えられます。
  • モジュール設計**:vLLMのアーキテクチャはモジュール化されており、さまざまなハードウェア・アクセラレータとの統合が容易です。また、このモジュール性により、複数のデバイスやクラスタに容易に拡張できるため、さまざまな導入シナリオに高い適応性を発揮します。
  • 効率的なリソース利用**: vLLMは、CPU、GPU、メモリなどの重要なリソースの使用を最適化します。この効率性により、システムはより大きなモデルをサポートし、同時リクエスト数の増加に対応することができます。
  • シームレスな統合**:既存の機械学習フレームワークやライブラリとスムーズに統合できるように設計されたvLLMは、ユーザーフレンドリーなインターフェースを提供します。これにより、開発者は大規模な再設定を行うことなく、さまざまなアプリケーションに大規模な言語モデルを容易に導入し、管理することができます。

マルチモーダルRAGのコアコンポーネント

私たちが構築しているマルチモーダルRAGアプリは、以下の主要コンポーネントで構成されています:

  • vLLM](https://github.com/vllm-project/vllm)**は、Pixtralマルチモーダルモデルの推論と提供に使用する推論ライブラリです。
  • Koyeb](http://Koyeb.com)**は、AIワークロードに特化したサーバーレスプラットフォームを提供し、我々のデプロイのためのインフラレイヤーを提供します。ネイティブvLLM統合](https://www.koyeb.com/deploy/vllm)と自動化されたGPUリソース管理により、本番グレードのパフォーマンスとスケーラビリティを維持しながら、LLMを簡単に導入することができます。
  • Mistral AIのPixtral**は、400Mパラメータのビジョン・エンコーダと12Bパラメータのマルチモーダル・デコーダを組み合わせて、我々のマルチモーダル頭脳として機能します。このアーキテクチャにより、同じコンテキスト・ウィンドウ内で画像とテキストの両方を処理することができます。
  • Milvusはベクトルストレージの基盤を提供し、異なるモダリティからの埋め込みを効率的に管理します。複数のベクトルタイプを扱い、高速な類似検索を実行できるため、マルチモーダルアプリケーションに最適です。

図- マルチモーダルRAGアーキテクチャ.png](https://assets.zilliz.com/Figure_The_multimodal_RAG_architecture_3fd1ccb67e.png)

図:マルチモーダルRAGアーキテクチャ

はじめに

まず、依存関係をインストールしましょう:

Python

LlamaIndex のコアパッケージ

pip install -U llama-index-vector-stores-milvus llama-index-multi-modal-llms-mistralai llama-index-embeddings-mistralai llama-index-multi-modal-llms-openai llama-index-embeddings-clip llama_index

動画と音声の処理

pip install moviepy pytube pydub SpeechRecognition openai-whisper ffmpeg-python soundfile

画像処理と可視化

pip install torch torchvision matplotlib scikit-image git+https://github.com/openai/CLIP.git

ユーティリティとインフラ

pip install pymilvus streamlit ftfy regex tqdm



## 環境のセットアップ

まずは環境を設定し、必要なライブラリをインポートすることから始めよう:

パイソン
インポート os
import base64
import json
from pathlib import Path
from dotenv import load_dotenv
from llama_index.core import 設定
from llama_index.embeddings.mistralai import MistralAIEmbedding

# 環境変数を読み込む
load_dotenv()

# デフォルトの埋め込みモデルを設定する
設定.embed_model = MistralAIEmbedding(
    "mistral-embed"、
    api_key=os.getenv("MISTRAL_API_KEY")
)

ビデオ処理パイプライン

このパイプラインは、生のビデオコンテンツを、RAGシステムが理解し効率的に処理できるデータに変換する。

パイソン def process_video(video_path: str, output_folder: str, output_audio_path: str) -> dict: # 出力ディレクトリが存在しない場合は作成する パス(output_folder).mkdir(parents=True, exist_ok=True)

# 動画からフレームを抽出
video_to_images(video_path, output_folder)

# 音声を抽出して書き起こす
video_to_audio(video_path, output_audio_path)
text_data = audio_to_text(output_audio_path)

# 書き起こしを保存
with open(os.path.join(output_folder, "output_text.txt")), "w") as file:
    file.write(text_data)

os.remove(output_audio_path)
return {"Author":「著者例", "タイトル例":「タイトル例", "再生回数":"1000000"}

このパイプラインは動画を以下のように分解する:

- 画像フレーム(0.2 FPSで抽出)
- Whisper を使った音声トランスクリプション
- 動画に関するメタデータ


## ベクトルインデックスの構築

Milvusを使ってマルチモーダル埋め込みを保存します。以下はインデックスの作成方法です:

``Python
def create_index(output_folder: str):
    # テキストと画像用に異なるコレクションを作成する
    text_store = MilvusVectorStore(
        uri="milvus_local.db"、
        collection_name="text_collection"、
        overwrite=True、
        dim=1024
    )
    
    image_store = MilvusVectorStore(
        uri="milvus_local.db"、
        コレクション名="image_collection"、
        overwrite=True、
        dim=512
    )
    
    storage_context = StorageContext.from_defaults(
        vector_store=text_store、
        image_ストア=image_ストア
    )
    
    # ドキュメントの読み込みとインデックス作成
    documents = SimpleDirectoryReader(output_folder).load_data()
    return MultiModalVectorStoreIndex.from_documents(
        ドキュメント、
        storage_context=storage_context
    )

Pixtralによるクエリ処理

ユーザーが質問するとき、私たちは次のことを行う必要があります:

1.ベクトルストアから関連するコンテキストを取得する 2.テキストと画像の両方を使用してPixtralでクエリを処理する。

これがクエリ処理関数です:

Python def process_query_with_image(query_str, context_str, metadata_str, image_document): client = OpenAI( base_url=os.getenv("KOYEB_ENDPOINT")、 api_key=os.getenv("KOYEB_TOKEN") )

with open(image_document.image_path, "rb") as image_file:
    image_base64 = base64.b64encode(image_file.read()).decode("utf-8")

qa_tmpl_str = """
提供された情報(関連する画像や動画から取得したコンテキストを含む)が与えられた場合
クエリに正確かつ正確に答える。
追加的な事前知識がなくても、クエリに正確かつ的確に答える。
---------------------
コンテキストコンテキスト: {context_str}
メタデータ:メタデータ: {metadata_str}
---------------------
クエリ:クエリ: {query_str}
答え"""

# Pixtral用のメッセージを準備する
メッセージ = [
    {
        "role":"ユーザー"、
        "content":[
            {
                "type":text": "テキスト"、
                "text": qa_tmpl_str.format(
                    context_str=context_str、
                    query_str=query_str、
                    メタデータ_str=メタデータ_str
                )
            },
            {
                "type":"image_url"、
                "image_url":{
                    "url": f "data:image/jpeg;base64,{image_base64}"
                }
            },
        ],
    }
]

completion = client.chat.completions.create(
    model="mistralai/Pixtral-12B-2409",
    messages=messages、
    max_tokens=300
)
return completion.choices[0].message.content


## Streamlitインターフェースの構築

最後に、Streamlitを使ったユーザーフレンドリーなインターフェースを作ります:

パイソン
def main():
    st.title("PixtralとMilvusによるマルチモーダルRAG")
    
    # セッションの状態を初期化する
    if 'index' not in st.session_state:
        st.session_state.index = None
        st.session_state.retriever_engine = なし
        st.session_state.metadata = None
    
    # ビデオ入力
    video_path = st.text_input("ビデオパスを入力してください:")
    
    if video_path and not st.session_state.index:
        with st.spinner("Processing video..."):
            # 動画を処理し、インデックスを作成する
            [...処理コード ...]。
    
    if st.session_state.index:
        st.subheader("Chat with the Video")
        query = st.text_input("ビデオについて質問する:")
        
        if query:
            with st.spinner("応答を生成中..."):
                # 応答を生成して表示する
                [...クエリ処理コード ...].

if __name__ == "__main__":
    main()

アプリケーションの実行

アプリケーションを起動する前に

1..env`で環境変数を設定する。 2.必要な依存関係をすべてインストールする。

次にアプリケーションを起動する:

Bash streamlit run app.py


ホームページが表示されます:

- 動画をアップロードする
- 動画の内容について質問する
- ピクストラルからの回答を関連する動画フレームとともに読む

図- MilvusとPixtralで作られたマルチモーダルRAGアプリのインターフェース.png](https://assets.zilliz.com/Figure_The_interface_of_your_multimodal_RAG_app_built_with_Milvus_and_Pixtral_34db5892ff.png)


図:MilvusとPixtralで構築したマルチモーダルRAGアプリのインターフェース

これからは、ビデオとインタラクトして、例えば、ガウス分布についてもっと学ぶことができます。

図- マルチモーダル検索の実行.png](https://assets.zilliz.com/Figure_Performing_the_multimodal_search_a416ae862d.png)


図:マルチモーダル検索の実行


## 結論

このブログポストでは、Milvus、Pixtral、vLLMを使って、強力なマルチモーダルRAGシステムを構築する方法を紹介しました。Milvusの効率的なベクターストレージ機能とPixtralの高度なマルチモーダル理解の組み合わせにより、ビデオコンテンツに関するクエリを処理、理解、応答できるシステムを構築しました。そして、このシステムは完全にお客様のコントロール下にあります。


## ぜひご意見をお聞かせください!

このブログ記事が気に入ったら、ぜひご検討ください:

- ⭐ [GitHub](https://github.com/milvus-io/milvus)で星をつけてください。
- 💬 [Milvus Discord コミュニティ](https://discord.gg/FG6hMJStWu)に参加して、あなたの経験を共有しましょう。
- 🔍 [Bootcamp リポジトリ](https://github.com/milvus-io/bootcamp) でMilvusを使ったマルチモーダルアプリケーションの例をもっと見る


Updated on Apr 24, 2026