检索后处理算子详细参数说明可参考文档:检索后处理算子-PostProcess
(https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-function-score-query)
VikingDB | ElasticSearch | |
|---|---|---|
定位 | 向量检索的后处理算子。 | 通用检索。 |
执行机制 | score计算与ANN流程解耦。只对预召回的数据计算score,减少了计算量。 | query命中的所有文档都要参与计算score。 |
易用性 | 高。有清晰的JSON DSL框架,参数相对更少,用户理解成本和心智负担低。 | 中。参数和模式组合繁多,需要深入理解才能用好,配置复杂。 |
归一化 | 默认开启且推荐,自动处理尺度问题。降低了使用门槛,避免了因分数尺度差异导致融合结果失真。 | 无内置自动归一化,需用户自行处理 |
addition_score_weight 值?addition_score_weight 的选择取决于您的业务目标。
如果更看重向量检索的语义相关性,希望业务指标只作为微调,建议设置一个较小的值(如 0.1 - 0.3)。
如果认为业务指标(如时效性、热度)与语义相关性同等重要,可以设置一个中间值(如 0.4 - 0.6)。
如果业务场景中,自定义的业务规则是排序的主要依据,则可以设置一个较大的值(如 0.7 - 0.9)。
factor 参数主要有两个用途:
缩放:调整不同业务指标的相对重要性。例如,您有两个加分项“点赞数”和“收藏数”,如果您认为“收藏数”的重要性是“点赞数”的两倍,可以将它们的 factor 分别设置为 1 和 2。
反转/惩罚:factor 可以是负数。当您希望对某些特征进行惩罚时,可以设置一个负的 factor。例如,对“投诉量”字段设置一个负的 factor,可以使投诉越多的项目排名越靠后。
目前支持的取值有 scalar_field、 decay_func。如何选择,取决于业务指标的性质:
使用 scalar_field:当指标本身就可以直接、线性地反映业务价值时。例如:商品销量、视频点赞数、文章阅读量。这些值越高,通常代表业务排序越靠前。
使用 decay_func:当指标的业务价值取决于它与某个“中心点”的“距离”时。这在以下场景中非常有用:
field 是时间戳,origin 是当前时间。距离当前时间越近,得分越高。field 是商品价格,origin 是用户的目标预算。价格越接近预算,得分越高。建议开启归一化,尤其是在不确定 origin_score 和addition_score的分布范围时。好处如下:
可预测的范围:归一化操作会将 origin_score和addition_score任意取值范围的数值稳定在 (0,1) 区间内。这使得 addition_score_weight 的作用更加直观和可控。
公平融合:addition_score 中的衰减函数得分和直接取值的标量,其数值范围可能千差万别。将origin_score 归一化后,可以更公平地与这些不同来源、不同尺度的业务分数进行加权融合,避免某一类分数因其数值范围过大而主导了最终结果。