← 返回

HNSW 探索器:可階層導航的小世界,視覺化呈現

觀察搜尋如何穿梭於分層圖中——從稀疏的頂層(高速公路)一路向下至密集的底層(地方道路)。拖曳第 0 層上的查詢點,並調整M / ef 來觀察圖形如何變化。

M4
每個節點的最大鄰居數
ef8
第 0 層候選向量池
速度450ms
每一步
當前步驟
14 / 14
搜尋完成。 Top-3: [3, 10, 4].

搜尋統計

已造訪
17 / 30
圖層
4
條目
節點 0
Top-3
[3, 10, 4]

層次分佈

L3
2
L2
2
L1
7
L0
30

HNSW 的運作方式

  1. 分層圖:每個節點皆透過指數分佈隨機分配一個最大層級。大多數節點僅存在於第 0 層;極少數能達到頂層。
  2. 在每個層級中:每個節點皆與其M 個最近鄰相連。較高層級呈稀疏狀態(節點少、邊長長=「高速公路」)。第 0 層則呈密集狀態(所有節點、邊長短=「地方道路」)。
  3. 搜尋從頂端開始:從固定起點出發,貪婪地向最接近查詢的鄰居移動,重複此過程直至不再有改善。
  4. 向下瀏覽一層並重複:前一層的位置將成為下一層遍歷的起點。每次向下瀏覽都會透過更細緻的邊來精煉結果。
  5. 第 0 層搭配「ef 」:在最底層,HNSW 不會在第一個局部極小值處停止,而是維持一個 ef 最佳候選向量,並擴展其鄰域。較大的 ef → 更精準但速度較慢。

為何如此快速:頂層運作方式如同「索引之上的索引」——您只需經過幾個跳躍即可跨越龐大距離,隨後再進行精確定位。對於 N 個點,搜尋過程僅需遍歷約O(log N) 個節點,而非N 個節點。

什麼是「HNSW 」?

HNSW (Hierarchical Navigable Small World)是一種基於圖的近似最近鄰演算法。它將向量組織成一疊可導航的小世界圖:上層為稀疏結構,具有長程邊以進行粗略路由;底層為密集結構,具有短邊以進行最終的細粒度遍歷。 搜尋過程會以貪婪演算法在每一層朝查詢點跳躍,然後向下移動——如此一來,僅需遍歷約O(log N) 個節點,而非掃描所有 N 個節點。

HNSW 是使用最廣泛的內存向量索引,也是Milvus 中的預設圖索引。Milvus 亦提供 HNSW_SQ 以及 HNSW_PQ 變體,這些變體會對儲存的向量進行量化,以犧牲少量召回率為代價來節省記憶體。

HNSW 參數在Milvus

  • M (建構時間):每個節點的最大邊數,與上方的滑桿控制項相同。典型值為 8–64。較高的 M 值可提升召回率與圖的連通性,但會使記憶體使用量呈線性增長,並減慢建構速度。
  • efConstruction (建構時間):插入節點時使用的候選向量池大小。較高的數值可建構出品質更佳的圖(可達成的召回率更高),但代價是索引建構速度較慢。典型數值為 100–500。
  • ef /ef_search (查詢時間):在 Layer-0 遍歷過程中保留的候選向量池——這是搜尋時控制召回率與延遲的主要參數。其值必須至少等於您的top-K 。請逐步增加此值直至召回率趨於平穩;延遲會隨此值大致呈線性增長。

HNSW vsIVF vsDiskANN

HNSW 在記憶體內搜尋中,此演算法通常能在高召回率下提供最佳的查詢延遲——這正是當資料集(加上圖結構開銷)能容納於RAM 時,它成為預設選擇的原因。其代價在於記憶體消耗與建構時間:圖結構會為每個向量增加明顯的開銷,且插入操作的速度比IVF 的k-means指派更慢。 當您需要快速建立索引或進行激進量化時,請選擇IVF ;當資料集過大而無法放入RAM ,但您仍需要高召回率時,請選擇DiskANN 。

常見問題

HNSW 中的 M 參數控制什麼?

M 限制了每個節點在每一層中保留的邊數。較大的 M 值會使圖的連通性更好——回召率更高且路由更穩健——但記憶體消耗會隨 M 呈線性增長,且索引建置速度會變慢。8 到 64 之間的數值可涵蓋大多數工作負載;16 至 32 通常是最佳範圍。

ef 與efConstruction 之間有何區別?

兩者皆為候選向量池的大小,但應用於不同時機。「efConstruction 」用於建立索引時:它決定每個插入節點搜尋鄰居的徹底程度,因此控制圖的品質。「ef 」(ef_search )用於查詢時:它控制 Layer-0 搜尋的範圍,在每次查詢中以延遲為代價來換取召回率。

HNSW 索引需要多少記憶體?

大致上包含原始向量加上圖:對於 float32 資料,每個向量約佔 d × 4 位元組,加上每個節點約 M × 2 × 8 位元組的邊。對於記憶體受限的部署,Milvus 提供HNSW_SQ 和HNSW_PQ ,這些功能會對儲存的向量進行量化;或DiskANN ,該功能會將完整向量移至SSD 。

何時應使用 `HNSW ` 而非 `IVF` ?

當查詢延遲在高召回率下是優先考量,且索引能完全載入記憶體時,請使用HNSW —— 它通常能勝出這場競賽。若您經常重建索引(建置速度快得多),或需結合SQ8/PQ 量化技術以符合嚴格的記憶體預算時,請優先選用IVF 。

深入了解:請閱讀《HNSW 》文件以獲取確切的索引參數,或參閱《Index Explained》以取得完整的決策指南。

繼續探索