HNSW_SQ
HNSW_SQ結合了 Hierarchical Navigable Small World (HNSW) 圖形與 Scalar Quantization (SQ),創造了一種先進的向量索引方法,提供可控制的大小與精確度權衡。與標準HNSW 相比,此索引類型在索引建置時間略有增加的同時,仍能維持較高的查詢處理速度。
概觀
HNSW_SQ 結合了兩種索引技術:HNSW用於基於圖表的快速導覽,而SQ則用於有效率的向量壓縮。
HNSW
HNSW 會建構一個多層圖表,其中每個節點對應資料集中的向量。在這個圖形中,節點是根據其相似性連接起來的,因此可以快速遍歷資料空間。層級結構可讓搜尋演算法縮小候選鄰近點的範圍,大幅加速高維空間的搜尋過程。
如需詳細資訊,請參閱HNSW。
SQ
SQ 是一種壓縮向量的方法,用較少的位元來表示向量。舉例來說:
SQ8使用 8 位元,將值映射成 256 層。 如需詳細資訊,請參閱IVF_SQ8。
SQ6使用 6 位元來表示每個浮點值,因此有 64 個離散的層級。
Hnsw Sq
這種精確度的降低大幅減少了記憶體佔用量,並加快了計算速度,同時保留了資料的基本結構。
SQ4UCompatible with Milvus 2.6.8+
針對要求極高查詢速度和最小記憶體使用量的情況,Milvus 推出SQ4U, 4 位元統一標量量化。這是一種進取的標量量化形式,可將每個維度的浮點值壓縮為4 位元無符號整數。
SQ4U 中的 "U" 代表 Uniform。非統一標量量化通常會獨立計算每個維度的最小值和最大值(Per-Dimension Quantization),與此不同,SQ4U 強制執行全局統一量化策略:
全局統計:系統計算單一最小值
vmin和單一值範圍vdiff,適用於向量的所有維度(或整個向量段)。統一映射:全域值範圍分為 16 個相等的區間。向量中的每個浮點值,不論其屬於哪個維度,都會使用這些共用參數映射為 4 位元整數 (0-15)。
效能優勢:
8 倍壓縮比:與
FP32相比,可縮小 8 倍,與SQ8相比,可縮小 2 倍,大幅降低記憶體頻寬壓力 - 這通常是向量搜尋的瓶頸。SIMD 最佳化:精簡的結構允許現代 CPU (AVX2/AVX-512) 在每個週期處理更多維度。最重要的是,全局參數的使用消除了在計算距離期間載入不同標度/偏移值的需要,使指令流水線保持完全飽和。
快取記憶體效率:較小的向量尺寸意味著 CPU 快取記憶體可容納更多資料,減少存取記憶體所造成的延遲。
由於全局參數共享,SQ4U 在規範化資料或各維值分佈一致的資料集上表現最佳。
HNSW + SQ
HNSW_SQ 結合了 HNSW 和 SQ 的優點,以實現高效的近似近鄰搜尋。以下是這個過程的運作方式:
資料壓縮:SQ 會使用
sq_type(例如 SQ6 或 SQ8) 來壓縮向量,以減少記憶體使用量。這種壓縮可能會降低精確度,但卻能讓系統處理更大的資料集。圖形建構:壓縮向量用於建立 HNSW 圖形。由於資料已壓縮,因此產生的圖形較小,搜尋速度也較快。
候選檢索:當提供查詢向量時,演算法會使用壓縮資料,從 HNSW 圖中快速找出候選鄰居。
(可選)結果精進:初始候選結果可以根據下列參數進行精煉,以獲得更高的精確度:
refine:控制是否啟動此精煉步驟。當設定為true時,系統會使用更高精度或未壓縮的表示來重新計算距離。refine_type:指定精煉過程中使用的資料精確度等級(例如 SQ6、SQ8、BF16)。更高精度的選擇,例如FP32,可以產生更精確的結果,但需要更多的記憶體。這必須比原始壓縮資料集的精確度高出sq_type。refine_k:作為放大係數。舉例來說,如果您的 topk是 100,而refine_k是 2,系統會重新排序前 200 名候選人,並傳回最佳的 100 名,以提高整體精確度。
如需參數及有效值的完整清單,請參閱索引參數。
建立索引
要在 Milvus 的向量場上建立HNSW_SQ 索引,請使用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_SQ", # 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": 64, # Maximum number of neighbors each node can connect to in the graph
"efConstruction": 100, # Number of candidate neighbors considered for connection during index construction
"sq_type": "SQ6", # Scalar quantizer type
"refine": true, # Whether to enable the refinement step
"refine_type": "SQ8" # Precision level of data used for refinement
} # Index building params
)
在此設定中
index_type:要建立的索引類型。在本範例中,設定值為HNSW_SQ。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]. |
|
SQ |
|
指定壓縮向量的標量量化方法。每個選項都在壓縮和精確度之間提供不同的平衡:
|
類型:字串 範圍:[ 預設值: |
|
|
一個布林標誌,用來控制是否在搜尋過程中應用精煉步驟。精煉包括透過計算查詢向量與候選項之間的精確距離,重新排列初始結果。 |
類型:布林 範圍:[ 預設值: |
如果高準確度是必要的,而且您可以容忍稍慢的搜尋時間,請設定為 |
|
|
決定用於精煉的資料精確度。 此精確度必須高於壓縮向量的精確度 (由 |
類型:字串 範圍:[ 預設值:無 |
使用 |
特定於索引的搜尋參數
下表列出在索引上搜尋時,可在search_params.params 中設定的參數。
參數 |
說明 |
值範圍 |
調整建議 |
|
|---|---|---|---|---|
HNSW |
|
控制最近鄰檢索時的搜尋範圍。它決定要造訪多少節點,並將其評估為潛在最近鄰居。 此參數只會影響搜尋過程,並只適用於圖形的底層。 |
類型:整數 範圍:[1、int_max] 預設值:limit(要回傳的 TopK 最近鄰居) |
較大的 當達到高召回率是關鍵,而搜尋速度較不重要時,請考慮增加 考慮降低 在大多數情況下,我們建議您設定此範圍內的值:[K, 10K]。 |
SQ |
|
放大係數,用來控制在精細化階段中,相對於要求的前 K 個結果,有多少額外的候選人會被檢驗。 |
類型:浮動 範圍:[1,float_max) 預設值: 1 |
|