选择 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 | 每行中的单个向量 | 保留原始向量,避免压缩损失。 | 质量优先的搜索、短或中长度的Embeddings列表、高区分度的Embeddings。 | 索引较大,且候选项检索成本较高。 |
muvera | 每行一个编码向量 | 无需训练即可将 Embeddings 列表压缩为固定维度的 FDE 表示形式。 | 适用于较长的文档、高区分度的 Embeddings,以及 TokenANN 过于繁重的场景。 | 随机投影会引入近似损失;FDE 维度会影响延迟。 |
lemur | 每行一个学习得到的向量 | 从Embeddings列表到固定维度的行向量,学习针对特定语料库的压缩方法。 | 低区分度Embeddings、多模态或视觉文档检索、大型Embeddings列表。 | 需要训练,且可能对语料库分布和文档长度偏差敏感。 |
TokenANN
tokenann 为嵌入列表中的每个向量建立索引。在搜索过程中,每个查询向量执行 ANN 检索,匹配的向量被聚合回其所在行,最终得到的行候选结果通过 MaxSim 重新排序。
当质量是首要考虑因素时,请使用 TokenANN。由于它在第一阶段索引中保留了所有向量,因此这是对原始 MaxSim 计算最接近的近似。
适用场景:短文本片段、向量数量较少或适中的行、强烈的令牌级语义分离、对质量要求较高的基准测试。
较不适用:非常长的文档、包含数千个补丁向量的视觉页面、内存或延迟限制严格的场景。
元素级行为:TokenANN 可在将向量聚合回行之前,从单个向量中检索候选项。经过 MaxSim 评分后,最终的 EmbeddingList 搜索结果仍为行级。
MUVERA
muvera 通过随机投影将每个 Embeddings 列表编码为固定维度的向量。这将第一阶段检索转化为标准的行级向量搜索。随后使用 MaxSim 对候选结果进行重新排序。
当 TokenANN 计算开销过大,但您又不想进行训练步骤时,请使用 MUVERA。它在质量与成本之间提供了一个实用的折中方案。
适用场景:长文本文档、高区分度 Embeddings 空间,以及需要比 TokenANN 更小索引大小的任务。
不适用场景:低区分度的Embeddings空间,或FDE表示维度过高导致超出延迟预算的情况。
重要参数:
muvera_num_projections、muvera_num_repeats和muvera_seed。
LEMUR
lemur 通过训练模型,将每个Embeddings列表压缩为固定维度的表示。第一阶段的ANN搜索在已学习的行级向量上运行,并使用MaxSim对候选结果进行重新排序。
当学习压缩的收益足以抵消训练成本时,建议使用 LEMUR。它在低区分度 Embeddings 空间和多模态检索中表现良好,但应针对目标语料库进行验证,因为其效果可能受文档长度分布的影响。
适用场景:视觉文档检索、多模态片段嵌入、低区分度 Embeddings 空间,以及 TokenANN 难以处理的大型 Embeddings 列表。
较不适用:频繁更新的语料库、文档长度高度偏斜的高区分度Embeddings空间,以及训练成本无法接受的工作负载。
重要参数:
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 配置文件中的默认值将广泛应用于该类型和阶段的所有索引。当不同的 Collections 或字段需要不同的 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,请在更改默认设置前确认策略是否支持。
如何选择策略
没有放之四海皆准的最佳策略。请根据嵌入列表长度、Embeddings空间的区分度、延迟预算、索引大小以及是否能承担训练步骤等因素进行选择。
| 问题 | Signal | 推荐的起点 |
|---|---|---|
| 是否需要高质量的基线模型? | 您希望在优化成本之前,先评估最佳的实用近似方案。 | tokenann |
| 向量行数较少还是中等? | 每行包含少量令牌、补丁或片段向量。 | tokenann |
| TokenANN 是否过大或运行过慢? | 索引大小或第一阶段检索延迟是瓶颈。 | muvera |
| 您是否希望在不进行训练的情况下实现压缩? | 您需要更简单的操作模型和可重现的编码方案。 | muvera |
| Embeddings空间的分辨率是否较低? | 令牌级人工神经网络(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 参数,还是仅公开文档中记载的较小子集。