向量量化(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等技術,可在速度、精度和成本間取得理想平衡。