01
60 秒回答模板
我会先定义 item 的相似度和 session 窗口,再设计多层多样性指标。给定一个 session 的曝光序列 `S={i1,...,in}`,如果有 embedding 相似度 `sim(i,j)`,可以用列表内多样性 `ILD(S)=1 - 2/(n(n-1)) * Σ_{a<b} sim(i_a,i_b)`;如果有类目标签,可以算类目分布熵 `H(S)=-Σ_c p_c log p_c`,并归一化为 `H/log C`,或者用有效类目数 `exp(H)`。对信息流还要看序列体验,定义相邻多样性 `AD(S)=1 - 1/(n-1) * Σ_t sim(i_t,i_{t+1})`,避免连续刷到高度相似内容。优化时可在重排目标里加入 `score = relevance + λ diversity - μ repeat_penalty`,或用 MMR:每次选 `argmax_i [rel(i)-λ max_{j in selected} sim(i,j)]`。但多样性是护栏和体验指标,不是越高越好,要用 A/B 看 CTR、停留、负反馈、留存和转化的平衡。
考点 先定义 session、item 表...
难度 真实面经题
回答目标 让候选人能给出可计算的 session 多样性公式,并说明如何把指标用于重排优化、监控和 A/B 验证,体现对推荐体验与业务目标 trade-off 的理解。
02
深入解析
01 指标对象:session 多样性要先定义内容表示
Session 可以是一次访问中的曝光序列,也可以是点击序列。曝光多样性反映系统给用户看的内容是否单一,点击多样性反映用户实际消费是否分散。计算前需要定义 item 表示:类目、作者、品牌、价格带、主题标签、embedding、文本/图像语义向量等。不同业务应选择不同维度:短视频可能看主题、作者和音乐;电商看类目、品牌、价格带和商品相似度;广告看行业、广告主、创意和转化目标。没有表示定义的“多样性”只是口号。
02 类目分布公式:覆盖和熵衡量宏观丰富度
对 session `S` 中每个 item 的类目 `c`,统计 `p_c = count(c)/n`。类别覆盖可用 `Coverage = |{c: count(c)>0}| / C_available` 或 session 内唯一类别数。分布熵为 `H(S) = -Σ_c p_c log(p_c)`,归一化熵为 `H_norm = H / log(min(n, C))`,范围更接近 0 到 1。熵比简单类别数更好,因为它区分“10 个内容里 9 个美食 1 个旅游”和“美食旅游各 5 个”。有效类别数 `N_eff = exp(H)` 可以直观表达这个 session 相当于均匀覆盖了多少类内容。
03 相似度公式:用 ILD 衡量语义层面的重复
类目粒度可能太粗,两个同类 item 也可能差异很大,不同类 item 也可能语义接近。因此可以用 embedding 相似度定义列表内多样性:`ILD(S)=1 - (2/(n(n-1))) * Σ_{a<b} sim(i_a,i_b)`,其中 `sim` 可以是 cosine similarity,必要时归一化到 `[0,1]`。ILD 越高,session 内 item 平均越不相似。也可以按曝光位置加权,前几位权重大,因为用户更可能看到:`wILD = 1 - Σ_{a<b} w_a w_b sim(i_a,i_b) / Σ_{a<b} w_a w_b`。
04 序列公式:相邻重复比整体重复更伤体验
信息流和推荐列表有顺序,整体多样不代表体验好。如果前 5 个都很像,后面再多样,用户可能已经退出。因此要计算相邻多样性:`AD(S)=1 - (1/(n-1)) * Σ_{t=1}^{n-1} sim(i_t,i_{t+1})`,或计算连续同类长度、最大重复 streak、滑动窗口熵 `H(S_{t:t+k})`。还可以定义 `RepeatRate_k = count(sim(i_t,i_{t-r})>τ, 1<=r<=k) / n`,衡量短窗口内重复。序列指标能直接指导重排打散策略。
05 用户兴趣覆盖:不是所有差异都对用户有价值
多样性应围绕用户可接受兴趣空间,而不是随机塞无关内容。可以先估计用户兴趣分布 `u_c` 或兴趣向量集合,再看推荐 session 的类别分布 `p_c` 是否覆盖用户多兴趣:例如 `InterestCoverage = Σ_c min(p_c, u_c)`,或用 Jensen-Shannon divergence 衡量推荐分布与用户兴趣分布的距离。这样能避免为了多样性推荐用户完全不感兴趣的内容。对于探索内容,可以设置小比例预算,并用负反馈和停留时长动态调整。
06 优化落地:重排中做相关性和多样性 trade-off
召回/排序模型通常输出相关性分数,重排阶段更适合加入多样性。经典 MMR 选择规则是:`argmax_i [rel(i) - λ max_{j in selected} sim(i,j)]`,每次选择与已选内容不太相似且相关性高的 item。也可以用目标函数 `Score(L)=Σ rel(i) + λ Diversity(L) - μ RepeatPenalty(L)`,在 beam search、贪心重排或约束优化中求解。工程上可以按类目/作者设置 quota、频控、打散规则,也可以训练多目标排序模型,把多样性作为特征或正则。但 `λ` 要按场景、人群和 session 阶段调参,新用户、低活用户和高活用户的最优多样性不同。
07 验证与失败模式:多样性不是越高越好
离线可以看 ILD、熵、相邻多样性、重复率、新颖性,以及相关性指标 NDCG/Recall 是否下降。在线 A/B 要看 CTR、播放/停留、转化、负反馈、不感兴趣点击、留存和长期兴趣扩展。失败模式包括:多样性提升来自低质无关内容,短期 CTR 下降;只按一级类目打散,语义仍重复;只看曝光多样性,不看点击/消费多样性;全局一个 `λ` 导致部分人群体验变差;过度打散破坏用户连续浏览同一兴趣的需求。好的系统应把多样性作为约束和长期体验目标,与相关性共同优化。
03
易错点
- 只用“不同类目数量”代表多样性,忽略分布是否均衡和语义是否重复。
- 不区分曝光序列和点击序列,把系统供给和用户消费混在一起。
- 不考虑顺序,只算整体集合多样性,忽略连续重复带来的体验伤害。
- 为了提高多样性推荐无关内容,导致相关性、CTR 或转化下降。
- 使用质量很差的 embedding 计算相似度,得到不可解释或错误的 ILD。
- 全局固定多样性权重,不按用户兴趣宽度、场景和 session 阶段调整。
04
面试官追问
曝光多样性和点击多样性应该看哪个?
两个都要看。曝光多样性反映系统供给是否单一,点击多样性反映用户实际消费结果。如果曝光很多样但点击很集中,可能说明多样内容不相关;如果曝光很单一但点击率高,短期有效但长期可能兴趣窄化。优化时通常先保证曝光层适度多样,再用点击/停留判断这些多样内容是否被用户接受。
类目熵和 ILD 有什么区别?
类目熵依赖离散标签,解释性强,适合业务监控和规则约束,但粒度粗。ILD 基于 item 相似度或 embedding,能捕捉语义重复,适合模型优化,但依赖 embedding 质量且解释性弱。实际系统常同时使用:用熵看宏观类目丰富度,用 ILD 看语义层重复。
如何选择多样性权重 λ?
先离线画相关性和多样性的 Pareto 曲线,筛掉明显损害 NDCG/预估收益的区间;再在线做多档实验,看 CTR、停留、负反馈、留存和转化。λ 不一定全局固定,可以按用户活跃度、兴趣宽度、场景和 session 阶段动态调整。高确定性购买场景可能 λ 小,内容探索场景可以更大。
多样性会不会伤害转化?
可能会,所以不能把多样性当唯一目标。短期强转化场景需要相关性优先,多样性作为防重复和探索约束;内容消费或长期留存场景可以更强调兴趣扩展。关键是用 A/B 判断边际收益:适度多样可能减少疲劳、提升停留和留存,过度多样会引入无关内容并伤害转化。