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

提升 RankerCompatible with Milvus v2.6.2+

Boost Ranker 并不完全依赖基于向量距离计算的语义相似性,而是让您以有意义的方式影响搜索结果。它是使用元数据过滤快速调整搜索结果的理想选择。

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

何时使用提升 Ranker

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

| 使用案例

|

实例

|

为什么 Boost Ranker 运行良好

| | --- | --- | --- | |

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

|

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

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

  • 在时效性强的搜索应用中突出近期内容

  • 优先搜索经过验证或可信来源的内容

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

|

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

| |

战略性内容降级

|

  • 在不完全删除低库存项目的情况下,降低其显著性

  • 在不进行审查的情况下,降低含有潜在不良词汇的内容的排名

  • 降低旧文档的排名,同时保持其在技术搜索中的可访问性

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

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

|

您还可以将多个提升 Ranker 结合起来,实施更动态、更强大的基于权重的排名策略。

提升 Ranker 的机制

下图说明了提升 Ranker 的主要工作流程。

Boost Ranker Mechanism提升 Ranker 机制

插入数据时,Milvus 会将数据分布到各个分段。在搜索过程中,每个分段都会返回一组候选数据,Milvus 会对这些来自所有分段的候选数据进行排名,从而产生最终结果。当搜索请求中包含提升 Ranker 时,Milvus 会将其应用到每个分段的候选结果中,以防止潜在的精度损失并提高召回率。

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

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

  2. 应用提升 Ranker 中指定的权重来提升已识别实体的分数。

说明

在多向量混合搜索中,不能将 Boost Ranker 用作排序器。不过,您可以在任何子请求中使用它作为排序器 (AnnSearchRequest)。

Boost Ranker 示例

下面的示例说明了 Boost Ranker 在单向量搜索中的使用,该搜索要求返回前五个最相关的实体,并为具有抽象文档类型的实体的得分添加权重。

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

    下表假定 Milvus 将实体 Distributed 为两个分段**(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. 应用提升 Ranker (weight=0.5) 中指定的权重

    上一步中确定的所有实体都将乘以提升 Ranker 中指定的权重,从而改变其排名。

    | ID

    |

    文件类型

    |

    得分

    |

    加权得分

    (= 分数 x 权重)

    |

    等级

    |

    分段

    | | --- | --- | --- | --- | --- | --- | |

    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 传递给搜索请求的 Ranker 之前,应将 Boost Ranker 正确定义为一个 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

|

|

此功能的唯一标识符

|

"boost"

| |

input_field_names

|

|

要应用该函数的向量字段列表(对于 Boost Ranker,必须为空)

|

[]

| |

function_type

|

|

要调用的函数类型;使用RERANK 指定 Reranking 策略

|

FunctionType.RERANK

| |

params.reranker

|

|

指定 Reranker 的类型。

使用 Boost Ranker 时必须设置为boost

|

"boost"

| |

params.weight

|

|

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

该值应为浮点数。

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

  • 若要降低匹配实体的重要性,可将该参数设置为降低其分数的值。

|

1

| |

params.filter

|

|

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

注意:只能使用基本操作符,如==,>, 或< 。使用高级操作符,如text_matchphrase_match ,会降低搜索性能。

|

"doctype == 'abstract'"

| |

params.random_score

|

|

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

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

  • field (字符串)指定字段名称,其值将用作生成随机数的随机因子。具有唯一值的字段即可。

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

|

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

|

使用单个提升 Ranker 搜索

一旦 Boost Ranker 函数准备就绪,您就可以在搜索请求中引用它。下面的示例假定您已经创建了一个 Collection,该 Collection 有以下字段:ID向量doctype

from pymilvus import MilvusClient

# Connect to the Milvus server
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)

# 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 中引用这两个 Ranker,它还定义了权重如何影响找到的实体的得分。

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

| 参数

|

是否需要?

|

说明

|

值/示例

| | --- | --- | --- | --- | |

functions

|

|

在列表中指定目标排序器的名称。

|

["fix_weight_ranker", "random_weight_ranker"]

| |

params.boost_mode

|

|

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

可能的值有

  • Multiply

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

    这是默认值。

  • Sum

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

|

"Sum"

| |

params.function_mode

|

|

指定如何处理来自不同提升 Ranker 的加权值。

可能的值有

  • Multiply

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

    这是默认值。

  • Sum

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

|

"Sum"

|