🚀 免費嘗試 Zilliz Cloud,完全托管的 Milvus,體驗速度提升 10 倍!立即嘗試

milvus-logo
LFAI
主頁
  • 概念
  • Home
  • Docs
  • 概念

  • 向量索引

  • 記憶體索引

記憶體索引

本主題列出 Milvus 支援的各種類型的記憶體索引、每種索引最適合的情況,以及使用者可以設定的參數,以達到更好的搜尋效能。關於磁碟索引,請參閱磁碟索引

索引是有效組織資料的過程,它透過大幅加速大型資料集上耗時的查詢,在使相似性搜尋有用方面扮演重要角色。

為了改善查詢效能,您可以為每個向量欄位指定索引類型

目前,一個向量欄位只支援一種索引類型。切換索引類型時,Milvus 會自動刪除舊索引。

ANNS 向量索引

Milvus 支援的大部分向量索引類型都使用近似近鄰搜尋 (ANNS) 演算法。相較於精確檢索通常非常耗時,ANNS 的核心理念不再局限於傳回最精確的結果,而是只搜尋目標的近鄰。ANNS 在可接受的範圍內犧牲精確度,以提高檢索效率。

根據實作方法,ANNS 向量索引可分為四種類型:樹狀索引(Tree-based)、圖形索引(Graph-based)、哈希索引(Hash-based)和量化索引(Quantization-based)。

Milvus 支援的索引

Milvus 支援多種索引類型,依其處理的向量嵌入類型分類:浮點嵌入(也稱為浮點向量或密集向量)、二進位嵌入 (也稱為二進位向量),以及稀疏嵌入(也稱為稀疏向量)。

浮點嵌入的索引

對於 128 維浮點內嵌 (向量),它們所佔的儲存空間是 128 * float 的大小 = 512 位元組。而浮點內嵌使用的距離指標是 Euclidean distance (L2) 和 Inner product (IP)。

這些類型的索引包括FLAT,IVF_FLAT,IVF_PQ,IVF_SQ8,HNSW,HNSW_SQ,HNSW_PQ,HNSW_PRQ, 以及SCANN ,用於以 CPU 為基礎的 ANN 搜尋。

二元嵌入的索引

對於 128 維的二進位嵌入,其所佔的儲存空間為 128 / 8 = 16 位元組。而用於二進位嵌入的距離指標是JACCARDHAMMING

這類索引包括BIN_FLATBIN_IVF_FLAT

稀疏內嵌索引

稀疏嵌入式索引僅支援IPBM25 (用於全文檢索)度量。

稀疏嵌入支持的索引類型:SPARSE_INVERTED_INDEX

從 Milvus 2.5.4 起,SPARSE_WAND 已經被廢棄。取而代之,建議使用"inverted_index_algo": "DAAT_WAND" 以達到等效,同時保持相容性。如需詳細資訊,請參閱Sparse Vector

支援的索引 分類 情況
平面 不適用
  • 資料集相對較小
  • 需要 100% 的召回率
IVF_FLAT 不適用
  • 高速查詢
  • 要求盡可能高的召回率
IVF_SQ8 基於量化的索引
  • 非常高速的查詢
  • 記憶體資源有限
  • 可接受召回率的輕微折衷
IVF_PQ 基於量化的索引
  • 高速查詢
  • 有限的記憶體資源
  • 接受召回率的輕微折衷
HNSW 基於圖表的索引
  • 非常高速的查詢
  • 要求盡可能高的召回率
  • 大量記憶體資源
HNSW_SQ 基於量化的索引
  • 非常高速的查詢
  • 有限的記憶體資源
  • 可接受召回率的輕微折衷
HNSW_PQ 基於量化的索引
  • 中速查詢
  • 非常有限的記憶體資源
  • 接受召回率的輕微折衷
HNSW_PRQ 基於量化的索引
  • 中速查詢
  • 非常有限的記憶體資源
  • 接受召回率的輕微折衷
SCANN 基於量化的索引
  • 非常高速的查詢
  • 要求盡可能高的召回率
  • 大量記憶體資源
支援的索引 分類 情況
BIN_FLAT 基於量化的索引
  • 取決於相對較小的資料集。
  • 要求完美的精確度。
  • 不適用壓縮。
  • 保證精確的搜尋結果。
BIN_IVF_FLAT 基於量化的索引
  • 高速查詢
  • 要求盡可能高的召回率
支援的索引 分類 情況
稀疏反向索引 反向索引
  • 取決於相對較小的資料集。
  • 需要 100% 的召回率。

FLAT

對於需要完美精確度,且依賴相對較小(百萬量級)資料集的向量相似性搜尋應用,FLAT 索引是很好的選擇。FLAT 不會壓縮向量,而且是唯一能保證精確搜尋結果的索引。FLAT 的結果也可以用來比較其他召回率低於 100% 的索引所產生的結果。

FLAT 之所以精確,是因為它採用了窮盡方式進行搜尋,也就是說,對於每次查詢,目標輸入都會與資料集中的每一組向量進行比較。這使得 FLAT 成為我們清單上最慢的索引,而且不適合查詢大量向量資料。在 Milvus 中,FLAT 索引不需要任何參數,使用它也不需要資料訓練。

  • 搜尋參數

    參數說明範圍
    metric_type[可選] 選擇的距離度量。請參閱支援的公制

IVF_FLAT

IVF_FLAT 將向量資料分割成nlist 叢集單位,然後比較目標輸入向量與每個叢集中心點之間的距離。根據系統設定查詢的叢集數量 (nprobe) ,相似性搜尋結果只會根據目標輸入與最相似叢集中向量的比較結果傳回 - 大幅縮短查詢時間。

透過調整nprobe ,可以在特定情況下找到精確度與速度之間的理想平衡。IVF_FLAT 效能測試的結果顯示,當目標輸入向量的數量 (nq) 和要搜尋的叢集數量 (nprobe) 增加時,查詢時間也會大幅增加。

IVF_FLAT 是最基本的 IVF 索引,每個單元儲存的編碼資料與原始資料一致。

  • 索引建立參數

    參數說明範圍預設值
    nlist群組單位數量[1, 65536]128
  • 搜尋參數

    • 共用搜尋

      參數說明範圍預設值
      nprobe要查詢的單位數量[1, nlist]8
    • 範圍搜尋

      參數說明範圍預設值
      max_empty_result_buckets

      這是範圍搜尋參數,當連續空桶的數量達到指定值時,搜尋程序會終止。增加此值可以提高召回率,但代價是增加搜尋時間。
      [1, 65535]2

IVF_SQ8

IVF_FLAT 不會執行任何壓縮,因此它產生的索引檔案大小與原始、未編入索引的向量資料大致相同。例如,如果原始的 1B SIFT 資料集是 476 GB,則其 IVF_FLAT 索引檔案會稍微小一些 (~470 GB)。將所有索引檔案載入記憶體將會消耗 470 GB 的儲存空間。

當磁碟、CPU 或 GPU 記憶體資源有限時,IVF_SQ8 是比 IVF_FLAT 更好的選擇。此索引類型可透過執行 Scalar Quantization (SQ) 將每個 FLOAT (4 位元組) 轉換為 UINT8 (1 位元組)。這樣可以減少 70-75% 的磁碟、CPU 和 GPU 記憶體消耗。對於 1B SIFT 資料集,IVF_SQ8 索引檔案只需要 140 GB 的儲存空間。

  • 索引建立參數

    參數說明範圍
    nlist叢集單位數量[1, 65536]
  • 搜尋參數

    • 共用搜尋

      參數說明範圍預設值
      nprobe要查詢的單位數量[1, nlist]8
    • 範圍搜尋

      參數說明範圍預設值
      max_empty_result_buckets

      這是範圍搜尋參數,當連續空桶的數量達到指定值時,搜尋程序會終止。增加此值可以提高召回率,但代價是增加搜尋時間。
      [1, 65535]2

IVF_PQ

PQ (Product Quantization) 將原始的高維向量空間均勻地分解成 低維向量空間的笛卡兒乘積,然後將分解後的低維向量空間量化。乘積量化不需要計算目標向量與所有單元中心的距離,可以計算目標向量與每個低維空間的聚類中心的距離,大大降低了演算法的時間複雜度和空間複雜度。m

IVF_PQ 在量化向量的乘積之前先執行 IVF 索引聚類。其索引檔案比 IVF_SQ8 更小,但在搜尋向量時也會造成精確度的損失。

索引建立參數和搜尋參數因 Milvus 分佈而異。請先選擇您的 Milvus 分佈。

  • 索引建立參數

    參數說明範圍
    nlist群集單位數量[1, 65536]
    m乘積量化的因子數dim mod m == 0
    nbits[Optional] 儲存每個低維向量的位元數。[1, 64] (預設為 8)
  • 搜尋參數

    • 一般搜尋

      參數說明範圍預設值
      nprobe要查詢的單位數量[1, nlist]8
    • 範圍搜尋

      參數說明範圍預設值
      max_empty_result_buckets

      這是範圍搜尋參數,當連續空桶的數量達到指定值時,搜尋程序會終止。增加此值可以提高召回率,但代價是增加搜尋時間。
      [1, 65535]2

SCANN

ScaNN (Scalable Nearest Neighbors) 在向量聚類和乘積量化方面與 IVF_PQ 相似。它們的不同之處在於乘積量化的實作細節,以及使用 SIMD (Single-Instruction / Multi-data) 進行有效率的計算。

  • 索引建立參數

    參數說明範圍
    nlist叢集單位數量[1, 65536]
    with_raw_data是否在索引中包含原始資料True 或 .預設為 。False True

    與 IVF_PQ 不同,預設值適用於mnbits ,以取得最佳效能。

  • 搜尋參數

    • 常見搜尋

      參數說明範圍預設值
      nprobe要查詢的單位數量[1, nlist]
      reorder_k要查詢的候選單位數量[top_k, ∞]top_k
    • 範圍查詢

      參數說明範圍預設值
      max_empty_result_buckets

      這是範圍搜尋參數,當連續空桶的數量達到指定值時,搜尋程序會終止。增加此值可以提高召回率,但代價是增加搜尋時間。
      [1, 65535]2

HNSW

HNSW (Hierarchical Navigable Small World Graph) 是一種以圖表為基礎的索引演算法。它根據特定規則為圖像建立多層導覽結構。在此結構中,上層較為稀疏,節點之間的距離較遠;下層較為密集,節點之間的距離較近。搜尋從最上層開始,在這一層中找到最接近目標的節點,然後進入下一層開始另一次搜尋。經過多次迭代後,可以快速接近目標位置。

為了改善效能,HNSW 將圖表每層上節點的最大度數限制為M 。此外,您可以使用efConstruction (建立索引時) 或ef (搜尋目標時) 來指定搜尋範圍。

  • 索引建立參數

    參數說明範圍預設值
    MM 定義圖表中出線連線的最大數目。在固定 ef/efConstruction 時,M 越大,精確度/run_time 越高。[2, 2048]
    efConstructionef_construction 控制索引搜尋速度/建立速度的取捨。增加 efConstruction 參數可能會提高索引品質,但也會延長索引建立時間。[1, int_max]
  • 搜尋參數

    參數說明範圍預設值
    ef控制查詢時間/精確度權衡的參數。ef 越高,搜尋越精確,但速度越慢。[top_k, int_max]

HNSW_SQ

標量量化 (Scalar Quantization, SQ) 是一種技術,用來根據浮點資料的大小,將其離散成一組有限的數值。例如,SQ6表示量化為 (2^6 = 64) 個離散數值,其中每個浮點數使用 6 位元編碼。同樣地,SQ8將資料量化為 (2^8 = 256) 個離散值,其中每個浮點數使用 8 位元表示。這種量化方式可減少記憶體佔用量,同時保留資料的基本結構,以提高處理效率。

結合 SQ,HNSW_SQ 在索引大小與精確度之間提供了可控制的權衡,同時維持每秒高查詢 (QPS) 的效能。與標準的 HNSW 相比,它會導致索引建置時間的適度增加。

  • 索引建置參數

    參數說明範圍預設值
    MM 定義圖表中出線連線的最大數目。在固定 ef/efConstruction 時,M 越大,精確度/run_time 越高。[2, 2048]
    efConstructionef_construction 控制索引搜尋速度/建立速度的取捨。增加 efConstruction 參數可能會提高索引品質,但也會延長索引建立時間。[1, int_max]
    sq_type標量量化器類型。SQ6,SQ8,BF16FP16SQ8
    refine索引建立時是否保留精煉資料。true,falsefalse
    refine_type精煉索引的資料類型。SQ6,SQ8,BF16,FP16FP32
  • 搜尋參數

    參數說明範圍預設值
    ef控制查詢時間/精確度權衡的參數。ef 越高,搜尋越精確,但速度越慢。[top_k, int_max]
    refine_krefine 相對於k 的放大係數。[1,float_max)1

HNSW_PQ

PQ 的基本概念是將向量分割成m 個子向量,每個子向量會根據 kmeans 找到2^{nbits} 的 centroids,每個子向量會選擇最接近的 centroids 作為它的近似子向量。然後,我們記錄所有的中心點,因此每個子向量可編碼為nbits ,而長度為dim 的浮動向量可編碼為m ⋅ nbits位元。

結合 PQ,HNSW_PQ 在索引大小與精確度之間提供了可控制的折衷,但在相同的壓縮率下,它的 QPS 值比 HNSW_SQ 低,召回率也比 HNSW_SQ 高。與 HNSW_SQ 相比,它需要更長的時間來建立索引。

  • 索引建立參數

    參數說明範圍預設值
    MM 定義圖表中出線連線的最大數目。在固定 ef/efConstruction 時,M 越大,精確度/run_time 越高。[2, 2048]
    efConstructionef_construction 控制索引搜尋速度/建立速度的取捨。增加 efConstruction 參數可能會提高索引品質,但也會延長索引建立時間。[1, int_max]
    m將向量分割成的子向量群組數。[1, 65536]32
    nbits每個子向量群量化成的位元數。[1, 24]8
    refine建立索引時是否保留精煉資料。true,falsefalse
    refine_type精煉索引的資料類型。SQ6,SQ8,BF16,FP16FP32
  • 搜尋參數

    參數說明範圍預設值
    ef控制查詢時間/精確度權衡的參數。ef 越高,搜尋越精確,但速度越慢。[top_k, int_max]
    refine_krefine 相對於k 的放大係數。[1,float_max)1

HNSW_PRQ

PRQ 與 PQ 相似,也是將向量分成m 組。每個子向量將被編碼為nbits 。完成 pq 量化後,會計算向量與 pq 量化向量之間的殘差,並對殘差向量套用 pq 量化。總共會執行nrq 完整的 pq 量化,因此長度為dim 的浮動向量將被編碼為m ⋅ nbits ⋅ nrqbits。

結合了 Product Residual Quantizer (PRQ),HNSW_PRQ 在索引大小與精確度之間提供了更高的可控權衡。與 HNSW_PQ 相比,在相同的壓縮率下,HNSW_PRQ 的 QPS 值與 HNSW_PQ 的召回率幾乎相等。與 HNSW_PQ 相比,建立索引的時間可能會增加數倍。

  • 索引建立參數

    參數說明範圍預設值
    MM 定義圖表中出線連線的最大數目。在固定 ef/efConstruction 時,M 越大,精確度/run_time 越高。[2, 2048]
    efConstructionef_construction 控制索引搜尋速度/建立速度的取捨。增加 efConstruction 參數可能會提高索引品質,但也會延長索引建立時間。[1, int_max]
    m將向量分割成的子向量群組數。[1, 65536]32
    nbits每個子向量群量化成的位元數。[1, 24]8
    nrq殘餘子量化器的數量。[1, 16]2
    refine建立索引時是否保留精煉資料。true,falsefalse
    refine_type精煉索引的資料類型。SQ6,SQ8,BF16,FP16FP32
  • 搜尋參數

    參數說明範圍預設值
    ef控制查詢時間/精確度權衡的參數。ef 越高,搜尋越精確,但速度越慢。[top_k, int_max]
    refine_krefine 相對於k 的放大係數。[1,float_max)1

BIN_FLAT

除了只能用於二進位嵌入之外,這個索引與 FLAT 完全相同。

對於需要完美精確度,並依賴相對較小(百萬量級)資料集的向量相似性搜尋應用,BIN_FLAT 索引是一個不錯的選擇。BIN_FLAT 不會壓縮向量,而且是唯一能保證精確搜尋結果的索引。BIN_FLAT 的結果也可以用來比較其他召回率低於 100% 的索引所產生的結果。

BIN_FLAT 之所以準確,是因為它採用了窮盡搜尋的方式,也就是說,對於每個查詢,目標輸入都會與資料集中的向量進行比較。這使得 BIN_FLAT 成為我們清單上最慢的索引,而且不適合查詢大量向量資料。在 Milvus 中,BIN_FLAT 索引沒有任何參數,使用它不需要資料訓練或額外的儲存空間。

  • 搜尋參數

    參數說明範圍
    metric_type[可選] 選擇的距離度量。請參閱支援的公制

BIN_IVF_FLAT

這個索引與 IVF_FLAT 完全相同,只是只能用於二進位嵌入。

BIN_IVF_FLAT 會將向量資料分割成nlist 叢集單位,然後比較目標輸入向量與每個叢集中心的距離。根據系統設定查詢的叢集數量 (nprobe),相似性搜尋結果只會根據目標輸入與最相似叢集中向量的比較結果傳回 - 大幅縮短查詢時間。

透過調整nprobe ,可以在特定情況下找到精確度與速度之間的理想平衡。查詢時間會隨著目標輸入向量的數量 (nq) 以及要搜尋的群集數量 (nprobe) 的增加而急遽增加。

BIN_IVF_FLAT 是最基本的 BIN_IVF 索引,每個單元儲存的編碼資料與原始資料一致。

  • 索引建立參數

    參數說明範圍
    nlist群集單元數[1, 65536]
  • 搜尋參數

    • 共用搜尋

      參數說明範圍預設值
      nprobe要查詢的單位數量[1, nlist]8
    • 範圍搜尋

      參數說明範圍預設值
      max_empty_result_buckets

      這是範圍搜尋參數,當連續空桶的數量達到指定值時,搜尋程序會終止。增加此值可以提高召回率,但代價是增加搜尋時間。
      [1, 65535]2

sparse_inverted_index

每個維度都會維護一個在該維度上有非零值的向量清單。在搜尋過程中,Milvus 會反覆搜尋查詢向量的每個維度,並計算在這些維度上有非零值的向量的分數。

  • 索引建立參數

    參數說明範圍
    inverted_index_algo用於建立和查詢索引的演算法。如需詳細資訊,請參閱Sparse Vector.DAAT_MAXSCORE (預設值), 、DAAT_WAND TAAT_NAIVE

    drop_ratio_build 參數自 Milvus v2.5.4 起已被廢棄,在建立索引時仍可接受,但將不再對索引有實際影響。

  • 搜尋參數

    參數說明範圍
    drop_ratio_search在搜尋過程中排除小向量值的比例。此選項允許微調搜尋過程,方法是指定忽略查詢向量中最小值的比例。它有助於平衡搜尋精確度與效能。drop_ratio_search 設定的值越小,這些小值對最終得分的貢獻就越小。藉由忽略一些小值,可以在對精確度影響最小的情況下提高搜尋效能。[0, 1]

常見問題

FLAT 索引與 IVF_FLAT 索引有何不同?

IVF_FLAT 索引將向量空間分為nlist 叢集。如果您保持nlist 的預設值為 16384,Milvus 會比較目標向量與所有 16384 叢集中心的距離,以得到nprobe 最近的叢集。接著,Milvus 會比較目標向量與選取的叢集中向量之間的距離,以得到最近的向量。與 IVF_FLAT 不同,FLAT 直接比較目標向量與每個向量之間的距離。

因此,當向量的總數大約等於nlist 時,IVF_FLAT 與 FLAT 所需的計算方式與搜尋效能差異不大。但是當向量的數量增加到nlist 的 2 倍、3 倍或 n 倍時,IVF_FLAT 索引就開始顯示出越來越大的優勢。

更多資訊請參閱如何在 Milvus 中選擇索引

下一步

免費嘗試托管的 Milvus

Zilliz Cloud 無縫接入,由 Milvus 提供動力,速度提升 10 倍。

開始使用
反饋

這個頁面有幫助嗎?