向量量化(Vector Quantization)是一種數據壓縮技術,旨在減小高維向量的存儲空間,同時儘可能保留重要信息。在處理由OpenAI等嵌入模型生成的1536維向量時,單個向量需6KB內存;100萬個向量則需約6GB。隨着數據集增長至數百萬向量,內存和計算需求急劇增加。向量量化通過壓縮向量尺寸,有效降低內存佔用並加速搜索操作。
HNSW索引的挑戰
HNSW(分層可導航小世界)索引通過分層圖結構連接每個向量到其最近鄰。插入新向量時,系統需確定其在圖中的位置,類似搜索過程。這導致隨機讀取和順序遍歷的高成本,尤其在高維向量數量龐大時更為顯著。量化通過壓縮向量,使得這些操作更加高效。
標量量化(Scalar Quantization)
在Qdrant中,每個維度默認用float32表示(4字節)。標量量化將向量值映射到int8範圍(1字節,表示256個值),實現75%的內存縮減。例如,[-1.0,1.0]範圍內的值被線性映射到int8的[-128,127]。配置時需在創建集合時添加quantization_config,其中quantile參數(如0.99)排除最極端的1%值,以平衡精度。標量量化在提升速度和壓縮的同時,精度損失最小,適合大多數應用。
二進制量化(Binary Quantization)
二進制量化將向量轉換為二進制表示(0或1),值大於零為1,否則為0。對於1536維向量,內存從6KB降至192字節,實現32倍壓縮,且搜索速度可提升40倍。Qdrant自動在索引過程中執行二進制量化。此方法依賴優化的CPU指令(如XOR和Popcount)進行快速距離計算。兼容模型包括OpenAI text-embedding-ada-002和Cohere embed-english-v2.0,建議至少1024維以獲得良好精度。雖然速度極快,但精度和模型兼容性需通過過採樣和重打分技術來維持。
乘積量化(Product Quantization)
乘積量化通過將高維向量拆分為子向量,併為每個子向量建立碼本(codebook)實現壓縮。碼本中的中心點通過K-means聚類(K=256)確定。1024維向量原佔4096字節,經乘積量化後僅需128字節(128個索引,每個1字節),壓縮比最高可達64倍。配置時需指定壓縮率(如x32)。需注意,高壓縮比可能導致精度下降,適合內存優先且精度容忍的應用。
重打分、過採樣與重排序
為彌補量化帶來的精度損失,Qdrant支持過採樣和重打分。首先使用量化向量進行初始搜索,通過過採樣(如限制為4時,採樣因子2則檢索8個候選)擴大候選集。然後利用原始向量對候選集重打分,計算更精確的相似度。最後重排序確定最終top-K結果。這些技術可在保持速度的同時提升準確性。
磁盤與內存的資源分配
默認情況下,原始向量和量化向量均存儲在RAM中。為節省內存,可將原始向量移動至磁盤(on_disk=True),僅將量化向量保留在RAM。例如,配置binary quantizer並設置original vectors on_disk後,RAM僅存儲量化向量,大幅降低成本。注意,需顯式設置on_disk=True才能獲得RAM節省。
使用io_uring加速重打分
在Linux系統上,io_uring技術允許並行處理多個磁盤操作,顯著降低I/O開銷,尤其在重打分階段需頻繁讀取原始向量時。Qdrant通過配置storage: async_scorer: true啓用io_uring。這能有效提升磁盤上大規模數據集的搜索性能。
性能對比與切換方法
Qdrant默認使用量化向量進行搜索。可通過設置ignore: true臨時禁用量化,比較結果差異。用户可隨時修改或移除量化配置,而不影響原始向量。例如,從標量量化切換為二進制量化,或完全禁用量化。
總結
三種量化方法各有優劣:二進制量化速度最快、最省內存,但需兼容模型;標量量化精度損失小,是安全的默認選擇;乘積量化壓縮比最高,但精度和索引速度稍遜。根據應用需求,結合過採樣、重打分和io_uring等技術,可在速度、精度和成本間取得理想平衡。