选择 EmbeddingList Search Strategy
EmbeddingList search strategy 决定 Milvus 如何为 EmbeddingList search 构建近似候选索引。默认 strategy 为 tokenann。当 embedding list 较大、TokenANN 成本过高,或更适合使用学习得到的/压缩后的行级表示时,你可以切换为 muvera 或 lemur。启用 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_ratio 和 emb_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_projections、muvera_num_repeats和muvera_seed。
LEMUR
lemur 会训练一个模型,将每个 embedding list 压缩为固定维度表示。第一阶段 ANN Search 基于学习得到的行级向量执行,随后使用 MaxSim 对候选结果 Reranking。
当学习式压缩带来的收益值得训练成本时,使用 LEMUR。 它适用于低区分度 embedding 空间和多模态检索,但应基于目标语料进行验证,因为它可能对文档长度分布较敏感。
-
适合场景:视觉文档搜索、多模态 patch Embedding、低区分度 embedding 空间,以及 TokenANN 不适用的大型 embedding lists。
-
不太适合:频繁变化的语料库、文档长度高度偏斜的高区分度 Embedding,以及无法接受训练成本的工作负载。
-
重要参数:
lemur_hidden_dim、lemur_num_train_samples、lemur_num_epochs、lemur_batch_size、lemur_learning_rate、lemur_seed和lemur_num_layers。
Default Behavior and Configuration
Knowhere 中默认的 EmbeddingList 策略是 tokenann。如果你未指定 emb_list_strategy,Knowhere 会使用 TokenANN。搜索时的默认值包括 retrieval_ann_ratio=3.0 和 emb_list_rerank=true。
Configuration Items by Strategy
下表列出了各策略专用的配置项。在 Milvus 中,构建时配置项通常在创建 Index 时通过 params map 传入。如果需要服务器端默认值,应在 Milvus 配置文件的 knowhere section 下定义。
| Strategy | 配置项 | 阶段 | 默认值 | 何时修改 |
|---|---|---|---|---|
tokenann | emb_list_strategy="tokenann" | Index build | tokenann | 当你想显式使用默认的元素向量索引行为,或使用 DiskANN 时设置。 |
muvera | emb_list_strategy="muvera" | Index build | tokenann | 当你需要无需训练的行级编码检索时使用。 |
muvera | muvera_num_projections | Index build | 4 | 控制 SimHash 投影数量。较高的值会创建更多 bucket,可能提升编码质量,但会增加编码后的维度。 |
muvera | muvera_num_repeats | Index build | 7 | 控制拼接多少个独立的 FDE 编码。较高的值可能提升稳健性,但会增加 Index/Search 成本。 |
muvera | muvera_seed | Index build | 42 | 用于设置可复现的随机投影,尤其适用于测试和 benchmark 对比。 |
lemur | emb_list_strategy="lemur" | Index build | tokenann | 当你预期学习式行级压缩比固定随机投影效果更好时使用。 |
lemur | lemur_hidden_dim | Index build | 256 | 控制压缩表示的大小。提高该值可增加容量;降低该值可减少内存并加快检索。 |
lemur | lemur_num_train_samples | Index build | 20000 | 当语料较多样且学习式压缩欠拟合时提高该值;仅在小规模测试或需要更快构建时降低该值。 |
lemur | lemur_num_epochs | Index build | 50 | 如果训练尚未收敛,可提高该值;当构建时间是主要约束时,可降低该值。 |
lemur | lemur_batch_size | Index build | 512 | 根据训练吞吐和内存使用情况进行调优。 |
lemur | lemur_learning_rate | Index build | 0.001 | 当训练不稳定或收敛过慢时调整。 |
lemur | lemur_seed | Index build | 42 | 用于设置可复现的训练运行。 |
lemur | lemur_num_layers | Index build | 2 | 仅当语料需要表达能力更强的特征提取器,并且你可以承担额外训练成本时提高该值。 |
| All strategies | retrieval_ann_ratio | Search | 3.0 | 提高该值可检索更多第一阶段候选并提升召回率;降低该值可减少延迟。 |
| All strategies | emb_list_rerank | Search | true | 保持启用以进行 MaxSim reranking。仅在直接衡量第一阶段 ANN 质量的受控实验中禁用。 |
在 Milvus 中配置 Strategy
在 Milvus 中,为 EmbeddingList 字段(例如 StructArray vector 子字段)创建 Index 时,strategy 会作为 index parameter 传入。
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 训练参数。
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 参数优先于这些默认值。
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 之前检索多少第一阶段候选项。较大的值通常可以提高召回率,但会增加延迟。
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 | Search | 3.0 | 第一轮 ANN 的候选项扩展因子。 |
emb_list_rerank | Search | true | 是否使用 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 成本过高。 | lemur 或 muvera |
| 文档长度是否高度倾斜? | 部分行包含的向量数量远多于其他行。 | 从 muvera 开始;谨慎验证 lemur。 |
Suggested Evaluation Workflow
-
当数据集规模允许时,先使用
tokenann作为质量基线。 -
使用
muvera运行相同查询,并比较 recall、nDCG、latency 和 index size。 -
当 embedding list 较大、Embedding 空间噪声较多,或 workload 属于视觉或多模态场景时,尝试
lemur。 -
在修改过多 build-time 参数之前,先调优
retrieval_ann_ratio。如果 recall 较低,就增大该值;如果 latency 过高,就减小该值。 -
始终基于具有代表性的查询和文档长度分布进行验证。适用于短文本的策略,不一定适用于视觉文档或长尾语料库。
| ### Quality-first 从 tokenann 开始。将其作为 MaxSim 近似质量的基线。 | ### Balanced 当你需要降低成本且不想引入 training pipeline 时,尝试 muvera。 | ### Compressed 当 learned row-level compression 可能优于 fixed random projection 时,尝试 lemur。 |
|---|
本草稿使用的参考资料
-
Milvus 针对
emb_list_strategy、retrieval_ann_ratio和emb_list_rerank的测试。 -
Milvus 配置文件处理逻辑,用于
knowhere配置节下的服务端 index 默认值。 -
Knowhere 参数定义,用于默认值和支持的 strategy 名称。
-
Knowhere 兼容性检查,包括仅支持 fp32 的 MUVERA/LEMUR,以及 DiskANN 仅支持 TokenANN。
-
内部评估说明,对比 TokenANN、MUVERA 和 LEMUR 在 MaxSim candidate retrieval 中的表现。
发布说明: 对外发布前,请确认目标 Milvus 版本中哪些参数已被官方支持,以及产品侧是希望公开所有低层 Knowhere 参数,还是只公开更小范围的文档化参数子集。