メインコンテンツまでスキップ

密ベクトル

密ベクトルは、機械学習やデータ分析で広く使用される数値データ表現です。実数の配列で構成され、そのほとんどまたはすべての要素がゼロではありません。スパースベクトルと比較して、密ベクトルは同じ次元レベルでより多くの情報を含みます。これは、各次元が意味のある値を保持しているためです。この表現は、複雑なパターンや関係性を効果的に捉えることができ、高次元空間でのデータの分析や処理を容易にします。密ベクトルは通常、固定された次元数を持ち、その数は特定のアプリケーションや要件に応じて、数十から数百、場合によっては数千に及びます。

密ベクトルは主に、セマンティック検索やレコメンデーションシステムなど、データの意味を理解する必要があるシナリオで使用されます。セマンティック検索では、密ベクトルはクエリとドキュメントの間にある根本的なつながりを捉えるのに役立ち、検索結果の関連性を向上させます。レコメンデーションシステムでは、ユーザーとアイテムの間の類似性を特定するのに役立ち、よりパーソナライズされた提案を提供します。

概要​

密ベクトルは通常、[0.2, 0.7, 0.1, 0.8, 0.3, ..., 0.5] のような固定長の浮動小数点数配列として表されます。これらのベクトルの次元数は通常、128、256、768、1024 のように数百から数千の範囲です。各次元はオブジェクトの特定の意味的特徴を捉えており、類似度計算を通じてさまざまなシナリオに適用できます。

QOgMwbrhLhvvtbbk5TxcarhEn8i

上の図は、2D 空間における密ベクトルの表現を示しています。実際のアプリケーションにおける密ベクトルは多くの場合はるかに高次元ですが、この 2D の図解はいくつかの重要な概念を効果的に伝えています。

  • 多次元表現: 各点は概念的なオブジェクト(Milvus、ベクトルデータベース、検索システム など)を表し、その位置は各次元の値によって決まります。

  • 意味的関係: 点同士の距離は、概念間の意味的な類似性を反映しています。点が近いほど、概念同士の意味的な関連性が高いことを示します。

  • クラスタリング効果: 関連する概念(Milvus、ベクトルデータベース、検索システム)は空間内で互いに近くに配置され、意味的なクラスターを形成します。

以下は、"Milvus is an efficient vector database" というテキストを表す実際の密ベクトルの例です。

json
[
-0.013052909,
0.020387933,
-0.007869,
-0.11111383,
-0.030188112,
-0.0053388323,
0.0010654867,
0.072027855,
// ... more dimensions
]

密ベクトルは、さまざまな embedding モデルを使用して生成できます。たとえば、画像向けの CNN モデル(ResNet、VGG)や、テキスト向けの言語モデル(BERT、Word2Vec)などがあります。これらのモデルは、生データを高次元空間内の点に変換し、データの意味的特徴を捉えます。さらに、Zilliz Cloud は、ユーザーが密ベクトルを生成および処理するのに役立つ便利な方法を提供しています。詳細は Embeddings で説明しています。

データがベクトル化されると、管理とベクトル検索のために Zilliz Cloud クラスターに保存できます。以下の図は、その基本的な流れを示しています。

No8KwR6wPhTIP6bKEqGcbBDWngc

Notes

密ベクトルに加えて、Zilliz Cloud はスパースベクトルとバイナリベクトルもサポートしています。スパースベクトルは、キーワード検索や用語一致など、特定の用語に基づく正確な一致に適しています。一方、バイナリベクトルは、画像パターンマッチングや特定のハッシュアプリケーションなど、二値化されたデータを効率的に処理するためによく使用されます。詳細は バイナリベクトル および スパースベクトル を参照してください。

密ベクトルを使用する​

ベクトルフィールドを追加する​

Zilliz Cloud クラスターで密ベクトルを使用するには、まずコレクション作成時に密ベクトルを保存するためのベクトルフィールドを定義します。このプロセスには以下が含まれます。

  1. datatype を、サポートされている密ベクトルのデータ型に設定します。サポートされている密ベクトルのデータ型については、Data Types を参照してください。

  2. dim パラメータを使用して、密ベクトルの次元数を指定します。

以下の例では、密ベクトルを保存するために dense_vector という名前のベクトルフィールドを追加します。このフィールドのデータ型は FLOAT_VECTOR、次元数は 4 です。

python
from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")

schema = client.create_schema(
auto_id=True,
enable_dynamic_fields=True,
)

schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)
schema.add_field(field_name="dense_vector", datatype=DataType.FLOAT_VECTOR, dim=4)

密ベクトルフィールドでサポートされているデータ型:

データ型説明
FLOAT_VECTOR32 ビットの浮動小数点数を格納します。科学計算や機械学習で実数を表現するためによく使用され、類似したベクトルを区別するなど、高い精度が求められるシナリオに最適です。
FLOAT16_VECTOR16 ビットの半精度浮動小数点数を格納し、深層学習や GPU 計算で使用されます。レコメンデーションシステムの低精度リコール段階など、精度がそれほど重要でないシナリオでストレージスペースを節約します。
BFLOAT16_VECTOR16 ビットの Brain Floating Point(bfloat16)数値を格納し、Float32 と同じ指数範囲を持ちながら精度が低くなります。大規模な画像検索など、大量のベクトルを高速に処理する必要があるシナリオに適しています。
INT8_VECTOR各次元の個々の要素が 8 ビット整数(int8)であるベクトルを格納し、各要素の範囲は –128 から 127 です。量子化された深層学習モデル(ResNet、EfficientNet など)向けに設計されており、INT8_VECTOR は精度の低下を最小限に抑えながらモデルサイズを削減し、推論を高速化します。

ベクトルフィールドのインデックスパラメーターを設定する​

セマンティック検索を高速化するには、ベクトルフィールドにインデックスを作成する必要があります。インデックスを作成すると、大規模なベクトルデータの検索効率を大幅に向上できます。

python
index_params = client.prepare_index_params()

index_params.add_index(
field_name="dense_vector",
index_name="dense_vector_index",
index_type="AUTOINDEX",
metric_type="IP"
)

上記の例では、dense_vector_index という名前のインデックスが、dense_vector フィールドに AUTOINDEX インデックスタイプを使用して作成されます。metric_type は IP に設定されており、距離メトリクスとして内積が使用されることを示します。

Zilliz Cloud は他のメトリクスタイプもサポートしています。詳細については、メトリクスタイプ を参照してください。

コレクションの作成​

密ベクトルとインデックスパラメーターの設定が完了したら、密ベクトルを含むコレクションを作成できます。以下の例では、create_collection メソッドを使用して、my_collection という名前のコレクションを作成します。

python
client.create_collection(
collection_name="my_collection",
schema=schema,
index_params=index_params
)

データの挿入​

コレクションを作成したら、insert メソッドを使用して密ベクトルを含むデータを追加します。挿入する密ベクトルの次元数が、密ベクトルフィールドを追加するときに定義した dim の値と一致していることを確認してください。

python
data = [
{"dense_vector": [0.1, 0.2, 0.3, 0.7]},
{"dense_vector": [0.2, 0.3, 0.4, 0.8]},
]

client.insert(
collection_name="my_collection",
data=data
)

密ベクトルに基づくセマンティック検索は、Zilliz Cloud クラスターの中核的な機能の 1 つであり、ベクトル間の距離に基づいて、クエリベクトルに最も類似したデータをすばやく見つけることができます。類似検索を実行するには、クエリベクトルと検索パラメーターを準備し、search メソッドを呼び出します。

python
search_params = {
"params": {"nprobe": 10}
}

query_vector = [0.1, 0.2, 0.3, 0.7]

res = client.search(
collection_name="my_collection",
data=[query_vector],
anns_field="dense_vector",
search_params=search_params,
limit=5,
output_fields=["pk"]
)

print(res)

# Output
# data: ["[{'id': '453718927992172271', 'distance': 0.7599999904632568, 'entity': {'pk': '453718927992172271'}}, {'id': '453718927992172270', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172270'}}]"]

類似検索パラメーターの詳細については、基本 ANN 検索 を参照してください。