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

密ベクトル

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

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

概要​

密ベクトルは通常、[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 など)があります。これらのモデルは生データを高次元空間内の点に変換し、データの意味的特徴を捉えます。さらに、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 フィールドに対して AUTOINDEX インデックスタイプを使用して、dense_vector_index という名前のインデックスを作成しています。metric_type は IP に設定されており、距離メトリックとして内積が使用されることを示しています。

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

コレクションを作成する​

密ベクトルとインデックスパラメータの設定が完了したら、密ベクトルを含むコレクションを作成できます。以下の例では、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 検索 を参照してください。