搜索评分如何融合点击与停留?
融合相关性、点击率、停留时长的加权与归一化方法
原题:请设计一个适用于通用搜索引擎的评分函数(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 Search 或 LambdaMART 优化NDCG目标学习得到。
方案B:非线性融合(推荐)
用 GBDT 或 DeepFM 自动学习特征交叉:
- 相关性高 + 点击率高 → 强信号
- 相关性高 + 点击率低 → 可能标题党,需降权
关键细节
- 位置偏置处理:训练时用 $P(click|pos)$ 作为逆概率权重,或采用Unbiased Learning to Rank
- 时效性衰减:用户行为特征加时间衰减因子 $e^{-\lambda \Delta t}$
- 个性化扩展:引入用户画像特征,用 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 · 场景切入
假设你正在优化电商搜索,用户搜“羽绒服”后点了一个商品,但停留时间很短就跳出了。现在你要设计一个评分函数,把相关性、点击率和停留时长揉在一起排序,你打算怎么定权重?
- 问法 2 · 层层追问
搜索引擎打分一般怎么融合多个信号?……比如相关性和点击率不在一个量级上,怎么把它们放一起比较?……那如果有一个文档相关性很高但点击率低,你想怎么处理?
- 问法 3 · 直球架构
给通用搜索引擎设计一个评分函数,输入是相关性、点击率、停留时长等特征,要求说明归一化方法和融合策略,你讲一下整体设计思路。