MilvusとFriendliサーバーレスエンドポイントの活用による高度なRAGとマルチモーダルクエリーの実現
FriendliAIは生成AIインフラストラクチャに特化し、組織が大規模言語モデル(LLM)やその他の生成AIモデルを最適化されたパフォーマンスとコスト削減で効率的に導入・管理できるソリューションを提供しています。ユーザーは、APIを通じてアクセス可能なプロダクションレディな従来のLLM、またはパブリッククラウドまたはプライベートなオンプレミスクラスターのいずれであっても、ユーザーが選択したハードウェア上に展開されたカスタムファインチューニングされたLLMから選択することができます。
Milvusは、オープンソースのベクトルデータベースであり、高次元のベクトル埋め込みを通じて、10億スケールの非構造化データを保存、索引付け、検索する。検索拡張生成(RAG)、セマンティック検索、マルチモーダル検索、推薦システムなどの最新のAIアプリケーションを構築するのに最適である。
この記事では、特定の文書や資料に対して検索拡張生成(RAG)を実行し、画像やその他のビジュアルコンテンツを組み込んだマルチモーダルクエリを実行するために、FriendliサーバーレスエンドポイントとMilvusを使用する方法を探ります。この強力な組み合わせにより、より洗練された、コンテキストを意識したAIアプリケーションが可能になります。
##RAGとマルチモーダルモデルを理解する
検索拡張生成(RAG)
RAGは、主にベクトル・データベースを利用した知識ベースから取得した関連情報を言語モデルに提供することで、言語モデルを強化する手法である。このアプローチにより、AIモデルは、指定された外部データソースを参照することで、より正確で文脈に適した応答を生成できるようになる。
マルチモーダルモデル
マルチモーダルモデルは、テキスト、画像、音声など、複数のタイプの入力データを処理し、理解することができる。多様な情報源に基づく応答を分析・生成することができ、より包括的で微妙なインタラクションを可能にする。
なぜRAGとマルチモーダルモデルを一緒に取り入れるのか?
RAGとマルチモーダル機能の組み合わせは、以下の機能を同時に提供することで、AIシステムを大幅に改善します:
- ユーザーが選択した、より多様で豊富な入力タイプを可能にする
- 最新情報の提供
- 応答の正確性と関連性の向上
- 文脈を考慮したインタラクションの実現
##ハンズオン・インプリメンテーション
Milvusベクトルデータベース](https://milvus.io/)とFriendliサーバーレスエンドポイントを使って、RAGとマルチモーダルクエリーを実際に実装してみよう。
ステップ1:前提条件のインストールとMilvusドキュメントのダウンロード
まず、必要なライブラリをインストールし、RAGジョブで使用するMilvusドキュメントをダウンロードします:
bash pip install --upgrade pymilvus requests tqdm langchain langchain-community langchain-huggingface langchain-openai friendli-client tiktoken
wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip rm -rf milvus_docs !unzip -q milvus_docs_2.4.x_ja.zip -d milvus_docs
### ステップ 2: ドキュメンテーションファイルの処理
次に、Milvusのドキュメントファイルを読み、単純なファイル分割戦略を使って各テキスト行を個々のチャンクとして扱います:
python
from glob import glob
text_lines = [].
for file_path in glob("milvus_docs/ja/faq/*.md", recursive=True):
with open(file_path, "r") as file:
file_text = file.read()
text_lines += file_text.split("# ")
ステップ3:埋め込みを準備する
Hugging Faceエンベッディングライブラリを使用して、テキストのベクトル表現を作成するために単純なall-MiniLM-L6モデルを使用します:
python from langchain_huggingface import HuggingFaceEmbeddings
embeddings_model_name = "sentence-transformers/all-MiniLM-L6-v2" embedding = HuggingFaceEmbeddings(model_name=embeddings_model_name)
test_embedding = embedding.embed_query("これはテストです") embedding_dim = len(test_embedding) print(embedding_dim) print(test_embedding[:10])
### ステップ4: Milvusクライアントのセットアップ
それでは、RAG実装のためにMilvusクライアントを準備しましょう。この単純な例では、[Milvus Lite](https://milvus.io/blog/introducing-milvus-lite.md)を使用します。このクライアントはローカルで動作し、ローカルファイル内のファイルを実体化します。また、他のMilvus導入オプションも検討できます:
小規模データやプロトタイピングのためにローカルのベクターデータベースが必要なだけであれば、uriをローカルファイル、例えば`./milvus.db`に設定するのが最も便利な方法です。
より大規模なデータやトラフィックを本番環境で利用する場合は、[DockerまたはKubernetes](https://milvus.io/docs/install-overview.md)上にMilvusサーバを構築することができます。このセットアップでは、サーバのアドレスとポートを `uri` として使用してください (例: `http://localhost:19530`)。Milvusの認証機能を有効にしている場合は、`token`に"<your_username>:<your_password>"を設定してください。
また、[Zilliz Cloud](https://zilliz.com/cloud)上でフルマネージドMilvusを利用することも可能です。uri`と`token`にZilliz Cloudインスタンスの[Public EndpointとAPI key](https://docs.zilliz.com/docs/byoc/quick-start#cluster-details)を設定するだけです。
python
from pymilvus import MilvusClient
milvus_client = MilvusClient(uri="./milvus_demo.db")
コレクション名 = "my_rag_collection"
ステップ 5: Milvus コレクションの作成
Milvusクライアントにコレクションが存在しない場合は作成します:
python if milvus_client.has_collection(collection_name): milvus_client.drop_collection(collection_name)
milvus_client.create_collection( collection_name=collection_name、 dimension=embedding_dim、 metric_type="IP", # 内積距離 consistency_level="Strong", # 強い一貫性レベル )
### ステップ 6: Milvusへのテキストの埋め込みと挿入
テキストを埋め込み、Milvusコレクションに挿入してみましょう:
python
from tqdm import tqdm
データ = [].
for i, line in enumerate(tqdm(text_lines, desc="エンベッディングの作成")):
data.append({"id": i, "vector": embedding.embed_query(line), "text": line})
milvus_client.insert(collection_name=collection_name, data=data)
ステップ7:RAGクエリーの実行
これで、Milvusデータベース内で質問を行い、関連するデータを検索することができます:
``python question = "milvusにはどのようにデータが保存されていますか?"
search_res = milvus_client.search( コレクション名=コレクション名、 data=[ embedding.embed_query(question) ], limit=3, # トップ3の結果を返す search_params={"metric_type":"IP", "params":{}}, # 内積距離 output_fields=["text"], # テキストフィールドを返す )
インポートjson
retrieved_lines_with_distances=["距離"] for res in search_res[0]. (res["entity"]["text"], res["distance"]) for res in search_res[0]. ] print(json.dumps(retrieved_lines_with_distances, indent=4))
context = "♪n".join( [line_with_distance[0]forline_with_distance in retrieved_lines_with_distances]. )
### ステップ 8: RAG 用プロンプトの作成
RAGクエリのシステムプロンプトとユーザープロンプトを作成しましょう:
``python
system_prompt = """
人間:あなたはAIアシスタントです。あなたは提供された文脈的なパッセージのスニペットから質問の答えを見つけることができます。
"""
USER_PROMPT = f""
<question>タグで囲まれた質問に対する答えを提供するために、<context>タグで囲まれた以下の情報を使用してください。
<context>
{コンテキスト}
</context>
<question>
質問
</question>
"""
ステップ9: Friendliトークンの設定
Friendli Suite](https://suite.friendli.ai/)からFRIENDLI_TOKENを取得し、環境変数に設定してください:
python インポート os
if "FRIENDLI_TOKEN" not in os.environ: os.environ["FRIENDLI_TOKEN"] = 'flp_FILL_IN_WITH_YOUR_OWN_PERSONAL_ACCESS_TOKEN'
### ステップ 10:RAGクエリーの実行
Friendli Serverless Endpoints](https://friendli.ai/docs/guides/serverless_endpoints/introduction) を使って RAG クエリを実行します:
python
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="meta-llama-3.1-70b-instruct",
base_url="https://api.friendli.ai/serverless/v1"、
api_key=os.environ["FRIENDLI_TOKEN"]、
)
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_messages([
("system", SYSTEM_PROMPT)、
("user", USER_PROMPT)
])
output_parser = StrOutputParser()
chain = prompt | llm | output_parser
print(chain.invoke({"input": question}))
これは提供されたドキュメントに基づいて答えを生成します:
Milvusでは、データは挿入データとメタデータの2つの形式で保存される。
挿入データ(ベクトルデータ、スカラーデータ、コレクション固有のスキーマ)は、インクリメンタルログとして永続ストレージに保存されます。Milvusは、MinIO、AWS S3、Google Cloud Storage (GCS)、Azure Blob Storage、Alibaba Cloud OSS、Tencent Cloud Object Storage (COS)など、複数のオブジェクトストレージバックエンドをサポートしている。
一方、メタデータはMilvus内で生成され、etcdに保存され、各Milvusモジュールが独自のメタデータを持つ。
ステップ11:マルチモーダル・クエリー
マルチモーダルクエリにはLlama-3.2-11b-visionモデルを使用する:
python multimodalllm = ChatOpenAI( model="llama-3.2-11b-vision-instruct", base_url="https://api.friendli.ai/serverless/beta"、 api_key=os.environ["FRIENDLI_TOKEN"]、 )
image_url = "https://milvus.io/docs/v2.4.x/assets/highly-decoupled-architecture.png" message = HumanMessage( content=[ {"type":"text", "text":「この画像に何が写っているかを説明してください、} {"type":「image_url", "image_url":{"url": image_url}}、 ], )
response = multimodalllm.invoke([メッセージ]) print(response.content)
そのレスポンスから、モデルが画像を正しく理解していることが推測できる:
この画像はシステムのコンポーネントのフローチャートを示しており、以下のコンポーネントがある: **コーディネータ・サービス
- ルート
- クエリー ...
### ステップ12:RAGとマルチモーダル機能を組み合わせる
最後に、RAGとマルチモーダル機能を組み合わせてみよう:
パイソン
question = "この写真に関してmilvusにデータはどのように保存されていますか?"
USER_PROMPT = f""
<question>タグで囲まれた質問に対する答えを提供するために、<context>タグで囲まれた以下の情報の断片を使用します。
<context>
{コンテキスト}
</context>
<question>
質問
</question>
"""
メッセージ = HumanMessage(
content=[
{"type":「text", "text":USER_PROMPT}、
{"type":「image_url", "image_url":{"url": image_url}}、
],
)
response = multimodalllm.invoke([メッセージ])
print(response.content)
このモデルは画像とドキュメントに基づいて正しいレスポンスを正しく生成します:
**ステップ1: Milvusのデータ保存に関わるコンポーネントを特定する。
Milvusのデータ保存に関わるコンポーネントは以下の通りです:
* アクセス層
* メッセージストレージ
* ワーカーノード
**ステップ2: Milvusにおけるデータの保存方法を決定する。
データはアクセス層とメッセージストレージに格納されます。
**ステップ3: Milvusのどこにデータが保存されているかを決定する。
データはアクセス層とメッセージストレージの両方に保存されます。
**回答:***データはアクセスレイヤーとメッセージストレージの両方に保存されます。
完全なコードと詳細については、このColab notebookをチェックしてください。
結論
このチュートリアルでは、MilvusとFriendli Serverless Endpointsを活用して、高度なRAGクエリーとマルチモーダルクエリーを実装する方法を紹介した。これらの強力なテクノロジーを組み合わせることで、多様なタイプの情報を理解して処理し、より正確でコンテキストを考慮した応答を導く、より洗練されたAIアプリケーションを作成することができる。
読み続けて

Introducing Functions and Model Inference on Zilliz Cloud: Automatic Embedding and Reranking with Hosted Models
Zilliz Cloud Functions auto-generate embeddings via OpenAI, Voyage AI, Cohere, or Zilliz Hosted Models. Built-in reranking — just insert text and search.

Optimizing Embedding Model Selection with TDA Clustering: A Strategic Guide for Vector Databases
Discover how Topological Data Analysis (TDA) reveals hidden embedding model weaknesses and helps optimize vector database performance.

Enhancing AI Reliability Through Fine-Grained Hallucination Detection and Correction with FAVA
In this blog, we will explore hallucinations, the taxonomy that provides a framework for categorizing them, and how FAVA detects and corrects errors
