跳到正文

搜索评分如何融合点击与停留?

融合相关性、点击率、停留时长的加权与归一化方法

原题:请设计一个适用于通用搜索引擎的评分函数(Scoring Function),综合考虑相关性、点击率、用户停留时长等因素,并说明各项特征的加权逻辑与归一化方法。

RAG基础 · OPPO真题

回答与解析

整体框架

采用 Learning to Rank 范式,将评分函数设计为两阶段:先分别建模相关性、用户满意度,再融合为最终分数。


核心特征与建模

特征类型 具体指标 建模方式
相关性 BM25、语义相似度、标题/摘要匹配度 独立子模型输出 $S_{rel} \in [0,1]$
点击率 历史CTR、位置去偏后的CTR 用IPS或EM方法消除位置偏置
用户满意度 停留时长、跳出率、二次点击 停留时长用对数变换:$\log(1+dwell_time)$

归一化方法

  • Min-Max:适用于有明确边界的特征(如BM25分数)
  • Z-Score:适用于近似正态分布的特征
  • Sigmoid/Percentile:处理长尾分布(如停留时长)

融合策略

方案A:线性加权(简单场景)

$Score = w_1 \cdot S_{rel} + w_2 \cdot S_{ctr} + w_3 \cdot S_{dwell}$

权重通过 Grid SearchLambdaMART 优化NDCG目标学习得到。

方案B:非线性融合(推荐)

GBDTDeepFM 自动学习特征交叉:

  • 相关性高 + 点击率高 → 强信号
  • 相关性高 + 点击率低 → 可能标题党,需降权

关键细节

  1. 位置偏置处理:训练时用 $P(click|pos)$ 作为逆概率权重,或采用Unbiased Learning to Rank
  2. 时效性衰减:用户行为特征加时间衰减因子 $e^{-\lambda \Delta t}$
  3. 个性化扩展:引入用户画像特征,用 Wide & Deep 架构分别记忆和泛化

评估验证

  • 离线:NDCG@10、MAP
  • 在线:AB测试对比人均点击次数、搜索成功率

学习建议

掌握信息检索基础,学习排序模型中多特征融合方法,理解点击率与停留时长等行为特征的归一化与加权逻辑。

口语版讲法(约4分钟)

  • 道题本质是设计一个可落地的排序模型
  • 先分相关性、点击率、停留时长三个子模型
  • 归一化要区分类型,不是一刀切
  • 融合策略我倾向非线性,线性是兜底
  • 落地要防位置偏置和时效性,最后给面试官留个追问点

这道题本质上问的是,当你手里有文本相关性、用户点击行为、还有停留时长这些信号时,怎么把它们揉成一个统一的排序分,而且这个分得能真正上线用。所以我不是从零设计一个公式,而是先搭一个框架。

我会把它分成三块。第一块是相关性,这个最直接,用 BM25 加一个语义相似度,比如 Bi-Encoder 算出来的向量余弦,然后过一个简单的 MLP 压到 0 到 1 之间。第二块是点击率,但注意,这里有个坑,原始 CTR 是有位置偏置的,排在前面的天然容易点。所以我会用 IPS 或者 EM 做位置去偏,得到一个无偏的 CTR 估计。第三块是用户满意度,我主要看停留时长,因为它是比较直接的满意度信号,但停留时长是长尾的,我会取对数变换,比如 log(1+dwell time),让它更像正态分布。

归一化这块,很多人会一刀切用 Min-Max 或者 Z-Score,但实际落地我会区分对待。BM25 分数有理论上下界,Min-Max 合适;但停留时长这种长尾分布,我会用分位数归一化,或者直接过 Sigmoid,这样能避免极端值把正常样本的得分都压死。

然后是融合。最简单的做法是线性加权,三个子模型分数乘以权重加起来。但说实话,线性融合在真实业务里很难调好,因为特征之间有交叉,比如相关性高但点击率低,可能是标题党,线性加权就抓不住这个模式。所以我更倾向用非线性模型,比如 GBDT 或者 DeepFM,让模型自动学特征交叉。举个例子,在电商搜索场景,用户搜“苹果手机”,一个结果标题匹配很好但点击率低,可能因为价格太高,非线性模型能学到“相关性高 + 点击率低”这个组合是负面信号。

这里有个落地风险要特别注意:不管是线性还是非线性,权重或者模型参数都是用历史数据学出来的,如果历史数据里有位置偏置没去掉,学出来的模型会把高位置的权重学得特别大,上线后一换排序,位置变了,分数就崩了。所以我的流程一定是先做位置去偏,再做训练。

另外,用户行为是有时效性的,昨天的点击和去年的点击权重应该不一样。我会在行为特征上加上时间衰减因子,比如 e^{-λΔt},这样最近的行为占主导。

说到时间衰减,其实衰减系数 λ 怎么定是个挺有意思的问题,定太大模型只认最近几小时的行为,定太小又跟没衰减差不多。我一般会先在离线用一个验证集扫一遍 λ,然后上线再 AB 测试调。这个调参过程其实可以跟模型训练一起做,比如把 λ 作为一个可学习的参数,但那样训练会不稳定,所以目前我还是倾向于离线枚举加在线验证。

所以整体上,我的思路是先分治三个子模型,各自做好归一化和去偏,再用非线性融合捕捉交叉信号,最后加时效衰减。评估的话离线看 NDCG@10,在线看人均点击次数和搜索成功率。

关键一句:时间衰减系数 λ 的调参方法:离线枚举加在线 AB 测试,不推荐作为可学习参数

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设你正在优化电商搜索,用户搜“羽绒服”后点了一个商品,但停留时间很短就跳出了。现在你要设计一个评分函数,把相关性、点击率和停留时长揉在一起排序,你打算怎么定权重?

  2. 问法 2 · 层层追问

    搜索引擎打分一般怎么融合多个信号?……比如相关性和点击率不在一个量级上,怎么把它们放一起比较?……那如果有一个文档相关性很高但点击率低,你想怎么处理?

  3. 问法 3 · 直球架构

    给通用搜索引擎设计一个评分函数,输入是相关性、点击率、停留时长等特征,要求说明归一化方法和融合策略,你讲一下整体设计思路。

同模块相关题目