エンベッディング機能のご紹介:Milvus2.6がベクトル化とセマンティック検索をいかに効率化するか
ベクター検索アプリケーションを構築したことがある方なら、そのワークフローはすでによくご存知でしょう。データを保存する前に、まず埋め込みモデルを使ってベクトルに変換し、クリーニングと整形を行い、最後にベクトルデータベースに取り込まなければなりません。入力データを埋め込み、類似検索を実行し、得られたIDを元の文書やレコードにマッピングする。それはうまくいくのですが、前処理スクリプト、埋め込みパイプライン、グルーコードが分散して絡み合い、メンテナンスが必要になります。
高性能なオープンソース・ベクターデータベースであるMilvusは、そのすべてを簡素化するための大きな一歩を踏み出しました。Milvus2.6は、OpenAI、AWS Bedrock、Google Vertex AI、Hugging Faceなどの主要なモデルプロバイダーに直接接続する組み込みのエンベッディング機能であるData-in, Data-out機能( エンベッディング機能としても 知られています)を導入しています。独自のエンベッディングインフラストラクチャを管理する代わりに、Milvusがこれらのモデルを呼び出すことができます。また、Milvusが自動的に書き込みとクエリ時のベクトル化を処理する間、生のテキスト(そして近いうちに他のデータタイプも)を使って挿入とクエリを行うことができる。
この記事では、Data-in, Data-outがどのように機能するのか、プロバイダーや埋め込み関数の設定方法、そしてベクター検索のワークフローをエンド・ツー・エンドで効率化するためにどのように使用できるのかについて詳しく見ていきます。
データイン、データアウトとは?
Milvus2.6のData-in, Data-outは、Milvusの内部でデータ変換とエンベッディング生成を処理するためのフレームワークである新しいFunctionモジュール上に構築されています。(このモジュールにより、Milvusは生の入力データを受け取り、埋め込みプロバイダを直接呼び出し、結果のベクトルをコレクションに自動的に書き込むことができます。
Functionモジュールは、エンベッディング生成をネイティブなデータベース機能に変えます。Milvusは、エンベッディングパイプライン、バックグラウンドワーカー、リランカーサービスを個別に実行する代わりに、設定されたプロバイダーにリクエストを送り、エンベッディングを取得し、データと一緒に保存します。これにより、エンベッディングインフラストラクチャを管理するためのオーバーヘッドがなくなります。
Data-in、Data-outは、Milvusのワークフローに3つの大きな改善をもたらします:
生データの直接挿入- 未処理のテキスト、画像、その他のデータタイプをMilvusに直接挿入できるようになりました。事前にベクトルに変換する必要はありません。
Milvusでエンベッディングモデルを設定すると、エンベッディングプロセス全体が自動的に管理されます。Milvusは、OpenAI、AWS Bedrock、Google Vertex AI、Cohere、Hugging Faceなどの様々なモデルプロバイダとシームレスに統合されています。
生入力でのクエリ- 生テキストやその他のコンテンツベースのクエリを使用してセマンティック検索を実行できるようになりました。Milvusは、同じ設定されたモデルを使用して、オンザフライで埋め込みを生成し、類似検索を実行し、関連する結果を返します。
つまり、Milvusは自動的にデータを埋め込み、オプションで再ランクします。ベクトル化は組み込みのデータベース機能となり、外部の埋め込みサービスやカスタムの前処理ロジックは不要となります。
データイン、データアウトの仕組み
下図はData-in, Data-outがMilvus内部でどのように動作するかを示しています。
データイン、データアウトのワークフローは主に6つのステップに分けられます:
データの入力- ユーザーはテキスト、画像、その他のコンテンツタイプなどの生データを、外部での前処理を行うことなくMilvusに直接入力します。
エンベッディングの生成- 関数モジュールは、サードパーティAPIを通じて設定されたエンベッディングモデルを自動的に呼び出し、生の入力をリアルタイムでベクトルエンベッディングに変換します。
エンベッディングの保存- Milvusは生成されたエンベッディングをコレクション内の指定されたベクトルフィールドに書き込みます。
クエリの送信- 入力段階と同様に、ユーザはMilvusに生テキストまたはコンテンツベースのクエリを発行します。
セマンティック検索- Milvusは同じ設定されたモデルを使用してクエリを埋め込み、保存されたベクトルに対して類似検索を実行し、最も近いセマンティックマッチを決定します。
結果を返す- Milvusは最も類似した上位k件の結果を、元のデータにマッピングしてアプリケーションに直接返します。
データイン、データアウトの設定方法
前提条件
Milvus 2.6の最新バージョンをインストールする。
サポートされているプロバイダー(OpenAI、AWS Bedrock、Cohereなど)からエンベッディングAPIキーを準備する。この例では、埋め込みプロバイダとしてCohere を使用します。
milvus.yaml 設定の変更
Docker Composeでmilvusを実行している場合、milvus.yaml ファイルを変更してFunctionモジュールを有効にする必要があります。公式ドキュメントを参照してください:Docker Composeを使用したMilvusの設定(他のデプロイ方法に関する説明はこちら)。
設定ファイルで、credential とfunction のセクションを探します。
そして、apikey1.apikey とproviders.cohere のフィールドを更新してください。
...
credential:
aksk1:
access_key_id: # Your access_key_id
secret_access_key: # Your secret_access_key
apikey1:
apikey: "***********************" # Edit this section
gcp1:
credential_json: # base64 based gcp credential data
# Any configuration related to functions
function:
textEmbedding:
providers:
...
cohere: # Edit the section below
credential: apikey1 # The name in the crendential configuration item
enable: true # Whether to enable cohere model service
url: "https://api.cohere.com/v2/embed" # Your cohere embedding url, Default is the official embedding url
...
...
これらの変更を行ったら、Milvusを再起動して更新された設定を適用します。
データイン、データアウト機能の使用方法
1.コレクションのスキーマの定義
埋め込み機能を有効にするには、コレクションのスキーマに少なくとも3つのフィールドが含まれている必要があります:
主キーフィールド (
id) - コレクション内の各エンティティを一意に識別します。スカラーフィールド (
document) - 元の生データを格納する。Vector フィールド (
dense) - 生成されたベクトル埋め込みを格納する。
from pymilvus import MilvusClient, DataType, Function, FunctionType
# Initialize Milvus client
client = MilvusClient(
uri="http://localhost:19530",
)
# Create a new schema for the collection
schema = client.create_schema()
# Add primary field "id"
schema.add_field("id", DataType.INT64, is_primary=True, auto_id=False)
# Add scalar field "document" for storing textual data
schema.add_field("document", DataType.VARCHAR, max_length=9000)
# Add vector field "dense" for storing embeddings.
# IMPORTANT: Set `dim` to match the exact output dimension of the embedding model.
# For instance, OpenAI's text-embedding-3-small model outputs 1536-dimensional vectors.
# For dense vector, data type can be FLOAT_VECTOR or INT8_VECTOR
schema.add_field("dense", DataType.FLOAT_VECTOR, dim=1536) # Set dim according to the embedding model you use.
2.埋め込み関数の定義
次に、スキーマに埋め込み関数を定義する。
name- 関数の一意な識別子。function_type- テキスト埋め込みにはFunctionType.TEXTEMBEDDING。milvusはFunctionType.BM25やFunctionType.RERANKなどの他の関数タイプもサポートしています。詳細は「全文検索と ディケイランカーの概要」を参照。input_field_names- 生データ(document)の入力フィールドを定義します。output_field_names- ベクトル埋め込みが格納される出力フィールドを定義します (dense)。params- 埋め込み関数の設定パラメータ。providerとmodel_nameの値は、milvus.yaml設定ファイルの対応するエントリと一致する必要があります。
注意:各関数は、異なる変換ロジックを区別し、競合を防ぐために、一意のname とoutput_field_names を持つ必要があります。
# Define embedding function (example: OpenAI provider)
text_embedding_function = Function(
name="cohere_embedding", # Unique identifier for this embedding function
function_type=FunctionType.TEXTEMBEDDING, # Type of embedding function
input_field_names=["document"], # Scalar field to embed
output_field_names=["dense"], # Vector field to store embeddings
params={ # Provider-specific configuration (highest priority)
"provider": "cohere", # Embedding model provider
"model_name": "embed-v4.0", # Embedding model
# "credential": "apikey1", # Optional: Credential label
# Optional parameters:
# "dim": "1536", # Optionally shorten the vector dimension
# "user": "user123" # Optional: identifier for API tracking
}
)
# Add the embedding function to your schema
schema.add_function(text_embedding_function)
3.インデックスの設定
フィールドと関数を定義したら、コレクションのインデックスを作成します。簡単のため、ここでは例としてAUTOINDEXタイプを使用する。
# Prepare index parameters
index_params = client.prepare_index_params()
# Add AUTOINDEX to automatically select optimal indexing method
index_params.add_index(
field_name="dense",
index_type="AUTOINDEX",
metric_type="COSINE"
)
4.コレクションの作成
定義されたスキーマとインデックスを使用して、新しいコレクションを作成します。この例では、Demo という名前のコレクションを作成します。
# Create collection named "demo"
client.create_collection(
collection_name='demo',
schema=schema,
index_params=index_params
)
5.データの挿入
Milvusに直接生データを挿入することができます - 埋め込みを手動で生成する必要はありません。
# Insert sample documents
client.insert('demo', [
{'id': 1, 'document': 'Milvus simplifies semantic search through embeddings.'},
{'id': 2, 'document': 'Vector embeddings convert text into searchable numeric data.'},
{'id': 3, 'document': 'Semantic search helps users find relevant information quickly.'},
])
6.ベクトル検索の実行
データを挿入した後、生のテキストクエリを使って直接検索を実行することができます。Milvusは自動的にクエリを埋め込みに変換し、保存されているベクトルとの類似性検索を行い、上位のマッチを返します。
# Perform semantic search
results = client.search(
collection_name='demo',
data=['How does Milvus handle semantic search?'], # Use text query rather than query vector
anns_field='dense', # Use the vector field that stores embeddings
limit=1,
output_fields=['document'],
)
print(results)
# Example output:
# data: ["[{'id': 1, 'distance': 0.8821347951889038, 'entity': {'document': 'Milvus simplifies semantic search through embeddings.'}}]"]
ベクトル検索の詳細については基本的なベクトル検索と クエリAPI.
Milvus 2.6を使い始める
Milvus2.6は、データイン、データアウトにより、ベクトル検索をよりシンプルなものにしました。Milvusにエンベッディングとリランキング機能を直接統合することで、外部の前処理を管理したり、エンベッディングサービスを別途維持する必要がなくなります。
試す準備はできましたか?今すぐMilvus2.6をインストールし、Data-in, Data-outの威力を体験してください。
ご質問や機能の詳細については、Discordチャンネルにご参加ください。私たちの Discordチャンネルに参加するか、 GitHubに課題を提出してください。また、 Milvusオフィスアワーで20分間の1対1のセッションを予約し、洞察、ガイダンス、質問への回答を得ることもできます。
Milvus 2.6の機能についてもっと知る
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word



