IVF_RABITQCompatible with Milvus 2.6.x
IVF_RABITQ索引是一種基於二進位量化的索引演算法,可將 FP32 向量量化為二進位表示。此索引提供卓越的儲存效率,其壓縮率為 1 比 32,同時保持相對良好的召回率。它支援可選的精煉功能,以額外的儲存空間為代價,達到更高的召回率,因此在記憶體受限的情況下,它是IVF_SQ8和IVF_FLAT的多功能替代品。
概述
IVF_RABITQ是Inverted File with RaBitQ quantization 的縮寫,結合了兩種強大的技術,以達到有效率的向量搜尋與儲存。
IVF
Inverted File (IVF)使用k-means 聚類將向量空間組織成可管理的區域。每個簇由一個中心點代表,作為該簇內向量的參考點。這種聚類方法允許演算法在查詢處理過程中只專注於最相關的聚類,從而縮小了搜尋空間。
要瞭解有關 IVF 技術細節的更多資訊,請參閱IVF_FLAT。
RaBitQ
RaBitQ是一種具有理論保證的最先進的二進位量化方法,在高健陽和龍成的研究論文「RaBitQ: Quantizing High-Dimensional Vectors with a Theoretical Error Bound for Approximate Nearest Neighbor Search」中提出。
RaBitQ 引入了多個創新概念:
角度資訊編碼:與傳統的空間編碼不同,RaBitQ 透過向量規範化來編碼角度資訊。在 IVF_RABITQ 中,資料向量會針對其最接近的 IVF 中心點進行規範化,以提高量化過程的精確度。
理論基礎:核心距離近似公式為
其中:
- o是資料集中的資料向量
- q是查詢向量
- c是o的最近 IVF 中心向量
- C, ) 和C , )是預先計算的常量。
- oq代表點-積運算。
計算效率: AVX-512 VPOPCNTDQ 指令的現代 CPU 架構。
演算法強化:RaBitQ 可有效整合FastScan 方法和隨機旋轉等既有技術,以提升效能。
IVF + RaBitQ
IVF_RABITQ索引結合了 IVF 的高效聚類與 RaBitQ 先進的二進位量化:
粗過濾(Coarse Filtering):IVF 將向量空間劃分為叢集,透過集中於最相關的叢集區域,大幅縮小搜尋範圍。
二進位量化:在每個簇內,RaBitQ 將向量壓縮成二元表示法,同時透過理論保證保留基本的距離關係。
可選精煉:啟用時,索引會使用更高精度的格式 (SQ6、SQ8、FP16、BF16 或 FP32) 儲存額外的精煉資料,以增加儲存空間的代價來提高召回率。
Milvus 使用下列 FAISS 工廠字串實作 IVF_RABITQ:
- 有精煉:
"RR({dim}),IVF{nlist},RaBitQ,Refine({refine_index})" - 無精煉
"RR({dim}),IVF{nlist},RaBitQ"
建立索引
要在 Milvus 中的向量場上建立IVF_RABITQ 索引,請使用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="IVF_RABITQ", # 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={
"nlist": 1024, # Number of clusters for the index
"refine": True, # Enable refinement for higher recall
"refine_type": "SQ8" # Refinement data format
} # Index building params
)
在此設定中
index_type:要建立的索引類型。在本範例中,設定值為IVF_RABITQ。metric_type:用來計算向量間距離的方法。支援的值包括COSINE,L2, 和IP。如需詳細資訊,請參閱公制類型。params:建立索引的附加設定選項。詳情請參閱索引建立參數。
索引參數配置完成後,您可以直接使用create_index() 方法或在create_collection 方法中傳入索引參數來建立索引。如需詳細資訊,請參閱建立集合。
在索引上搜尋
索引建立且實體插入後,您就可以在索引上執行相似性搜尋。
search_params = {
"params": {
"nprobe": 128, # Number of clusters to search
"rbq_query_bits": 0, # Query vector quantization bits
"refine_k": 1 # Refinement 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:在索引上搜索的附加配置选项。詳情請參閱特定於索引的搜尋參數。
IVF_RABITQ 索引嚴重依賴popcount 硬體指令以獲得最佳效能。現代的 CPU 架構,如 Intel IceLake+ 或 AMD Zen 4+ 搭配AVX512VPOPCNTDQ 指令集,可大幅改善 RaBitQ 作業的效能。
索引參數
本節概述用於建立索引和在索引上執行搜尋的參數。
索引建立參數
下表列出了建立索引時可在params 中設定的參數。
參數 |
說明 |
值範圍 |
調整建議 |
|
|---|---|---|---|---|
IVF |
|
在建立索引時使用 k-means 演算法建立的叢集數目。每個簇由中心點代表,儲存向量清單。增加此參數可減少每個叢集中的向量數量,建立更小、更集中的分割。 |
類型:整數 |
較大的 |
RaBitQ |
|
啟用精煉程序並儲存精煉資料。 |
類型:布林 |
如果需要 0.9+ 的召回率,請設定為 |
|
定義 |
類型:字串 |
列出的值依召回率增加、QPS 減少、儲存大小增加的順序顯示。 |
特定於索引的搜尋參數
下表列出在索引上搜尋時,可在search_params.params 中設定的參數。
參數 |
說明 |
值範圍 |
調整建議 |
|
|---|---|---|---|---|
IVF |
|
搜尋候選人的叢集數量。較高的值允許搜尋更多的叢集,藉由擴大搜尋範圍來改善召回率,但代價是增加查詢延遲。 |
類型:整數 |
增加此值可提高召回率,但可能會減慢搜尋速度。設定 |
RaBitQ |
|
設定是否應用查詢向量的額外標量量化。如果設定為 |
類型:整數 |
|
|
精煉程序使用更高的量化品質,從 |
類型:浮點數 |
|