HNSW_PRQ

HNSW_PRQ利用 Hierarchical Navigable Small World (HNSW) 圖形與 Product Residual Quantization (PRQ),提供先進的向量索引方法,可讓您微調索引大小與精確度之間的權衡。PRQ 超出了傳統的 Product Quantization (PQ),它引入了殘餘量化 (RQ) 步驟來捕捉額外的資訊,與純粹基於 PQ 的方法相比,PRQ 能夠產生更高的精確度或更精簡的索引。然而,額外的步驟可能會在索引建立和搜尋過程中造成較高的計算開銷。

概述

HNSW_PRQ 結合了兩種索引技術:HSNW用於基於圖表的快速導覽,而PRQ則用於有效率的向量壓縮。

HNSW

HNSW 會建構一個多層圖表,其中每個節點對應資料集中的向量。在這個圖形中,節點是根據其相似性連接起來的,因此可以快速遍歷資料空間。層級結構可讓搜尋演算法縮小候選鄰近點的範圍,大幅加速高維空間的搜尋過程。

如需詳細資訊,請參閱HNSW

PRQ

PRQ 是一種多階段向量壓縮方法,結合了兩種互補的技術:PQ 和 RQ。PRQ 首先將高維向量分割成較小的子向量 (透過 PQ),然後將任何剩餘的差異量化 (透過 RQ),以達到精簡又精確的原始資料表示。

下圖顯示其運作方式。

Hnsw Prq Hnsw Prq

  1. 乘積量化 (PQ)

    在此階段中,原始向量會被分割成較小的子向量,而每個子向量會被映射到學習到的編碼簿中最接近的中心點。此對應方式可大幅減少資料大小,但由於每個子向量都是由單一中心點近似而成,因此會產生一些四捨五入的誤差。如需詳細資訊,請參閱IVF_PQ

  2. 殘餘量化 (RQ)

    在 PQ 階段之後,RQ 會使用額外的編碼本量化殘餘值 - 原始向量與其 PQ 近似值之間的差異。由於殘餘量通常小得多,因此可以更精確地編碼,而不會大量增加儲存空間。

    參數nrq 決定此殘餘值的反覆量化次數,讓您可以微調壓縮效率與精確度之間的平衡。

  3. 最終壓縮表示

    當 RQ 完成量化殘餘值後,PQ 和 RQ 的整數編碼會合併為單一的壓縮索引。透過捕捉單獨 PQ 可能會遺漏的精細細節,RQ 可在不大幅增加儲存空間的情況下提升精確度。PQ 和 RQ 之間的協同作用就是 PRQ 的定義。

HNSW + PRQ

透過結合 HNSW 與 PRQ,HNSW_PRQ保留 HNSW 基於圖表的快速搜尋,同時利用 PRQ 的多階段壓縮。工作流程如下

  1. 資料壓縮:首先透過 PQ 將每個向量轉換為粗略的表示,然後透過 RQ 對殘餘進行量化,以進一步精細化。結果是一組代表每個向量的精簡編碼。

  2. 圖形建構:壓縮向量(包括 PQ 和 RQ 編碼)是建立 HNSW 圖形的基礎。由於資料是以精簡的形式儲存,因此圖形所需的記憶體較少,並可加快瀏覽速度。

  3. 候選人檢索:在搜尋過程中,HNSW 會使用壓縮表示法來遍歷圖形,並擷取候選人資料庫。這可大幅減少需要考慮的向量數量。

  4. (可選)結果精煉:初始候選結果可以根據下列參數進行精煉,以獲得更高的精確度:

    • refine:控制是否啟動此精煉步驟。當設定為true 時,系統會使用更高精度或未壓縮的表示來重新計算距離。

    • refine_type:指定精煉過程中使用的資料精確度等級(例如 SQ6、SQ8、BF16)。更高精度的選擇,例如FP32 ,可以產生更精確的結果,但需要更多的記憶體。這必須比原始壓縮資料集的精確度高出sq_type

    • refine_k:作為放大係數。舉例來說,如果您的 topk是 100,而refine_k 是 2,系統會重新排序前 200 名候選人,並傳回最佳的 100 名,以提高整體精確度。

如需參數及有效值的完整清單,請參閱索引參數

建立索引

要在 Milvus 的向量場上建立HNSW_PRQ 索引,請使用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="HNSW_PRQ", # 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={
        "M": 30, # Maximum number of neighbors each node can connect to in the graph
        "efConstruction": 360, # Number of candidate neighbors considered for connection during index construction
        "m": 384, 
        "nbits": 8,
        "nrq": 1,
        "refine": true, # Whether to enable the refinement step
        "refine_type": "SQ8" # Precision level of data used for refinement
    } # Index building params
)

在此設定中

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

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

  • params:建立索引的附加設定選項。詳情請參閱索引建立參數

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

在索引上搜尋

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

search_params = {
    "params": {
        "ef": 10, # Parameter controlling query time/accuracy trade-off
        "refine_k": 1 # The magnification factor
    }
}

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=3,  # TopK results to return
    search_params=search_params
)

在此配置中

索引參數

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

索引建立參數

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

參數

說明

值範圍

調整建議

HNSW

M

每個節點在圖表中可擁有的最大連線(或邊緣)數量,包括傳出和傳入的邊緣。 此參數直接影響索引建立和搜尋。

類型:整數範圍:[2, 2048]

預設值30 (每個節點最多可有 30 條出站邊和 30 條入站邊)

較大的M 通常會帶來較高的精確度但會增加記憶體開銷並減慢索引建置和搜尋的速度。對於高維度的資料集或高召回率非常重要時,請考慮增加M

如果記憶體佔用量和搜尋速度是主要考量,則考慮降低M

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

efConstruction

在索引建構過程中,考慮連接的候選鄰居數量。 每個新元素都會評估更多的候選鄰居,但實際建立的最大連接數仍受限於M

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

預設值360

較高的efConstruction 通常會產生更精確的索引,因為會探索更多的潛在連線。考慮增加efConstruction 以提高精確度尤其是在索引時間不太重要的情況下。

在資源有限的情況下,可考慮降低efConstruction ,以加快索引建置速度。

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

PRQ

m

在量化過程中,將每個高維向量分割為子向量(用於量化)的數量。

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

預設值:無

較高的m 值可以提高精確度,但也會增加計算複雜度和記憶體使用量。m 必須是向量維度(D) 的除數,以確保正確的分解。一般建議的值是m = D/2

在大多數情況下,我們建議您在這個範圍內設定一個值:[D/8, D]。

nbits

用來以壓縮形式表示每個子向量中心點索引的位元數。每個編碼本將包含2位元的中心點。例如,如果nbits 設定為 8,每個子向量將以 8 位元的中心點索引來表示。這樣,該子向量的編碼簿中就有28(256) 個可能的中心點。

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

預設值8

nbits 較高的值允許較大的編碼本,可能會導致原始向量的表示更精確。在大多數情況下,我們建議您設定此範圍內的值:[1, 16].

nrq

控制在 RQ 階段使用多少個殘餘子量化器。更多的子量化器可能會達到更大的壓縮,但可能會造成更多的資訊損失。

類型:IntegerRange(整數範圍):[1, 16]

預設值2

nrq 較高的值允許額外的殘餘次量化步驟,可能會導致原始向量更精確的重建。不過,這也意味著要儲存和計算更多的子量化步驟,導致索引大小變大,計算開銷也變大。

refine

一個布林標誌,用來控制是否在搜尋過程中應用精煉步驟。精煉包括透過計算查詢向量與候選向量之間的精確距離,重新排列初始結果。

類型布林範圍:[true,false]

預設值false

如果高準確度是必要的,而且您可以容忍稍慢的搜尋時間,請設定為true 。如果速度是優先考量,且可以接受精確度的輕微折衷,請使用false

refine_type

決定精煉過程中使用的資料精確度。 此精確度必須高於壓縮向量的精確度(由mnbits 參數設定)。

類型:字串範圍:[SQ6,SQ8,BF16,FP16,FP32 ]。

預設值:無

使用FP32 可在較高記憶體成本下獲得最高精確度,使用SQ6/SQ8 則可獲得更好的壓縮效果。BF16FP16 提供了一個平衡的替代方案。

特定於索引的搜尋參數

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

參數

說明

值範圍

調整建議

HNSW

ef

控制最近鄰檢索時的搜尋範圍。它決定要造訪多少節點,並將其評估為潛在最近鄰居。 此參數只會影響搜尋過程,並只適用於圖形的底層。

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

預設值:limit(要回傳的 TopK 最近鄰居)

較大的ef 通常會導致較高的搜尋準確度,因為會考慮更多的潛在鄰居。當達到高召回率是關鍵,而搜尋速度較不重要時,請考慮增加ef

考慮降低ef 以優先加快搜尋速度,尤其是在可以接受稍微降低精確度的情況下。

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

PRQ

refine_k

放大係數,用來控制在精細化(重新排序)階段中,相對於所要求的前 K 個結果,有多少額外的候選人會被檢驗。

類型:浮動範圍:[1,float_max)

預設值:1

refine_k 的較高值可以提高召回率和精確度,但也會增加搜尋時間和資源使用。值為 1 表示精煉過程只考慮初始的前 K 個結果。

免費嘗試托管的 Milvus

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

開始使用
反饋

這個頁面有幫助嗎?