跳到主要内容
版本:v3.0.x

选择 EmbeddingList Search Strategy

EmbeddingList search strategy 决定 Milvus 如何为 EmbeddingList search 构建近似候选索引。默认 strategy 为 tokenann。当 embedding list 较大、TokenANN 成本过高,或更适合使用学习得到的/压缩后的行级表示时,你可以切换为 muveralemur。启用 emb_list_rerank 后,最终结果仍由 MaxSim reranking 生成。

为什么需要 Search Strategies

EmbeddingList 专为包含多个向量的行而设计,例如文本文档中的 token Embedding、视觉文档中的 patch Embedding,或视频中的 clip Embedding。MaxSim 不是将一个查询向量与一个行向量进行比较,而是将查询 embedding list 与文档 embedding list 进行比较,并聚合最佳匹配结果。

这能提供更强的表示能力,但精确 MaxSim 在大规模场景下成本很高。暴力 MaxSim 搜索需要将查询向量与每个候选行中的每个向量进行比较。对于生产搜索来说,这通常太慢。

### 问题 - 每行可能包含多个向量。 - 对所有行执行精确 MaxSim 成本很高。 - Index 大小和搜索延迟可能会快速增长。### 策略 - 使用近似的一阶段检索方法。 - 检索比请求的 topK 更多的候选项。 - 使用精确 MaxSim 对候选项进行 rerank。

从这个角度看,emb_list_strategy 主要是一种构建 index 和检索候选项的策略。它在构建 index 时配置,并决定一阶段 ANN 候选集如何生成。随后,搜索时参数(如 retrieval_ann_ratioemb_list_rerank)会控制检索多少候选项,以及是否应用 MaxSim reranking。


可用策略

策略候选检索单元解决的问题最适用场景主要权衡
tokenann每行内的单个向量保留原始向量,避免压缩损失。质量优先的搜索、短或中等长度的 embedding list、高区分度 Embedding。Index 更大,候选检索成本更高。
muvera每行一个编码向量无需训练即可将 embedding list 压缩为固定维度的 FDE 表示。较长文档、高区分度 Embedding,以及 TokenANN 过重的场景。随机投影会引入近似损失;FDE 维度会影响延迟。
lemur每行一个学习得到的向量学习特定于语料库的压缩方式,将 embedding list 压缩为固定维度的行向量。低区分度 Embedding、多模态或视觉文档检索、大规模 embedding list。需要训练,并且可能对语料库分布和文档长度偏差敏感。

TokenANN

tokenann 会为 embedding list 中的每个 vector 建立 Index。搜索期间,每个 query vector 都会执行 ANN retrieval,匹配到的 vector 会聚合回其所在行,并使用 MaxSim 对生成的行候选进行 rerank。

当质量是第一优先级时,请使用 TokenANN。 它是对原始 MaxSim 计算最接近的近似,因为它会在第一阶段 Index 中保留所有可用 vector。

  • 适用场景: 短文本 chunk、vector 数量较少或中等的行、强 token-level 语义区分、对质量敏感的 baseline。

  • 不太适合: 超长文档、包含数千个 patch vector 的视觉页面、严格的内存或延迟预算。

  • 元素级行为: TokenANN 可以先从单个 vector 中检索候选,再将其聚合回行。最终的 EmbeddingList 搜索结果在经过 MaxSim scoring 后仍然是行级结果。

MUVERA

muvera 使用随机投影将每个 embedding list 编码为固定维度向量。这样可以将第一阶段检索转换为标准的行级向量搜索。随后使用 MaxSim 对候选结果 Reranking。

当 TokenANN 过重但你不想引入训练步骤时,使用 MUVERA。 它是在质量和成本之间取得平衡的实用选择。

  • 适合场景: 长文本档案、高区分度的 Embedding 空间,以及需要比 TokenANN 更小 Index 规模的工作负载。

  • 不太适合: 低区分度的 Embedding 空间,或 FDE 表示对延迟预算而言维度过高的场景。

  • 重要参数muvera_num_projectionsmuvera_num_repeatsmuvera_seed

LEMUR

lemur 会训练一个模型,将每个 embedding list 压缩为固定维度表示。第一阶段 ANN Search 基于学习得到的行级向量执行,随后使用 MaxSim 对候选结果 Reranking。

当学习式压缩带来的收益值得训练成本时,使用 LEMUR。 它适用于低区分度 embedding 空间和多模态检索,但应基于目标语料进行验证,因为它可能对文档长度分布较敏感。

  • 适合场景:视觉文档搜索、多模态 patch Embedding、低区分度 embedding 空间,以及 TokenANN 不适用的大型 embedding lists。

  • 不太适合:频繁变化的语料库、文档长度高度偏斜的高区分度 Embedding,以及无法接受训练成本的工作负载。

  • 重要参数lemur_hidden_dimlemur_num_train_sampleslemur_num_epochslemur_batch_sizelemur_learning_ratelemur_seedlemur_num_layers

Default Behavior and Configuration

Knowhere 中默认的 EmbeddingList 策略是 tokenann。如果你未指定 emb_list_strategy,Knowhere 会使用 TokenANN。搜索时的默认值包括 retrieval_ann_ratio=3.0emb_list_rerank=true

Configuration Items by Strategy

下表列出了各策略专用的配置项。在 Milvus 中,构建时配置项通常在创建 Index 时通过 params map 传入。如果需要服务器端默认值,应在 Milvus 配置文件的 knowhere section 下定义。

Strategy配置项阶段默认值何时修改
tokenannemb_list_strategy="tokenann"Index buildtokenann当你想显式使用默认的元素向量索引行为,或使用 DiskANN 时设置。
muveraemb_list_strategy="muvera"Index buildtokenann当你需要无需训练的行级编码检索时使用。
muveramuvera_num_projectionsIndex build4控制 SimHash 投影数量。较高的值会创建更多 bucket,可能提升编码质量,但会增加编码后的维度。
muveramuvera_num_repeatsIndex build7控制拼接多少个独立的 FDE 编码。较高的值可能提升稳健性,但会增加 Index/Search 成本。
muveramuvera_seedIndex build42用于设置可复现的随机投影,尤其适用于测试和 benchmark 对比。
lemuremb_list_strategy="lemur"Index buildtokenann当你预期学习式行级压缩比固定随机投影效果更好时使用。
lemurlemur_hidden_dimIndex build256控制压缩表示的大小。提高该值可增加容量;降低该值可减少内存并加快检索。
lemurlemur_num_train_samplesIndex build20000当语料较多样且学习式压缩欠拟合时提高该值;仅在小规模测试或需要更快构建时降低该值。
lemurlemur_num_epochsIndex build50如果训练尚未收敛,可提高该值;当构建时间是主要约束时,可降低该值。
lemurlemur_batch_sizeIndex build512根据训练吞吐和内存使用情况进行调优。
lemurlemur_learning_rateIndex build0.001当训练不稳定或收敛过慢时调整。
lemurlemur_seedIndex build42用于设置可复现的训练运行。
lemurlemur_num_layersIndex build2仅当语料需要表达能力更强的特征提取器,并且你可以承担额外训练成本时提高该值。
All strategiesretrieval_ann_ratioSearch3.0提高该值可检索更多第一阶段候选并提升召回率;降低该值可减少延迟。
All strategiesemb_list_rerankSearchtrue保持启用以进行 MaxSim reranking。仅在直接衡量第一阶段 ANN 质量的受控实验中禁用。

在 Milvus 中配置 Strategy

在 Milvus 中,为 EmbeddingList 字段(例如 StructArray vector 子字段)创建 Index 时,strategy 会作为 index parameter 传入。

Python
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 map 中提供 LEMUR 训练参数。

Python
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 中配置 Server-side Defaults

Milvus 也可以从 milvus.yaml 填充 Index 参数。相关配置位于 knowhere。参数按 Index 类型和阶段组织,格式为 knowhere.<INDEX_TYPE>.<stage>.<parameter>。用户提供的 Index 参数优先于这些默认值。

YAML
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

策略选择优先使用每个 Index 的参数。 Milvus 配置文件中的默认值会广泛应用于该类型和阶段的 Index。当不同 Collection 或字段需要不同的 EmbeddingList 策略时,请使用 create_index 参数。

Configure Candidate Retrieval at Search Time

该策略决定索引的构建方式。搜索时,使用 retrieval_ann_ratio 控制在 MaxSim rerank 之前检索多少第一阶段候选项。较大的值通常可以提高召回率,但会增加延迟。

Python
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_ratioSearch3.0第一轮 ANN 的候选项扩展因子。
emb_list_rerankSearchtrue是否使用 MaxSim 对检索到的候选项进行 rerank。

兼容性说明: MUVERA 和 LEMUR 目前在 Knowhere 中支持 fp32 数据。DiskANN 仅在 TokenANN 策略下支持 EmbeddingList。如果你使用非 fp32 向量类型或 DiskANN,请在更改默认值之前确认策略支持情况。

如何选择 Strategy

没有通用的最佳 Strategy。你应根据 embedding-list 长度、embedding space 的区分度、延迟预算、Index 大小,以及是否可以接受训练步骤来选择。

问题判断信号推荐起点
是否需要高质量 baseline?你希望在优化成本前,先衡量实际可用的最佳近似效果。tokenann
行内向量数量是较少还是中等?每行包含少量 token、patch 或 clip vectors。tokenann
TokenANN 是否过大或过慢?Index 大小或第一阶段检索延迟成为瓶颈。muvera
是否希望在不训练的情况下进行压缩?你需要更简单的运维模型和可复现的编码。muvera
embedding space 区分度是否较低?Token-level ANN 候选结果噪声较多,且 random projection 无法保留足够信号。lemur
workload 是否为视觉或多模态?行内包含大量 patch vectors,且 TokenANN 成本过高。lemurmuvera
文档长度是否高度倾斜?部分行包含的向量数量远多于其他行。muvera 开始;谨慎验证 lemur

Suggested Evaluation Workflow

  1. 当数据集规模允许时,先使用 tokenann 作为质量基线。

  2. 使用 muvera 运行相同查询,并比较 recall、nDCG、latency 和 index size。

  3. 当 embedding list 较大、Embedding 空间噪声较多,或 workload 属于视觉或多模态场景时,尝试 lemur

  4. 在修改过多 build-time 参数之前,先调优 retrieval_ann_ratio。如果 recall 较低,就增大该值;如果 latency 过高,就减小该值。

  5. 始终基于具有代表性的查询和文档长度分布进行验证。适用于短文本的策略,不一定适用于视觉文档或长尾语料库。

### Quality-first
tokenann 开始。将其作为 MaxSim 近似质量的基线。
### Balanced
当你需要降低成本且不想引入 training pipeline 时,尝试 muvera
### Compressed
当 learned row-level compression 可能优于 fixed random projection 时,尝试 lemur

本草稿使用的参考资料

  • Milvus 针对 emb_list_strategyretrieval_ann_ratioemb_list_rerank 的测试。

  • Milvus 配置文件处理逻辑,用于 knowhere 配置节下的服务端 index 默认值。

  • Knowhere 参数定义,用于默认值和支持的 strategy 名称。

  • Knowhere 兼容性检查,包括仅支持 fp32 的 MUVERA/LEMUR,以及 DiskANN 仅支持 TokenANN。

  • 内部评估说明,对比 TokenANN、MUVERA 和 LEMUR 在 MaxSim candidate retrieval 中的表现。

发布说明: 对外发布前,请确认目标 Milvus 版本中哪些参数已被官方支持,以及产品侧是希望公开所有低层 Knowhere 参数,还是只公开更小范围的文档化参数子集。