跳到主要内容
版本:Cloud 开发指南

Boost Ranker
公测版

Boost Ranker 不单纯依赖基于向量距离计算的语义相似度,而是让你能够以有意义的方式影响搜索结果。它非常适合使用元数据过滤快速调整搜索结果的场景。

当搜索请求包含 Boost Ranker 函数时,Zilliz Cloud 使用该函数内的可选过滤条件在搜索结果候选集中查找匹配项,并通过应用指定的权重来提升这些匹配项的得分,从而在最终结果中提升或降低匹配实体的排名。

何时使用 Boost Ranker

与依赖交叉编码器模型或融合算法的其他 Ranker 不同,Boost Ranker 直接将可选的元数据驱动规则注入排序过程,这使其更适用于以下场景。

用例

示例

为什么Boost Ranker效果良好

业务驱动的内容优先级排序

  • 在电子商务搜索结果中突出展示优质产品

  • 通过高用户参与度指标(如浏览量、点赞数和分享数)提高内容的可见性

  • 在时效性搜索应用中提升近期内容的优先级

  • 优先展示来自已验证或可信来源的内容

  • 提升与精确短语或高相关性关键词匹配的结果

无需重建索引或修改向量嵌入模型(这些操作可能很耗时),你可以通过实时应用可选的元数据过滤器,立即提升或降低搜索结果中特定项目的排名。这种机制实现了灵活、动态的搜索排名,能轻松适应不断变化的业务需求。

战略性内容降权

  • 在不完全移除低库存商品的情况下降低其突显程度

  • 在不进行审查的情况下降低包含潜在令人反感词汇的内容的排名

  • 在保留旧留档以供技术搜索访问的同时对其进行降级处理

  • 在市场搜索中巧妙降低竞品的可见度

  • 降低具有低质量迹象(如格式问题、篇幅较短等)的内容的相关性

您还可以组合多个 Boost Ranker,以实现更动态、更稳健的基于权重的排序策略。

Boost Ranker 工作机制

下图展示了Boost Ranker 的主要工作流程。

KIAbw3sGWhM3prbchcrcPiMZnTh

当你插入数据时,Zilliz Cloud 会将它们分配到不同的 Segment 中。当你进行搜索时,每个 Segment 都会返回一组指定数量候选结果,Zilliz Cloud 会对所有 Segment 返回的候选结果进行排序,并将其归约为指定数量的最终结果。在接收到携带 Boost Ranker 的搜索请求时,Zilliz Cloud 会将 Boost Ranker 应用于每个 Segment 返回的候选搜索结果,以防止可能的精度损失并提高召回率。

在最终确定结果之前,Zilliz Cloud 会使用 Boost Ranker 对这些候选结果进行如下处理:

  1. 应用在 Boost Ranker 中指定的可选过滤表达式,以识别与该表达式匹配的 Entity。

  2. 应用 Boost Ranker 中指定的权重来提升已识别 Entity 的得分。

📘说明

在多向量混合搜索中,您不能将 Boost Ranker 用于多路结果的重排。但是,您可以在其子请求(AnnSearchRequest)中使用。

Boost Ranker 示例

以下示例展示了在单向量搜索中使用 Boost Ranker 的情况,该搜索需要返回前五个最相关的实体,并为具有摘要文档类型的实体的得分添加权重。

  1. 分阶段收集搜索结果候选对象。

    下表假设 Milvus 将实体分配到两个段(00010002)中,每个段返回五个候选实体。

    ID

    文档类型

    得分

    排名

    117

    摘要

    0.344

    1

    0001

    89

    摘要

    0.456

    2

    0001

    257

    正文

    0.578

    3

    0001

    358

    标题

    0.788

    4

    0001

    168

    正文

    0.899

    5

    0001

    46

    正文

    0.189

    1

    0002

    48

    正文

    0265

    2

    0002

    561

    摘要

    0.366

    3

    0002

    344

    摘要

    0.444

    4

    0002

    276

    摘要

    0.845

    5

    0002

  2. 应用在Boost Ranker中指定的过滤表达式doctype='abstract')。

    如以下表格中的DocType字段所示,Milvus会将所有实体的doctype设置为abstract,以便进一步处理。

    ID

    文档类型

    得分

    排名

    117

    摘要

    0.344

    1

    0001

    89

    摘要

    0.456

    2

    0001

    257

    正文

    0.578

    3

    0001

    358

    标题

    0.788

    4

    0001

    168

    正文

    0.899

    5

    0001

    46

    正文

    0.189

    1

    0002

    48

    正文

    0265

    2

    0002

    561

    摘要

    0.366

    3

    0002

    344

    摘要

    0.444

    4

    0002

    276

    摘要

    0.845

    5

    0002

  3. 应用在Boost Ranker中指定的权重权重=0.5)。

    上一步中所有已识别的实体都将乘以提升排名器中指定的权重,从而导致其排名发生变化。

    ID

    文档类型

    得分

    加权分数

    (=得分×权重)

    排名

    117

    摘要

    0.344

    0.172

    1

    0001

    89

    摘要

    0.456

    0.228

    2

    0001

    257

    正文

    0.578

    0.578

    3

    0001

    358

    标题

    0.788

    0.788

    4

    0001

    168

    正文

    0.899

    0.899

    5

    0001

    561

    摘要

    0.366

    0.183

    1

    0002

    46

    正文

    0.189

    0.189

    2

    0002

    344

    摘要

    0.444

    0.222

    3

    0002

    48

    正文

    0.265

    0.265

    4

    0002

    276

    摘要

    0.845

    0.423

    5

    0002

    📘注释

    权重必须是你选择的一个浮点数。在像上述示例这样的情况下,分数越小表示相关性越高,使用小于1的权重。否则,使用大于1的权重。

  4. 根据加权分数汇总所有细分市场的候选人,以确定最终结果。

    ID

    文档类型

    得分

    加权得分

    排名

    117

    摘要

    0.344

    0.172

    1

    0001

    561

    摘要

    0.366

    0.183

    2

    0002

    46

    正文

    0.189

    0.189

    3

    0002

    344

    摘要

    0.444

    0.222

    4

    0002

    89

    摘要

    0.456

    0.228

    5

    0001

使用 Boost Ranker

在本节中,您将看到如何使用Boost Ranker影响单向量搜索结果的示例。

创建一个 Boost Ranker

在将 Boost Ranker 作为搜索请求的重排器传递之前,您应该按照以下方式将 Boost Ranker 正确定义为重排函数:

from pymilvus import Function, FunctionType

ranker = Function(
name="boost",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "boost",
"filter": "doctype == 'abstract'",
"random_score": {
"seed": 126,
"field": "id"
},
"weight": 0.5
}
)

参数

必选?

描述

值/示例

name

此函数的唯一标识符

"rrf"

input_field_names

要应用该函数的向量字段列表(对于RRF排序器必须为空)

[]

function_type

要调用的函数类型;使用RE来指定重排序策略

FunctionType.RERANK

params.reranker

指定重排器的类型。

必须设置为boost才能使用 Boost Ranker。

"boost"

params.weight

指定将与原始搜索结果中任何匹配实体的得分相乘的权重。

该值应为浮点数。

  • 为强调匹配实体的重要性,将其设置为能提高分数的值。

  • 若要降低匹配实体的排名,可将此参数赋值为能降低其得分的值。

1

params.filter

指定用于在搜索结果实体中匹配实体的筛选表达式。它可以是过滤表达式概览中提到的任何有效基本筛选表达式。

注意:仅使用基本运算符,例如==><。使用高级运算符,例如text_matchphrase_match,将降低搜索性能。

"doctype == 'abstract'"

params.random_score

指定一个随机函数,该函数会随机生成一个介于01之间的值。它有以下两个可选参数:

  • 种子(数字)指定用于启动伪随机数生成器(PRNG)的初始值。

  • 字段 (字符串)指定一个字段的名称,该字段的值将用作生成随机数的随机因子。具有唯一值的字段就足够了。

    建议您同时设置种子字段,以通过使用相同的种子和字段值来确保各代之间的一致性。

{"seed": 126, "field": "id"}

使用单个 Boost Ranker 进行搜索

一旦Boost Ranker函数准备就绪,您就可以在搜索请求中引用它。以下示例假设您已经创建了一个包含以下字段的集合:idvectordoctype

from pymilvus import MilvusClient

# Connect to the Milvus server
client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

# Assume you have a collection set up

# Conduct a similarity search using the created ranker
client.search(
collection_name="my_collection",
data=[[-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911]],
anns_field="vector",
params={},
output_field=["doctype"],
ranker=ranker
)

使用多个 Boost Ranker 进行搜索

您可以在单个搜索中组合多个 Boost Ranker,以影响搜索结果。为此,您可以创建多个 Boost Ranker,并在 FunctionScore 实例中引用它们,并将 FunctionScore 实例用作搜索请求中的 Ranker。

以下示例展示了如何通过应用介于 0.81.2 之间的权重来修改所有已识别实体的分数。

from pymilvus import MilvusClient, Function, FunctionType, FunctionScore

# Create a Boost Ranker with a fixed weight
fix_weight_ranker = Function(
name="boost",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "boost",
"weight": 0.8
}
)

# Create a Boost Ranker with a randomly generated weight between 0 and 0.4
random_weight_ranker = Function(
name="boost",
input_field_names=[], # Must be an empty list
function_type=FunctionType.RERANK,
params={
"reranker": "boost",
"random_score": {
"seed": 126,
},
"weight": 0.4
}
)

# Create a Function Score
ranker = FunctionScore(
functions=[
fix_weight_ranker,
random_weight_ranker
],
params={
"boost_mode": "Multiply",
"function_mode": "Sum"
}
)

# Conduct a similarity search using the created Function Score
client.search(
collection_name="my_collection",
data=[[-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911]],
anns_field="vector",
params={},
output_field=["doctype"],
ranker=ranker
)

具体来说,有两个 Boost Ranker:一个对所有找到的实体应用固定权重,而另一个则为它们分配随机权重。然后,我们在 FunctionScore 中引用这两个 Boost Ranker,该 Ranker 还定义了权重如何影响找到的实体的得分。

下表列出了创建 FunctionScore 实例所需的参数。

参数

必填项?

描述

值/示例

functions

以列表形式指定目标 Ranker 的名称。

["fix_weight_ranker", "random_weight_ranker"]

params.boost_mode

指定指定的权重如何影响任何匹配实体的得分。

可能的值为:

  • Multiply

    表示加权值等于匹配实体的原始得分乘以指定的权重。

    这是默认值。

  • Sum

    表示加权值等于匹配实体的原始分数与指定权重之和

"Multiply"

params.function_mode

指定如何处理来自各种 Boost Ranker 的加权值。

可能的值为:

  • Multiply

    表示匹配实体的最终得分等于所有 Boost Ranker 的加权值的乘积。

    这是默认值。

  • Sum

    表示匹配实体的最终得分等于所有 Boost Ranker 的加权值之和。

"Multiply"