IVF_SQ8

IVF_SQ8索引是一種基於量化的索引演算法,專為解決大規模相似性搜尋的挑戰而設計。與窮盡搜尋方法相比,此索引類型能以更小的記憶體佔用量達到更快的搜尋速度。

概述

IVF_SQ8 索引建基於兩個關鍵元件:

  • 反向檔案 (IVF):將資料組織成叢集,使搜尋演算法僅能專注於最相關的向量子集。

  • 標量量化 (SQ8):將向量壓縮成更精簡的形式,大幅降低記憶體使用量,同時維持足夠的精確度以進行快速相似性計算。

IVF

IVF 就像是在書本中建立索引。您不需要掃描每一頁 (或在我們的情況中,掃描每一個向量),而是在索引中查找特定的關鍵字(叢集),以快速找到相關的頁面 (向量)。在我們的情況中,向量會被歸類為叢集,演算法會在幾個與查詢向量接近的叢集內進行搜尋。

以下是其運作方式:

  1. 聚類:使用 k-means 之類的聚類演算法,將向量資料集分為指定數量的叢集。每個叢集都有一個中心點(叢集的代表向量)。

  2. 分派:每個向量會被分派到其中心點最接近的叢集。

  3. 反向索引:建立一個索引,將每個群集的中心點對應到分配給該群集的向量清單。

  4. 搜尋:搜尋最近鄰居時,搜尋演算法會比較您的查詢向量與群集中心點,並選擇最有希望的群集。然後將搜尋範圍縮小到這些選定叢集中的向量。

要瞭解更多技術細節,請參閱IVF_FLAT

SQ8

標量量化 (Scalar Quantization, SQ) 是一種用更小、更緊湊的表示來取代高維向量的值,從而縮小其大小的技術。SQ8變體使用 8 位元整數取代典型的 32 位元浮點數來儲存向量的每個維度值。這大大降低了儲存資料所需的記憶體數量。

以下是 SQ8 的運作方式:

  1. 範圍識別:首先,識別向量內的最小值和最大值。此範圍定義了量化的邊界。

  2. 歸一化:使用公式將向量值歸一為 0 至 1 的範圍:

    normalized_value=valueminmaxmin\text{normalized\_value} = \frac{\text{value} - \text{min}}{\text{max} - \text{min}}

    這可確保所有值都在標準範圍內按比例映射,為壓縮做好準備。

  3. 8 位元壓縮:將標準化值乘以 255(8 位元整數的最大值),然後將結果四捨五入為最接近的整數。這可有效地將每個值壓縮為 8 位元表示。

假設您有一個尺寸值為 1.2,最小值為 -1.7,最大值為 2.3。下圖顯示如何應用 SQ8 將 float32 值轉換為 int8 整數。

Ivf Sq8 Ivf Sq8

IVF + SQ8

IVF_SQ8 索引結合了 IVF 和 SQ8 來有效率地執行相似性搜尋:

  1. IVF 縮小搜尋範圍:資料集被分成叢集,當發出查詢時,IVF 會先比較查詢與叢集中心點,選擇最相關的叢集。

  2. SQ8 加速距離計算:在選定的叢集內,SQ8 會將向量壓縮為 8 位元整數,以減少記憶體使用量並加速距離計算。

透過使用 IVF 聚焦搜尋和 SQ8 加速計算,IVF_SQ8 可同時達到快速搜尋時間和記憶體效率。

建立索引

要在 Milvus 的向量場上建立IVF_SQ8 索引,請使用add_index() 方法,指定index_type,metric_type, 以及索引的附加參數。

from pymilvus import MilvusClient

# Prepare index building params
index_params = MilvusClient.prepare_index_params()

index_params.add_index(
    field_name="your_vector_field_name", # Name of the vector field to be indexed
    index_type="IVF_SQ8", # Type of the index to create
    index_name="vector_index", # Name of the index to create
    metric_type="L2", # Metric type used to measure similarity
    params={
        "nlist": 64, # Number of clusters to create using the k-means algorithm during index building
    } # Index building params
)

在此設定中

  • index_type:要建立的索引類型。在本範例中,設定值為IVF_SQ8

  • metric_type:用來計算向量間距離的方法。支援的值包括COSINE,L2, 和IP 。如需詳細資訊,請參閱公制類型

  • params:建立索引的附加設定選項。

    • nlist:在索引建立過程中使用 k-means 演算法建立的叢集數目。

    要瞭解IVF_SQ8 索引可用的更多建立參數,請參閱索引建立參數

索引參數設定完成後,您可以直接使用create_index() 方法或在create_collection 方法中傳入索引參數來建立索引。如需詳細資訊,請參閱建立集合

在索引上搜尋

索引建立且實體插入後,您就可以在索引上執行相似性搜尋。

search_params = {
    "params": {
        "nprobe": 8, # Number of clusters to search for candidates
    }
}

res = MilvusClient.search(
    collection_name="your_collection_name", # Collection name
    anns_field="vector_field", # Vector field name
    data=[[0.1, 0.2, 0.3, 0.4, 0.5]],  # Query vector
    limit=10,  # TopK results to return
    search_params=search_params
)

在此配置中

  • params:在索引上搜尋的其他設定選項。

    • nprobe:搜尋候選人的叢集數。

    要瞭解IVF_SQ8 索引可用的更多搜尋參數,請參閱特定於索引的搜尋參數。

索引參數

本節概述用於建立索引和在索引上執行搜尋的參數。

索引建立參數

下表列出了建立索引時可以在params 中設定的參數。

參數

說明

值範圍

調整建議

IVF

nlist

在建立索引時使用 k-means 演算法建立的叢集數。

類型:整數範圍:[1, 65536]

預設值128

較大的nlist 值會透過建立更精細的叢集來改善回復率,但會增加索引建立時間。根據資料集大小和可用資源進行最佳化。 在大多數情況下,我們建議您設定此範圍內的值:[32, 4096].

特定於索引的搜尋參數

下表列出在索引上搜尋時,可在search_params.params 中設定的參數。

參數

說明

值範圍

調整建議

IVF

nprobe

搜尋候選人的叢集數。

類型: 整數整數範圍:[1、nlist]

預設值8

較高的值允許搜尋更多的叢集,藉由擴大搜尋範圍來改善召回率,但代價是增加查詢延遲。請將nprobenlist 成比例設定,以平衡速度與精確度。

在大多數情況下,我們建議您設定此範圍內的值:[1, nlist]。

免費嘗試托管的 Milvus

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

開始使用
反饋

這個頁面有幫助嗎?