相同資料、相同查詢——但採用不同的搜尋策略。拖曳查詢點、調整 nprobe,然後按下「執行搜尋」以觀察「IVF 」如何跳過大部分資料。
nprobe 」聚類:這些聚類會亮起。其餘所有聚類將完全跳過。權衡:nprobe → 掃描更多聚類 → 召回率更高但速度較慢。較小 nprobe → 速度較快,但可能會遺漏位於未掃描聚類中的真實鄰居。試著將 nprobe = 1 並將查詢拖曳至叢集邊界附近,觀察召回率如何下降。
IVF (倒排檔)是一種基於聚類的近似最近鄰索引。在建置階段,k-means 會將所有向量劃分為 nlist 簇,每個簇由其聚類中心代表。在查詢時,搜尋會先將查詢向量僅與聚類中心進行比對,挑選最接近的 nprobe 聚類,並僅掃描其中所含的向量——跳過其餘所有內容。
Milvus 提供數種IVF 變體,這些變體以記憶體為代價來換取精確度: IVF_FLAT 儲存原始向量(最精確), IVF_SQ8 將每個維度壓縮為一個位元組(記憶體用量減少約 4 倍,回憶率略有犧牲),以及 IVF_PQ 應用乘積量化以實現更高的壓縮率,但會付出更大的召回率代價。
nlist (建構時間):k-means 聚類的數量。常見的起始值為 N 個向量時設定為4 × sqrt(N) 。聚類數量越多,每個聚類的規模就越小——掃描速度雖會加快,但質心掃描的計算成本會增加,且邊界效應也會隨之增強。nprobe (查詢時間):每次查詢需掃描的叢集數量。這是控制召回率與延遲的主要參數——正是上方滑桿所控制的內容。建議從 nlist / 16 開始,並逐步增加,直到召回率達到您的目標為止。IVF 建置速度快、在向量之外的記憶體開銷小,且易於理解——但在相同的召回率目標下,HNSW 通常能在記憶體中更快地回應查詢。當您經常重建索引(建置速度至關重要)、記憶體受限(IVF_SQ8/IVF_PQ ),或希望獲得可預測且可調校的掃描行為時,請選擇IVF 。 若要獲得最低的記憶體內查詢延遲,請選擇HNSW ;當向量完全無法容納於RAM 時,則請選擇DiskANN 。
這三者皆以相同方式對向量進行聚類;其差異在於向量在聚類內的儲存方式。「IVF_FLAT 」保留原始浮點向量(回溯率最佳)。「IVF_SQ8 」將每個維度量化為 8 位元,在回溯率略有損失的情況下,將記憶體使用量減少約 4 倍。「IVF_PQ 」則以短的乘積量化碼取代向量,以達到最高壓縮率,但回溯率損失最大。
一個常見的經驗法則為:當向量數為 N 時,nlist = 4 × sqrt(N),接著在查詢時調整nprobe 。較大的nprobe 會掃描更多聚類:召回率越高,延遲也越高。建議從nlist/16 開始,並逐步增加,直到保留查詢集的召回率達到您的目標為止。
這是由於叢集邊界所致。若查詢點位於叢集邊緣附近,其部分真實鄰居可能位於相鄰的叢集中,而該叢集並未包含在掃描的nprobe 叢集之中。您可在視覺化中拖曳查詢點至邊界附近(nprobe =1),即可觀察到此現象。
在相同召回率下,HNSW 通常在記憶體內搜尋時速度較快,但會佔用更多記憶體且建構速度較慢。IVF 建構速度快,且在記憶體不足時能與量化技術(SQ8/PQ )良好搭配。對於完全超出RAM 限制的資料集,請改考慮使用DiskANN 。
深入了解:請參閱IVF_FLAT 文件以了解索引參數,或參閱《索引詳解》以獲取完整的決策指南。