選擇 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_ratio 和emb_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_projections、muvera_num_repeats以及muvera_seed。
LEMUR
lemur 透過訓練模型,將每個嵌入清單壓縮為固定維度的表示。第一階段的 ANN 搜尋會針對已學習的行級向量進行,並使用 MaxSim 對候選結果進行重新排序。
當學習壓縮的效益足以抵銷訓練成本時,建議使用 LEMUR。它對於低辨別度嵌入空間和多模態檢索效果良好,但應針對目標語料庫進行驗證,因為其效果可能受文件長度分佈的影響。
適用情境:視覺文件檢索、多模態片段嵌入、低區分度嵌入空間,以及 TokenANN 難以實行的龐大嵌入清單。
較不適用:頻繁變動的語料庫、文件長度高度偏斜的高區分度嵌入空間,以及訓練成本無法接受的工作負載。
重要參數:
lemur_hidden_dim、lemur_num_train_samples、lemur_num_epochs、lemur_batch_size、lemur_learning_rate、lemur_seed以及lemur_num_layers。
預設行為與設定
Knowhere 中的預設 EmbeddingList 策略為tokenann 。若未指定emb_list_strategy ,Knowhere 將使用 TokenANN。搜尋時的預設值包含retrieval_ann_ratio=3.0 及emb_list_rerank=true 。
各策略的配置項目
下表列出了各策略專屬的配置項目。在 Milvus 中,建置時的配置項目通常會在建立索引時透過params 映射傳入。若需伺服器端的預設值,應在 Milvus 配置檔案的knowhere 區段中進行定義。
| 策略 | 配置項目 | 階段 | 預設值 | 何時應變更 |
|---|---|---|---|---|
tokenann | emb_list_strategy="tokenann" | 索引建置 | tokenann | 當您希望採用預設的元素向量索引行為,或使用 DiskANN 時,請明確使用此設定。 |
muvera | emb_list_strategy="muvera" | 索引建置 | tokenann | 當您希望在不進行訓練的情況下,執行行級別的編碼檢索時,請使用此選項。 |
muvera | muvera_num_projections | 索引建置 | 4 | 控制 SimHash 的投影次數。較高的數值會建立更多桶位,可能提升編碼品質,但會增加編碼維度。 |
muvera | muvera_num_repeats | 索引建置 | 7 | 控制要串接多少個獨立的 FDE 編碼。較高的數值可能提升魯棒性,但會增加索引/搜尋成本。 |
muvera | muvera_seed | 索引建立 | 42 | 用於設定可重現的隨機投影,特別是在測試和基準比較中。 |
lemur | emb_list_strategy="lemur" | 索引建置 | tokenann | 當預期學習型行級壓縮的表現優於固定隨機投影時,請使用此設定。 |
lemur | lemur_hidden_dim | 索引建置 | 256 | 控制壓縮表示的大小。增加數值可提升容量;減少數值則可降低記憶體佔用並加快檢索速度。 |
lemur | lemur_num_train_samples | 索引建置 | 20000 | 當語料庫多樣性高且學習到的壓縮效果不足時,應增加此參數;僅在進行小型測試或需加快建置速度時才應減少。 |
lemur | lemur_num_epochs | 索引建置 | 50 | 若訓練尚未收斂,請增加;若建置時間是主要限制因素,則減少。 |
lemur | lemur_batch_size | 索引建置 | 512 | 請根據訓練吞吐量與記憶體使用量進行調整。 |
lemur | lemur_learning_rate | 索引建置 | 0.001 | 當訓練不穩定或收斂過慢時進行調整。 |
lemur | lemur_seed | 索引建置 | 42 | 設定此參數以確保訓練過程可重複。 |
lemur | lemur_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 的運算成本過高。 | lemur 或muvera |
| 文件長度是否存在高度偏斜? | 某些行所含的向量遠多於其他行。 | 請先從muvera 開始;並仔細驗證lemur 。 |
建議的評估工作流程
當資料集大小允許時,請以
tokenann作為品質基準。使用
muvera執行相同的查詢,並比較召回率、nDCG、延遲及索引大小。當嵌入清單龐大、嵌入空間雜訊較多,或工作負載屬視覺或多模態時,請嘗試使用
lemur。在調整過多建置時參數之前,請先微調 `
retrieval_ann_ratio`。若召回率偏低,請增加該參數;若延遲過高,則應減少該參數。務必使用具代表性的查詢及文件長度分佈進行驗證。適用於短文本的策略,未必適用於視覺文件或長尾語料庫。
### 品質優先 首先設定 `tokenann`。將其作為 MaxSim 近似品質的基準。 | ### 平衡型 若需降低成本且不希望增加訓練流程,請嘗試muvera 。 | ### 壓縮 當學習到的行級壓縮表現可能優於固定隨機投影時,請嘗試使用lemur 。 |
|---|
本草案所參考的文獻
Milvus 針對
emb_list_strategy、retrieval_ann_ratio及emb_list_rerank進行的測試。Milvus 配置檔中關於伺服器端索引預設值的處理,詳見
knowhere區段。Knowhere 參數定義,包含預設值及受支援的策略名稱。
針對僅支援 fp32 的 MUVERA/LEMUR 以及僅支援 DiskANN TokenANN 的 Knowhere 相容性檢查。
針對 MaxSim 候選結果檢索,比較 TokenANN、MUVERA 和 LEMUR 的內部評估筆記。
發佈須知:在對外發佈前,請確認目標 Milvus 版本中哪些參數獲得官方支援,以及該產品是打算公開所有低階 Knowhere 參數,還是僅公開較小的已文件化子集。