选择 EmbeddingList 搜索策略

EmbeddingList 搜索策略决定了 Milvus 如何为 EmbeddingList 搜索构建近似候选项索引。默认策略为tokenann 。当嵌入列表较大、TokenANN 计算成本过高,或者学习到的/压缩的行级表示更合适时,您可以切换到muveralemur 。 当启用emb_list_rerank 时,最终结果仍由MaxSim重新排序生成。

搜索策略存在的意义

EmbeddingList 专为包含多个向量的行而设计,例如文本文档中的词向量、视觉文档中的片段向量,或视频中的片段向量。MaxSim 并非将一个查询向量与一个行向量进行比较,而是将查询嵌入列表与文档嵌入列表进行比较,并聚合最佳匹配结果。

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

### 问题 - 每行可能包含多个向量。 - 对所有行进行精确 MaxSim 计算开销巨大。 - 索引大小和搜索延迟可能迅速增加。### 策略 - 使用近似的第一阶段检索方法。 - 检索的候选项数量超过请求的 topK。 - 使用精确 MaxSim 对候选项进行重新排序。

从这个意义上说,emb_list_strategy 主要是一种索引构建和候选项检索策略。它在构建索引时进行配置,并决定如何生成第一阶段的 ANN 候选集。随后,搜索时的参数(如retrieval_ann_ratioemb_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_projectionsmuvera_num_repeatsmuvera_seed

LEMUR

lemur 通过训练模型,将每个Embeddings列表压缩为固定维度的表示。第一阶段的ANN搜索在已学习的行级向量上运行,并使用MaxSim对候选结果进行重新排序。

当学习压缩的收益足以抵消训练成本时,建议使用 LEMUR。它在低区分度 Embeddings 空间和多模态检索中表现良好,但应针对目标语料库进行验证,因为其效果可能受文档长度分布的影响。

  • 适用场景:视觉文档检索、多模态片段嵌入、低区分度 Embeddings 空间,以及 TokenANN 难以处理的大型 Embeddings 列表。

  • 较不适用:频繁更新的语料库、文档长度高度偏斜的高区分度Embeddings空间,以及训练成本无法接受的工作负载。

  • 重要参数: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 配置文件中的默认值将广泛应用于该类型和阶段的所有索引。当不同的 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

建议的评估工作流

  1. 当数据集规模允许时,请以tokenann 作为质量基准。

  2. 使用muvera 运行相同的查询,并比较召回率、nDCG、延迟和索引大小。

  3. 当嵌入列表较大、嵌入空间存在噪声,或工作负载属于视觉或多模态类型时,请尝试使用lemur

  4. 在调整过多构建时参数之前,请先对retrieval_ann_ratio 进行调优。若召回率较低,则增加该值;若延迟过高,则减少该值。

  5. 务必使用具有代表性的查询和文档长度分布进行验证。在短文本上有效的策略,在视觉文档或长尾语料库中可能失效。

### 质量优先 首先从 `tokenann` 开始。将其作为 MaxSim 近似质量的基准。### 平衡型 当您需要在不增加训练管道的情况下降低成本时,请尝试muvera### 压缩 若学习到的行级压缩预计能优于固定随机投影,请尝试使用lemur

本草案参考文献

  • Milvus 针对emb_list_strategyretrieval_ann_ratio 以及emb_list_rerank 进行的测试。

  • Milvus 配置文件中关于服务器端索引默认值的处理,详见knowhere 部分。

  • Knowhere中关于默认值和支持策略名称的参数定义。

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

  • 关于 MaxSim 候选项检索中 TokenANN、MUVERA 和 LEMUR 的内部评估说明。

发布说明:在对外发布前,请确认目标 Milvus 版本中哪些参数得到官方支持,以及该产品是希望公开所有低级 Knowhere 参数,还是仅公开文档中记载的较小子集。

翻译自DeepL

想要更快、更简单、更好用的 Milvus SaaS服务 ?

Zilliz Cloud是基于Milvus的全托管向量数据库,拥有更高性能,更易扩展,以及卓越性价比

免费试用 Zilliz Cloud
反馈

此页对您是否有帮助?