当前检索能力在检索范式中的定位:
检索后处理算子 是 VikingDB 提供的一种检索后处理能力(PostProcess),用于在检索召回和标量过滤之后,对候选数据进行进一步的过滤和优化,确保最终返回的搜索结果更加精准、高效。
在 VikingDB 中,后置处理算子可用于:
说明
后置处理算子是检索公共参数,您可以将其应用在向量检索、多模态检索等能力中。
在向量检索请求的基础上,您可以在 search 请求参数中指定 **post_process_ops、post_process_input_limit**子参数设定后置处理算子。
算子 | 适用字段类型 | 介绍 | 示例 |
|---|---|---|---|
score_fusion | string | 分数融合算子,用于融合指定的时空标量的分数。 |
|
string_contain | string | 关键词匹配过滤算子。表示该字段内容包含pattern。 |
|
string_match | string | 正则匹配过滤算子。 |
|
enum_freq_limiter | string | 频控算子。用于保证一次召回的结果中, 一个特定取值出现的总数不超过 |
|
分数加权融合(Score Fusion)是一项强大的检索后处理能力,允许在向量检索(ANN)分数的基础上,融合多个自定义的业务指标得分,从而生成一个更贴合业务需求的最终排序分数,search结果最终的排序和分数都是以此来计算。该功能通过一个灵活的加权公式,将向量相似性与业务逻辑紧密结合。
最终分数的计算遵循以下核心公式:final_score = origin_score * (1 - weight) + addition_score * weight
(0, 1) 之间。默认值0.5origin_score 和addition_score缩放到 (0,1) 区间内。当需要将不同分布的原始分数与业务分数进行融合时,建议开启此功能以获得更稳定和可预期的结果。归一化后的score计算公式如下:final_score = normed1(origin_score) * (1 - weight) + normed2(addition_score) * weight
addition_score 是一个累加值,由一个或多个 addition_item_score 相加得出:addition_score = Σ (addition_item_score)
每个 addition_item_score 代表一个独立的业务加分项,其计算方式为:addition_item_score = factor * base_value
base_value 的影响。可以将其设置为正数以实现加分,或设置为负数以实现降权或惩罚。默认为1.scalar_field): 直接使用文档中标量字段的数值作为 base_value。适用于如“点赞数”、“销量”等可以直接量化业务价值的场景。decay_func): 根据标量字段的数值,通过衰减函数(高斯、指数、线性)计算出一个 (0,1) 区间内的 base_value。适用于如“发布时间”这种与某个“中心点”的接近程度相关的场景。通过以上分层设计,分数加权融合功能提供了一个高度灵活且强大的工具,用以优化检索结果的排序,使其不仅相关,而且更具业务价值。
参数名 | 类型 | 必选 | 子参数 | 类型 | 必选 | 备注 |
|---|---|---|---|---|---|---|
op | string | 是 | 填 | |||
fusion_by | string | 是 | 填
| |||
addition_score_weight | float | 否 | 用于调节 addition_score 影响力的权重,取值范围(0,1),开区间,默认值 0.5。当fusion_by为 | |||
addition_score | list | 是 | 额外加分项,由一组自定义的业务指标得分加总而成,允许注入如时效性、热度、权威性、用户评分等多维度的业务逻辑。 | |||
factor | float | 否 | 系数。不填则默认为1。不得取0,绝对值不超过1000000 | |||
base_value_from | string | 是 | 填
| |||
field | string | 是 | 取值字段。支持的字段类型见 | |||
func | string |
| 衰减函数的类型。当
| |||
scale | any |
| 刻画衰减函数的衰减幅度。表示当输入参数取值为scale时,衰减函数结果为0.5。当
| |||
origin | any |
| 衰减函数的基准值。当
| |||
offset | any |
| 衰减函数的容忍距离。当
| |||
decay | float | 否 | 取值(0,1),开区间。与scale配合使用。默认0.5。 | |||
normalize_for_origin_score | Normalize(参数结构见下) | 否 | 对origin_score的归一化配置。若不填,则默认使用 | |||
normalize_for_addition_score | Normalize(参数结构见下) | 否 | 对addition_score的归一化配置。若不填,则默认使用 |
参数名 | 类型 | 必选 | 备注 |
|---|---|---|---|
enable | bool | 是 | 是否进行归一化。默认为true。 |
func | string | 否 | 归一化函数。若enable=true,则该参数生效,取值
|
arctan_factor | float | 否 | 默认1。当归一化函数选 |
arctan_offset | float | 否 | 默认0。当归一化函数选 |
主要有3种:线性衰减函数、指数衰减函数、高斯衰减函数,但它们的入参和输出形式是完全一致的。
参数名 | 类型 | 取值范围 | 必选 | 含义 |
|---|---|---|---|---|
distance | float | (-∞,﹢∞) | 标量字段值。例如,某条数据的时间戳字段值是1750671188。 | |
origin | float | (-∞,﹢∞) | 原点。作为参照的基准。计算函数时,实际的距离是abs(distance - origin)。例如,以检索时的时间为基准,可以设为time.now().timestamp() | |
scale | float | (0, ﹢∞) | 尺度。定义从原点+偏移的距离,在该距离处计算的分数将等于decay参数。scale越大,衰减地越慢。 | |
decay | float | (0,1) | 否 | 衰减参数。定义了如何按比例给定的距离对文档进行评分。当实际距离值为scale时,衰减函数的值刚好为decay。decay越靠近1,衰减地越慢。默认0.5. |
offset | float | [0,﹢∞) | 否 | 偏移量。衰减函数将仅计算距离大于定义偏移的文档的衰减函数。默认值为0。 |
import numpy as np def gaussian_decay(origin, scale, decay, offset, distance): """高斯衰减函数""" adjusted_dist = max(0, abs(distance - origin) - offset) sigma_square = (scale ** 2) / (-2*np.log(decay)) exponent = -(adjusted_dist ** 2) / (2 * sigma_square) return np.exp(exponent) def exp_decay(origin, scale, decay, offset, distance): """指数衰减函数""" adjusted_dist = max(0, abs(distance - origin) - offset) lambda_val = np.log(decay) / scale return np.exp(lambda_val * adjusted_dist) def linear_decay(origin, scale, decay, offset, distance): """线性衰减函数""" adjusted_dist = max(0, abs(distance - origin) - offset) slope = (1 - decay) / scale return max(0, 1 - slope * adjusted_dist) # 地理距离衰减函数: # 与上述基本相同,abs(distance - origin)部分,变为 地理坐标点到中心坐标点的距离。
假设数据集是商品,有“销量”字段f_sales(int64类型)、“投诉”字段f_complain(int64类型)
场景:我希望召回时,销量数越多的越优先召回,投诉量越少的越优先召回。
销量配置:以标量大小线性排序即可,因此 base_value_from 设置为 scalar_field;
投诉配置:以标量大小线性排序即可,因此 base_value_from 设置为 scalar_field,同时因是负相关,因此factor应该设计为负数;
对应的post_process_ops检索设置如下:
[ "op": "score_fusion", "fusion_by": "add", "addition_score_weight": 0.6, //附加score的权重为0.6 ann score的权重为1-0.6=0.4 "addition_score": [ { "factor": 1.0, "base_value_from": "scalar_field", "field": "f_sales" }, { "factor": -10.0, // 投诉多的商品,score应该降低 "base_value_from": "scalar_field", "field": "f_complain" } ] ]
例如,有一条数据,f_sales=100,f_complain=2,假设ANN score是0.111。
现在设置addition_score_weight=0.6
计算执行如下:
origion_score = 0.111,假设归一化后为0.7
addition_score = (1.0 * 100) + (-10.0 * 2) = 80,假设归一化后为0.8
则总得分是 score = (0.7 * 0.4) + (0.8 * 0.6) = 0.76
场景:假设数据集是短视频,有“点赞数”字段f_like(int64类型)、“作品发布时间”字段f_publish_date_time(date_time类型),场景希望召回时,点赞数越多的越优先召回,作品发布时间距离当前时间越近的越优先召回。
点赞数的权重配置:以标量大小线性排序即可,因此 base_value_from 设置为 scalar_field;
发布时间的权重配置:会有业务逻辑设计,因此 **** base_value_from 设置为 decay_func;认为距离当前时间24小时以内的,都希望视为最新数据,因此时间因素视为相同;离当前10天的权重可以衰减为一半,因此scale设置为9d、decay设置为 0.5 ;
对应的post_process_ops检索设置如下:
[ "op": "score_fusion", "fusion_by": "add", "addition_score_weight": 0.6, "addition_score": [ { "factor": 1.0, "base_value_from": "scalar_field", "field": "f_like" }, { "factor": 2.0, "base_value_from": "decay_func", "field": "f_publish_date_time", "func": "gauss", // 高斯衰减函数 "origin": "2025-10-01T00:00:00+08:00", // 基准时间。 "offset": "1d", // 1天。距离当前时间1天以内的,时间因素视为相同。 "scale": "9d", // scale和decay参数共同刻画了衰减函数的坡度。这里表示:当时间距离为10天时,衰减函数取值为0.5。 "decay": 0.5, } ] ]
例如,有一条数据,f_like=100,f_publish_date_time="2025-10-22T11:23:48+08:00"(当时的时间),假设ANN score是0.111
现在设置addition_score_weight=0.6
计算执行如下:
origion_score = 0.111,假设归一化后为0.7
addition_score = (1.0 * 100) + gauss_decay(),假设归一化后为0.8
则总得分是 score = (0.7 * 0.4) + (0.8 * 0.6) = 0.76