選擇 EmbeddingList 搜尋策略

EmbeddingList 搜尋策略決定 Milvus 如何為 EmbeddingList 搜尋建立近似候選索引。預設策略為「tokenann 」。當嵌入清單規模龐大、TokenANN 運算成本過高,或學習式/壓縮的行級表示法更為合適時,您可以切換至「muvera 」或「lemur 」。 當啟用「emb_list_rerank 」時,最終結果仍由 MaxSim 重新排序產生。

搜尋策略存在的理由

EmbeddingList 專為包含多個向量的行而設計,例如文字文件中的詞元嵌入、視覺文件中的片段嵌入,或是影片中的片段嵌入。MaxSim 並非將一個查詢向量與一個行向量進行比對,而是將查詢嵌入清單與文件嵌入清單進行比對,並彙整最佳匹配結果。

這提供了更強的表徵能力,但大規模執行精確 MaxSim 運算的開銷過高。若採用暴力搜尋方式執行 MaxSim,則需將查詢向量與每個候選列中的每個向量進行比對,這通常會導致生產環境中的搜尋速度過慢。

### 問題 - 每行可能包含多個向量。 - 對所有行執行精確 MaxSim 運算成本過高。 - 索引大小與搜尋延遲可能迅速增加。### 策略 - 採用近似的第一階段檢索方法。 - 檢索的候選項目數量多於請求的 topK。 - 透過精確 MaxSim 對候選項目進行重新排序。

從這個角度來看,emb_list_strategy 主要是一種索引建置與候選項檢索策略。它在建置索引時進行配置,並決定如何產生第一階段的 ANN 候選集。隨後,搜尋時的參數(例如retrieval_ann_ratioemb_list_rerank )將控制檢索的候選項數量,以及是否套用 MaxSim 重新排序。


可用策略

策略候選解檢索單元解決的問題最佳匹配主要權衡
tokenann每行內的個別向量保留原始向量,避免壓縮損失。以品質為優先的搜尋、短或中長度的嵌入清單、高辨別力的嵌入向量。索引較大,且候選項檢索成本較高。
muvera每行一個編碼向量無需訓練即可將嵌入清單壓縮為固定維度的 FDE 表示形式。適用於較長的文件、高辨別力的嵌入向量,以及 TokenANN 過於耗資源的情況。隨機投影會引入近似誤差;FDE 維度會影響延遲。
lemur每行一個學習得出的向量從嵌入向量列表學習針對特定語料庫的壓縮方法,將其轉換為固定維度的行向量。低辨別度嵌入向量、多模態或視覺文檔檢索、大型嵌入向量列表。需要進行訓練,且可能受語料庫分佈及文件長度偏誤的影響。

TokenANN

tokenann 會為嵌入向量列表中的每個向量建立索引。在搜尋過程中,每個查詢向量會執行人工神經網路(ANN)檢索,匹配的向量會彙總回其所在的行,並使用 MaxSim 對所得的行候選結果進行重新排序。

當品質是首要考量時,請使用 TokenANN。由於它在第一階段索引中保留了所有向量,因此這是最接近原始 MaxSim 運算的近似方法。

  • 適用情境:短篇文字片段、向量數量較少或適中的行、強烈的標記層級語義分離、對品質要求嚴苛的基準測試。

  • 較不適用:極長的文件、含有數千個片段向量的視覺頁面,以及記憶體或延遲資源嚴格受限的情境。

  • 元素層級行為:TokenANN 可在將向量彙總回列之前,先從個別向量中檢索候選項。經過 MaxSim 評分後,最終的 EmbeddingList 搜尋結果仍為列層級。

MUVERA

muvera 透過隨機投影,將每個嵌入清單編碼為固定維度的向量。這將第一階段檢索轉變為標準的行級向量搜尋。隨後使用 MaxSim 對候選結果進行重新排序。

當 TokenANN 過於耗資源,但您又不希望進行訓練步驟時,請使用 MUVERA。這是品質與成本之間務實的折衷方案。

  • 適用情境:長篇文本文件、高辨別力的嵌入空間,以及需要比 TokenANN 更小索引大小的作業負載。

  • 較不適用:低辨別力的嵌入空間,或當 FDE 表示法因維度過高而超出延遲預算的情境。

  • 重要參數:muvera_num_projectionsmuvera_num_repeats 以及muvera_seed

LEMUR

lemur 透過訓練模型,將每個嵌入清單壓縮為固定維度的表示。第一階段的 ANN 搜尋會針對已學習的行級向量進行,並使用 MaxSim 對候選結果進行重新排序。

當學習壓縮的效益足以抵銷訓練成本時,建議使用 LEMUR。它對於低辨別度嵌入空間和多模態檢索效果良好,但應針對目標語料庫進行驗證,因為其效果可能受文件長度分佈的影響。

  • 適用情境:視覺文件檢索、多模態片段嵌入、低區分度嵌入空間,以及 TokenANN 難以實行的龐大嵌入清單。

  • 較不適用:頻繁變動的語料庫、文件長度高度偏斜的高區分度嵌入空間,以及訓練成本無法接受的工作負載。

  • 重要參數:lemur_hidden_dimlemur_num_train_sampleslemur_num_epochslemur_batch_sizelemur_learning_ratelemur_seed 以及lemur_num_layers


預設行為與設定

Knowhere 中的預設 EmbeddingList 策略為tokenann 。若未指定emb_list_strategy ,Knowhere 將使用 TokenANN。搜尋時的預設值包含retrieval_ann_ratio=3.0emb_list_rerank=true

各策略的配置項目

下表列出了各策略專屬的配置項目。在 Milvus 中,建置時的配置項目通常會在建立索引時透過params 映射傳入。若需伺服器端的預設值,應在 Milvus 配置檔案的knowhere 區段中進行定義。

策略配置項目階段預設值何時應變更
tokenannemb_list_strategy="tokenann"索引建置tokenann當您希望採用預設的元素向量索引行為,或使用 DiskANN 時,請明確使用此設定。
muveraemb_list_strategy="muvera"索引建置tokenann當您希望在不進行訓練的情況下,執行行級別的編碼檢索時,請使用此選項。
muveramuvera_num_projections索引建置4控制 SimHash 的投影次數。較高的數值會建立更多桶位,可能提升編碼品質,但會增加編碼維度。
muveramuvera_num_repeats索引建置7控制要串接多少個獨立的 FDE 編碼。較高的數值可能提升魯棒性,但會增加索引/搜尋成本。
muveramuvera_seed索引建立42用於設定可重現的隨機投影,特別是在測試和基準比較中。
lemuremb_list_strategy="lemur"索引建置tokenann當預期學習型行級壓縮的表現優於固定隨機投影時,請使用此設定。
lemurlemur_hidden_dim索引建置256控制壓縮表示的大小。增加數值可提升容量;減少數值則可降低記憶體佔用並加快檢索速度。
lemurlemur_num_train_samples索引建置20000當語料庫多樣性高且學習到的壓縮效果不足時,應增加此參數;僅在進行小型測試或需加快建置速度時才應減少。
lemurlemur_num_epochs索引建置50若訓練尚未收斂,請增加;若建置時間是主要限制因素,則減少。
lemurlemur_batch_size索引建置512請根據訓練吞吐量與記憶體使用量進行調整。
lemurlemur_learning_rate索引建置0.001當訓練不穩定或收斂過慢時進行調整。
lemurlemur_seed索引建置42設定此參數以確保訓練過程可重複。
lemurlemur_num_layers建立索引2僅在語料庫需要更具表現力的特徵提取器,且您能負擔額外訓練成本時才增加。
所有策略retrieval_ann_ratio搜尋3.0增加此參數可檢索更多第一階段候選項並提升召回率;減少此參數則可降低延遲。
所有策略emb_list_rerank搜尋true請保持啟用狀態以進行 MaxSim 重新排序。僅在直接測量第一階段人工神經網路 (ANN) 品質的受控實驗中才應停用。

在 Milvus 中設定策略

在 Milvus 中,建立 EmbeddingList 欄位(例如 StructArray 向量子欄位)的索引時,會將策略作為索引參數傳入。

index_params = client.prepare_index_params()
index_params.add_index(
    field_name="clips[clip_embedding]",
    index_type="HNSW",
    metric_type="MAX_SIM_COSINE",
    params={
        "M": 16,
        "efConstruction": 96,
        "emb_list_strategy": "muvera",
        "muvera_num_projections": 4,
        "muvera_num_repeats": 7,
        "muvera_seed": 42,
    },
)

對於 LEMUR,請在同一個 `params ` 映射中提供 LEMUR 訓練參數。

params={
    "M": 16,
    "efConstruction": 96,
    "emb_list_strategy": "lemur",
    "lemur_hidden_dim": 256,
    "lemur_num_train_samples": 20000,
    "lemur_num_epochs": 50,
    "lemur_batch_size": 512,
    "lemur_learning_rate": 0.001,
    "lemur_seed": 42,
    "lemur_num_layers": 2,
}

在 Milvus 中設定伺服器端預設值

Milvus 亦可從 `milvus.yaml` 載入索引參數。相關章節請參閱knowhere 。參數依索引類型與階段進行組織,採用knowhere.<INDEX_TYPE>.<stage>.<parameter> 的命名模式。使用者提供的索引參數優先於這些預設值。

knowhere:
  enable: true
  HNSW:
    build:
      emb_list_strategy: muvera
      muvera_num_projections: 4
      muvera_num_repeats: 7
      muvera_seed: 42
    search:
      retrieval_ann_ratio: 3.0
      emb_list_rerank: true

建議優先使用「按索引設定」的參數來選擇策略。Milvus 配置檔中的預設值會廣泛套用至該類型與階段的所有索引。當不同集合或欄位需要不同的 EmbeddingList 策略時,請使用create_index 中的參數。

於搜尋時配置候選結果檢索

策略決定索引的建置方式。在搜尋時,請使用retrieval_ann_ratio 來控制在進行 MaxSim 重新排序之前,應檢索多少個第一階段候選結果。較高的數值通常能提升召回率,但會增加延遲。

results = client.search(
    collection_name=collection_name,
    data=[query_embedding_list],
    anns_field="clips[clip_embedding]",
    search_params={
        "metric_type": "MAX_SIM_COSINE",
        "params": {
            "ef": 64,
            "retrieval_ann_ratio": 3.0,
            "emb_list_rerank": True,
        },
    },
    limit=10,
)
參數階段預設值含義
emb_list_strategy索引建置tokenann選取 EmbeddingList 候選項的索引建立與檢索方式。
retrieval_ann_ratio搜尋3.0第一輪人工神經網路(ANN)運算的候選項擴展因子。
emb_list_rerank搜尋true是否使用 MaxSim 對檢索到的候選項進行重新排序。

相容性說明:MUVERA 和 LEMUR 目前在 Knowhere 中僅支援 fp32 資料。DiskANN 僅在搭配 TokenANN 策略時才支援 EmbeddingList。若您使用非 fp32 的向量類型或 DiskANN,請在變更預設值前確認該策略是否受支援。


如何選擇策略

沒有放諸四海皆準的最佳策略。請根據嵌入清單長度、嵌入空間的辨別能力、延遲預算、索引大小,以及您是否能負擔訓練步驟等因素來選擇。

問題Signal建議的起點
您是否需要高品質的基準模型?您希望在優化成本之前,先評估最佳的實用近似解。tokenann
各列的向量數量是較少還是適中?每行包含少量標記、片段或片段向量。tokenann
TokenANN 是否過大或過慢?索引大小或第一階段檢索延遲是瓶頸。muvera
您是否希望在不進行訓練的情況下進行壓縮?您需要更簡單的運作模型和可重現的編碼方式。muvera
嵌入空間的辨別能力是否不足?標記層級的 ANN 候選模型存在噪聲,且隨機投影無法保留足夠的訊號。lemur
工作負載屬於視覺型還是多模態型?行中包含許多片段向量,而 TokenANN 的運算成本過高。lemurmuvera
文件長度是否存在高度偏斜?某些行所含的向量遠多於其他行。請先從muvera 開始;並仔細驗證lemur

建議的評估工作流程

  1. 當資料集大小允許時,請以tokenann 作為品質基準。

  2. 使用muvera 執行相同的查詢,並比較召回率、nDCG、延遲及索引大小。

  3. 當嵌入清單龐大、嵌入空間雜訊較多,或工作負載屬視覺或多模態時,請嘗試使用lemur

  4. 在調整過多建置時參數之前,請先微調 `retrieval_ann_ratio `。若召回率偏低,請增加該參數;若延遲過高,則應減少該參數。

  5. 務必使用具代表性的查詢及文件長度分佈進行驗證。適用於短文本的策略,未必適用於視覺文件或長尾語料庫。

### 品質優先 首先設定 `tokenann`。將其作為 MaxSim 近似品質的基準。### 平衡型 若需降低成本且不希望增加訓練流程,請嘗試muvera### 壓縮 當學習到的行級壓縮表現可能優於固定隨機投影時,請嘗試使用lemur

本草案所參考的文獻

  • Milvus 針對emb_list_strategyretrieval_ann_ratioemb_list_rerank 進行的測試。

  • Milvus 配置檔中關於伺服器端索引預設值的處理,詳見knowhere 區段。

  • Knowhere 參數定義,包含預設值及受支援的策略名稱。

  • 針對僅支援 fp32 的 MUVERA/LEMUR 以及僅支援 DiskANN TokenANN 的 Knowhere 相容性檢查。

  • 針對 MaxSim 候選結果檢索,比較 TokenANN、MUVERA 和 LEMUR 的內部評估筆記。

發佈須知:在對外發佈前,請確認目標 Milvus 版本中哪些參數獲得官方支援,以及該產品是打算公開所有低階 Knowhere 參數,還是僅公開較小的已文件化子集。