HNSW_PQ
HNSW_PQは、HNSW(Hierarchical Navigable Small World)グラフとPQ(Product Quantization)を活用し、サイズと精度のトレードオフを制御可能な高度なベクトルインデックス作成手法を実現する。HNSW_SQと比較して、このインデックスタイプは、クエリ処理速度の低下とインデックス構築時間の延長はあるものの、同じ圧縮レベルでより高い想起率を実現している。
概要
HNSW_PQは2つのインデックス作成技術を組み合わせたものである:HNSWはグラフベースの高速ナビゲーションを、PQは効率的なベクトル圧縮を実現する。
HNSW
HNSWは、各ノードがデータセット中のベクトルに対応する多層グラフを構築する。このグラフでは、ノードは類似性に基づいて接続され、データ空間を高速にトラバースできる。階層構造により、検索アルゴリズムは近傍候補を絞り込むことができ、高次元空間での検索プロセスが大幅に高速化される。
詳細はHNSWを参照。
PQ
PQはベクトル圧縮技術で、高次元ベクトルをより小さなサブベクトルに分解し、それを量子化して圧縮します。この圧縮により、メモリ要件が劇的に削減され、距離計算が高速化される。
詳細はIVF_PQを参照。
HNSW + PQ
HNSW_PQはHNSWとPQの長所を組み合わせ,効率的な近似最近傍探索を可能にする.PQを用いてデータを圧縮し(これによりメモリ使用量を削減する)、圧縮されたベクトル上にHNSWグラフを構築することで、候補の迅速な検索を可能にする。検索中、アルゴリズムは精度を向上させるために、オプションでより精度の高いデータを使用して候補結果を絞り込むことができます。以下はそのプロセスです:
データ圧縮:PQは各ベクトルを複数のサブ・ベクトルに分割し、
m(サブ・ベクトル数)やnbits(サブ・ベクトルあたりのビット数)などのパラメータで制御されたセントロイドのコードブックを使用して量子化する。グラフの構築:圧縮されたベクトルは、HNSWグラフの構築に使用される。ベクターは圧縮された形で保存されるため、結果として得られるグラフは一般的に小さくなり、必要なメモリ量も少なく、より高速に走査できるようになる。
候補の検索:クエリが実行されると、アルゴリズムはHNSWグラフの圧縮データを使用して、候補となる隣接候補のプールを効率的に特定する。このグラフベースの検索により、考慮すべきベクトル数が大幅に削減され、総当たり検索に比べてクエリの待ち時間が改善される。
(オプション)結果の絞り込み:最初の候補結果は、以下のパラメータに基づいて、より精度の高いものに改良することができます:
refine:この絞り込みステップを有効にするかどうかを制御します。trueに設定すると、システムはより高精度または非圧縮の表現を使用して距離を再計算します。refine_type:精密化時に使用するデータの精度レベルを指定します(SQ6、SQ8、BF16 など)。FP32のような高精度の選択は、より正確な結果をもたらしますが、より多くのメモリを必要とします。これは、元の圧縮データセットの精度をsq_typeだけ上回る必要があります。refine_k:倍率として機能する。例えば、トップkが100でrefine_kが2の場合、システムはトップ200の候補を再ランク付けし、ベスト100を返し、全体的な精度を向上させる。
パラメータの完全なリストと有効な値については、Index params を参照してください。
インデックスの構築
MilvusでベクトルフィールドにHNSW_PQ インデックスを構築するには、add_index() メソッドを使用し、index_type 、metric_type 、インデックス用の追加パラメータを指定します。
from pymilvus import MilvusClient
# Prepare index building params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="your_vector_field_name", # Name of the vector field to be indexed
index_type="HNSW_PQ", # Type of the index to create
index_name="vector_index", # Name of the index to create
metric_type="L2", # Metric type used to measure similarity
params={
"M": 30, # Maximum number of neighbors each node can connect to in the graph
"efConstruction": 360, # Number of candidate neighbors considered for connection during index construction
"m": 384,
"nbits": 8,
"refine": true, # Whether to enable the refinement step
"refine_type": "SQ8" # Precision level of data used for refinement
} # Index building params
)
この設定では
index_type:構築するインデックスのタイプ。この例ではHNSW_PQとします。metric_type:ベクトル間の距離の計算方法。サポートされている値には、COSINE、L2、IPがあります。詳細については、メトリック・タイプを参照してください。params:インデックスを構築するための追加設定オプション。詳細は「インデックス構築パラメータ」を参照。
インデックス・パラメータを構成したら、create_index() メソッドを直接使用するか、create_collection メソッドでインデックス・パラメータを渡してインデックスを作成できます。詳細は、コレクションの作成 を参照してください。
インデックスでの検索
インデックスが構築され、エンティティが挿入されると、インデックス上で類似検索を実行できます。
search_params = {
"params": {
"ef": 10, # Parameter controlling query time/accuracy trade-off
"refine_k": 1 # The magnification factor
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
anns_field="vector_field", # Vector field name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=3, # TopK results to return
search_params=search_params
)
この構成では
params:インデックスで検索するための追加構成オプション。詳細については、「インデックス固有の検索パラメータ」を参照してください。
インデックスパラメータ
このセクションでは、インデックスを構築し、インデックス上で検索を実行するために使用されるパラメータの概要を説明します。
インデックス構築パラメータ
以下の表に、params でインデックスを構築する際に設定できるパラメータを列挙します。
パラメータ |
説明 |
値の範囲 |
チューニングの提案 |
|
|---|---|---|---|---|
HNSW |
|
各ノードがグラフ内で持つことのできる接続(またはエッジ)の最大数。 このパラメータはインデックスの構築と検索の両方に直接影響する。 |
型:整数:[2, 2048] デフォルト値: |
メモリ使用量と検索速度が最大の関心事である場合は、 ほとんどの場合、この範囲内の値を設定することを推奨する:[5, 100]. |
|
インデックス構築時に接続を考慮する近隣候補の数。 より多くの候補が新しい要素ごとに評価されますが、 実際に確立される接続の最大数は |
型:整数:[1,int_max] です。 デフォルト値: |
より多くの接続候補が探索されるため、 リ ソ ース制約が懸念 さ れ る 場合には、 ほとんどの場合、この範囲内の値を設定することを推奨します:[50, 500]. |
|
PQ |
|
量子化処理中に各高次元ベクトルを分割する(量子化に使用する)サブベクトルの数。 |
タイプ:整数:[1, 65536] デフォルト値:なし |
ほとんどの場合、この範囲内の値を設定することをお勧めします:[D/8, D]。 |
|
各サブベクトルの重心インデックスを圧縮形式で表現するためのビット数。各コードブックは2nビットのセントロイドを含む。例えば、 |
タイプ整数:[1, 24] デフォルト値: |
|
|
|
検索時に絞り込みステップを適用するかどうかを制御するブーリアン・フラグ。refinementは、クエリベクタと候補の間の正確な距離を計算することにより、最初の結果を再ランク付けすることを含む。 |
タイプ:ブール値の範囲:[ デフォルト値: |
高精度が必須で、検索時間が多少遅くても許容できる場合は、 |
|
|
精緻化処理で使用するデータの精度を決定します。 この精度は、圧縮されたベクトル( |
型:StringRange:[ デフォルト値:なし |
より高いメモリコストで最大の精度を得るには |
インデックス固有の検索パラメータ
次の表は、インデックスを検索する際にsearch_params.params で設定可能なパラメータの一覧です。
パラメータ |
説明 |
値の範囲 |
チューニングの提案 |
|
|---|---|---|---|---|
HNSW |
|
最近傍検索時の検索の幅を制御します。どれだけのノードが最近傍候補として訪問され、評価されるかを決定します。 このパラメータは検索プロセスのみに影響し、グラフの最下層にのみ適用される。 |
タイプ整数Range:[1,int_max] デフォルト値:limit(TopK nearest neighbors to return) |
特に精度が多少低下しても構わないようなシナリオでは、 ほとんどの場合、この範囲内の値を設定することをお勧めします:[K, 10K]。 |
PQ |
|
要求された上位K個の結果に対して、絞り込み(再ランク付け)段階でどれだけの余分な候補を調べるかを制御する倍率。 |
タイプ:Float範囲:[1,float_max) デフォルト値: 1 |
|