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

密ベクトル

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

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

概要​

密ベクトルは通常、[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
]

密ベクトルは、画像向けの CNN モデル(ResNet、VGG など)やテキスト向けの言語モデル(BERT、Word2Vec など)を含む、さまざまな embedding モデルを使用して生成できます。これらのモデルは、生データを高次元空間内の点に変換し、データのセマンティックな特徴を捉えます。また、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"
)

上記の例では、AUTOINDEX インデックスタイプを使用して、dense_vector フィールドに dense_vector_index という名前のインデックスを作成します。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'}}]"]

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