真实面经题目 · 原创解析

给定用户 session 曝光或点击序列,如何设计公式衡量推荐内容多样性并用于优化?

这题要求给定用户 session 的曝光或点击序列,设计可计算的推荐内容多样性公式,并说明如何用于优化。高质量答案不应只说“类别越多越好”,而要根据业务内容表示定义多样性:可以从类目覆盖、分布熵、两两相似度、去重率、新颖性、序列相邻差异和用户兴趣覆盖几个角度构造指标。对于 session 序列,常用公式包括 intra-list diversity:`ILD = 1 - average(sim(i,j))`;类别熵:`H = -Σ p_c log p_c`;有效类别数:`exp(H)`;相邻多样性:`1 - average(sim(i_t, i_{t+1}))`。用于优化时不能盲目提高多样性,需要和相关性、CTR/CVR、时长、留存做 trade-off,可在重排阶段加入多样性正则或约束,并用 A/B 验证用户体验和业务指标。

出现于:字节跳动 · 算法 · 2 条面经记录

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 的理解。

深入解析

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 下降;只按一级类目打散,语义仍重复;只看曝光多样性,不看点击/消费多样性;全局一个 `λ` 导致部分人群体验变差;过度打散破坏用户连续浏览同一兴趣的需求。好的系统应把多样性作为约束和长期体验目标,与相关性共同优化。

易错点

  • 只用“不同类目数量”代表多样性,忽略分布是否均衡和语义是否重复。
  • 不区分曝光序列和点击序列,把系统供给和用户消费混在一起。
  • 不考虑顺序,只算整体集合多样性,忽略连续重复带来的体验伤害。
  • 为了提高多样性推荐无关内容,导致相关性、CTR 或转化下降。
  • 使用质量很差的 embedding 计算相似度,得到不可解释或错误的 ILD。
  • 全局固定多样性权重,不按用户兴趣宽度、场景和 session 阶段调整。

面试官追问

曝光多样性和点击多样性应该看哪个?

两个都要看。曝光多样性反映系统供给是否单一,点击多样性反映用户实际消费结果。如果曝光很多样但点击很集中,可能说明多样内容不相关;如果曝光很单一但点击率高,短期有效但长期可能兴趣窄化。优化时通常先保证曝光层适度多样,再用点击/停留判断这些多样内容是否被用户接受。

类目熵和 ILD 有什么区别?

类目熵依赖离散标签,解释性强,适合业务监控和规则约束,但粒度粗。ILD 基于 item 相似度或 embedding,能捕捉语义重复,适合模型优化,但依赖 embedding 质量且解释性弱。实际系统常同时使用:用熵看宏观类目丰富度,用 ILD 看语义层重复。

如何选择多样性权重 λ?

先离线画相关性和多样性的 Pareto 曲线,筛掉明显损害 NDCG/预估收益的区间;再在线做多档实验,看 CTR、停留、负反馈、留存和转化。λ 不一定全局固定,可以按用户活跃度、兴趣宽度、场景和 session 阶段动态调整。高确定性购买场景可能 λ 小,内容探索场景可以更大。

多样性会不会伤害转化?

可能会,所以不能把多样性当唯一目标。短期强转化场景需要相关性优先,多样性作为防重复和探索约束;内容消费或长期留存场景可以更强调兴趣扩展。关键是用 A/B 判断边际收益:适度多样可能减少疲劳、提升停留和留存,过度多样会引入无关内容并伤害转化。