製品量子化 (PQ) は、ベクター検索で使用される高次元ベクター埋め込みを大幅に圧縮する Azure DocumentDB の強力な手法です。 この圧縮により、メモリ使用量が削減され、最も近い近隣の検索が高速化され、大規模なベクター データセットの効率が向上します。 PQ は速度とスケールの利点を提供しますが、精度を犠牲にして提供される場合があります。
メリット
- ストレージの削減: PQ を使用すると、ベクター インデックスに必要なストレージが完全精度 (float32) ベクトルと比較して大幅に削減され、大規模なデータセットのコストが大幅に削減されます。
- 高速検索: 圧縮ベクトルを使用すると、システムは距離を計算し、全精度ベクトルよりもはるかに迅速に潜在的な最も近い近傍を見つけることができます。
- スケーラビリティの向上: メモリオーバーヘッドが小さいので、ベクター検索のスケーリングによって、クラスター内のより大きく、より高次元の埋め込みを処理できます。
動作方法
積量子化は、高次元ベクトル空間を複数の低次元部分空間に分割します。 その後、各サブスペースは、クラスタリング アルゴリズム (通常は k 平均) を使用して個別に量子化されます。 各クラスターの中心は、その中のすべてのベクトルを表します。 その後、各元のベクターは、各サブスペースに属するクラスター ID の短いコードによって表されます。
製品量子化の使用
Product 量子化を使用してベクトル インデックスを作成するには、createIndexesとcosmosSearchOptionsを指定"compression": "pq""kind" : "vector-diskann" コマンドを使用します。
{
"createIndexes": "<collection_name>",
"indexes": [
{
"name": "<index_name>",
"key": {
"<path_to_property>": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-diskann",
"similarity": "<string_value>", // "COS", "L2"
"dimensions": <integer_value>, // Max 16,000
"compression": "pq",
"pqCompressedDims": <integer_value>, // Dimensions after compression (< original)
"pqSampleSize": <integer_value> // Samples for centroid generation
}
}
]
}
| フィールド | タイプ | Description |
|---|---|---|
compression |
文字列 | 製品量子化を有効にするには、 "pq" に設定します。 |
pqCompressedDims |
整数 | PQ 圧縮後のディメンション (元のディメンションより小さくする必要があります)。 省略すると自動的に計算されます。 範囲: 1 から 8000。 |
pqSampleSize |
整数 | PQ 重心トレーニングのサンプル ベクターの数。 値が大きいほど、品質は向上しますが、ビルド時間は長くなります。 既定値: 1000。 範囲: 1000 から 100000。 |
注
現在、製品量子化は、 vector-diskann インデックスの種類でのみサポートされています。
注
最良の結果を得るには、コレクションにデータが格納された後に PQ インデックスを作成します。 コレクションが空の場合、システムは初期重心にランダム ベクターを使用します。 ドキュメントの数が pqSampleSize未満の場合、トレーニング データには、既存のベクター データの範囲内のランダム なデータが埋め込まれます。
圧縮ディメンションの設定方法
pqCompressedDimsを指定しない場合、元のベクター dimensionsに基づいて自動的に決定されます。
| 元の寸法範囲 | pqCompressedDims |
|---|---|
| [0 - 32) | ディメンション/2 |
| [32 - 64) | 16 |
| [64 - 128) | 32 |
| [128 - 512) | 64 |
| [512 - 1536) | 96 |
| 1536 より上 | 128 |
PQ インデックスを作成する
db.runCommand(
{
"createIndexes": "your_vector_collection",
"indexes": [
{
"key": { "v": "cosmosSearch" },
"name": "diskann_pq_index",
"cosmosSearchOptions": {
"kind": "vector-diskann",
"similarity": "COS",
"dimensions": 1536,
"compression": "pq",
"pqCompressedDims": 96,
"pqSampleSize": 2000
}
}
]
} )
オーバーサンプリングによる検索の改善
PQ 圧縮により、距離計算の精度が低下する可能性があります。 これを減らすために、Azure DocumentDB では、oversampling 演算子に $search パラメーターが用意されています。
oversampling係数 (最小 1 の float) は、圧縮インデックスから取得する候補ベクトルの数を、k (目的の結果の数) よりも多く指定します。 これらの追加候補は、元の完全精度ベクトルを使用して検索を絞り込むために使用され、最終的なトップ k 精度が向上します。 たとえば、上位 10 個 (k=10) の最も似たベクトルを取得するには、oversampling などの値に設定することをお勧めします。
"oversampling": 1.5では、システムは最初にインデックスから 15 個の候補を取得し、次に全精度データを使用して上位 10 個を絞り込みます。
{
"$search": {
"cosmosSearch": {
"vector": <vector_to_search>,
"path": "<path_to_property>",
"k": <num_results_to_return>,
"oversampling": <float_value>
},
}
}
このコード スニペットは、product 量子化で $search 演算子を使用したベクター検索を示しています。 入力として queryVector を受け取り、 v フィールドを検索します。 このクエリでは、2.0 のk: 10係数を使用して、上位 10 個の最も類似したドキュメント (oversampling) を要求します。20 個の候補が取得され、圧縮されたインデックスに対する検索の精度が向上します。
db.your_vector_collection.aggregate([
{
$search: {
"cosmosSearch": {
"vector": [0.1, 0.5, 0.9, ...],
"path": "v",
"k": 10,
"oversampling": 2.0 // Retrieve 2 * 10 = 20 candidates for reranking
},
"returnStoredSource": true
}
}
])
Half-Precision と製品の量子化
Azure DocumentDB では 、半精度 量子化と製品量子化 (PQ) の両方でベクター インデックスが圧縮されますが、圧縮の実現方法と検索への影響は異なります。
| 特徴 | 半精度 | 製品量子化 (PQ) |
|---|---|---|
| 圧縮方法 | 各ベクター次元を 16 ビットに減らします。 | ベクトル空間をサブスペースに分割し、それぞれを量子化します。 |
| 最大寸法 | 最大 4,000 | 最大 16,000 |
| 精度の変更 | ビット深度が低いため、わずかな損失が発生します。 | 損失が大きくなる可能性があります。 pqCompressedDimsを介して構成できます。 |
| 検索速度 | インデックスが小さいため、速度が中程度に増加します。 | 高度に圧縮されたベクトルによる大幅な速度増加。 |
| インデックスのビルド時間 | 比較的高速です。 | 重心トレーニング (pqSampleSize) が原因で長くなる可能性があります。 |
| インデックスのサポート | HNSW、IVF。 | DiskANN。 |
| Configuration | 簡単にcompression: "half"を有効にします。 |
その他のパラメーター: pqCompressedDims、 pqSampleSize。 |
| オーバーサンプリングの使用 | 小さな精度の損失に役立ちます。 | より大きな圧縮から精度を回復するために不可欠です。 |
| 理想的なユース ケース | 中程度のメモリ削減、次元の増加、許容可能な精度のトレードオフ。 | 大規模なデータセット、高次元、高速検索の優先順位付け、オーバーサンプリングによる精度の管理。 |
製品量子化に関する考慮事項
-
精度と圧縮: PQ 圧縮が大きいほど、インデックスが小さくなり、検索が高速になりますが、精度が低下します。
pqCompressedDimsとoversamplingを試して、適切なバランスを見つけます。 -
インデックスのビルド時間: PQ インデックスの作成には、重心トレーニング プロセスが原因で、
pqSampleSizeの影響を受けて時間がかかる場合があります。 - データ分散: PQ は、ベクター データに明確なクラスター構造がある場合に最適です。