想象你是一位宴席主人,要招待一位很挑剔的美食家。后厨从市场买回一堆食材(召回),大厨把每道菜单独做到最好吃(精排),然后按好吃程度端上来。可你打开菜单就傻眼了:八道菜里五道是红烧肉,客人吃两口就腻了。你这才明白,“把每道菜做好”和“把一桌菜排好”是两件完全不同的事——得荤素搭配、口味错开、照顾忌口、还要换点新花样。这个“重新编排菜单”的动作,在推荐系统里就叫重排(Re-ranking)。它发生在精排之后,不再只看单个物品,而是把整个列表当作一桌宴席做全局优化。这篇文章,我们就用“宴席排菜”这条线,把重排的来龙去脉、主流算法和上线细节一次讲透。

岗位关联

重排是推荐系统“最后一公里的体验放大器”,掌握它能让列表的点击率、多样性和商业价值同时提升,是信息流与电商场景算法工程师的必备核心技能。

目录
  1. 可视化演示
  2. 重排为何而来
  3. 多样性打散
  4. MMR重排
  5. 强化学习重排
  6. 行列约束
  7. 业务规则与新鲜度
  8. 部署与评估
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

重排为何而来

一场高端晚宴,主人信心满满:厨师把每道菜都做到了极致,按好吃程度排好顺序端上桌。可客人刚吃两口就放下筷子——因为桌上五道菜是红烧肉。菜好吃归好吃,搭配一塌糊涂。主人这才明白,“把每道菜做好”和“把一桌菜排好”是两件完全不同的事。

推荐系统里的精排(Ranking)就像那位大厨:它对每个候选物品独立预估点击率、转化率,然后按分数从高到低排好。这个阶段的模型再强,也看不见“列表里别的物品”——它默认物品之间互不影响。但用户真正看的是整页内容:刚划过一条做饭视频,下一条又是做饭,再下一条还是做饭,再好也腻。

重排(Re-ranking)就落在精排之后:输入一个长度为 N 的候选队列,输出一个顺序不同的新列表。它要同时照顾四件事:多样性(同类错开)、新鲜度(刚看过的降权)、业务规则(置顶、插队、广告位)、全局最优(列表总价值最大,而不是单个分数最大)。重排追求的目标可以用一个简单的式子表示:

主人从此悟出一个道理:评判一桌宴席的不是某一道菜的满分,而是整桌人从头吃到尾的体验。这正是重排在推荐链路中的位置和使命。

max⁡π∑i=1nwi⋅sπ(i)\max_{\pi} \displaystyle \sum_{i=1}^{n} w_{i} \cdot s_{\pi(i)}
公式含义:找到一个排列方案 π,让每个位置“用户注意力权重 × 物品分数”的总和最大——这就是从“单点最优”到“全局最优”的转变。
  1. 排列方案 π把候选物品安排到各个位置的一种顺序,π(i) 表示第 i 个位置上摆的物品
    π(i)\pi(i)
  2. 位置权重 w_i第 i 个位置的曝光价值,越靠前的坑位看到的人越多、权重越大
    wiw_{i}
  3. 物品分数 s精排给出的点击率或相关性预估分,越高代表单点越吸引人
    sπ(i)s_{\pi(i)}
  4. 求和求最大把整页所有位置收益累加起来,重排要找的是让总和最大的那种排法
    max⁡π∑i=1n\max_{\pi} \sum_{i=1}^{n}

多样性打散

主人最先想到的办法很朴素:上菜时荤素交替。他给每道菜贴上标签(荤、素、甜、辣),然后在菜单上做规矩——同类菜之间至少隔开几道,不能连着上。

这对应重排中最直观的一招:多样性打散。先明确“什么算同类”:可以用类目标签(美食、美妆、游戏),也可以用物品向量的相似度阈值。然后对最终列表施加约束:任意两个同类别或高相似的物品,在序列中的距离不得小于某个间隔。打散是重排算法里成本最低、最容易上线的一种,很多信息流产品第一版重排就是从它开始的。

间隔怎么定?常用这个公式:

实现上常见两种做法:分桶轮流取——按类目分桶,每轮从不同桶里取一条;贪心间隔填充——每放一条就检查它与最近同类物的距离,不满足就换候选。主人试了一周发现:荤素交替确实管用,但完全按比例轮流也有弊端——如果招牌菜很稀罕,为了“间隔规则”反而把它压到很后面。能不能既保留好吃程度、又惩罚重复感?这就引出了 MMR。

dmin⁡=⌊NM⌋−1d_{\min} = \left\lfloor \frac{N}{M} \right\rfloor - 1
页面一共 N 个坑位,某类物品有 M 条,那么这类物品相邻两次出现至少要隔开 d_min 个其他物品。比如 20 个坑位、某类 8 条,最小间隔就是 2。
  1. 列表总长度 N一页需要填的坑位总数,比如信息流一屏 20 条
    NN
  2. 该类物品数 M候选集合里某个类目下的条数,比如 8 条美妆内容
    MM
  3. 向下取整除法结果不一定是整数,取整后才能得到实际可用的间隔
    ⌊NM⌋\left\lfloor \frac{N}{M} \right\rfloor
  4. 间隔减一两同类物品之间需要隔开的“其他物品”的数量
    −1-1

MMR重排

主人换了一个更聪明的策略:不再死守“隔几道”的硬规则,而是给每道菜算一笔账——它的综合价值 = 好吃程度 − 与已上菜的重复感。每上一道菜都重新算这笔账,选当下最划算的那道端上去。

这就是最大边际相关(Maximal Marginal Relevance,MMR),一种经典且轻量级的多样性重排算法。它维护两个集合:已选集合 S 和剩余候选集合 R。每一轮从 R 中挑一个“相关性高、同时与 S 里已有物品尽量不同”的物品加入 S,直到凑满整个列表为止。

工程上 MMR 的优点是完全贪心、没有待训练参数、延迟极低,非常适合线上实时重排。缺点是需要预先算好物品两两相似度(或用 Embedding 实时算余弦),候选集合大时成本较高,所以一般只对精排后的前 100 到 200 个物品做重排。

主人发现这招妙极了:招牌红烧肉还是能上,只是不会连续上;口味跨度大的菜有机会往前排。稀缺好菜和多样体验,终于不再是单选题。

MMR=argmaxdi∈R∖S[λ⋅Sim1(di,q)−(1−λ)⋅max⁡dj∈SSim2(di,dj)]\text{MMR} = \text{argmax}_{d_i \in R \setminus S} \left[ \lambda \cdot \text{Sim}_1(d_i, q) - (1 - \lambda) \cdot \max_{d_j \in S} \text{Sim}_2(d_i, d_j) \right]
对每个还没被选中的物品,先加上“与用户兴趣的相关分”,再减去“它与已选集合里最像的那个物品”的相似分,最后选总分最高的。这也是逐字解析要拆解的完整过程。
  1. 候选与已选集合d_i 是还没上桌的候选菜,R \ S 表示候选集合里去掉已选集合后剩下的部分
    R∖SR \setminus S
  2. 相关性加分Sim₁ 衡量物品与用户兴趣的相关度,工程上往往直接用精排分数替代,λ 控制它有多重要
    λ⋅Sim1(di,q)\lambda \cdot \text{Sim}_1(d_i, q)
  3. 重复感惩罚在已选集合 S 中找出与 d_i 最像的那个物品,取它们之间的相似度作为“最坏重复感”的估计
    max⁡dj∈SSim2(di,dj)\max_{d_j \in S} \text{Sim}_2(d_i, d_j)
  4. 平衡系数 λλ 越大越重视相关性,越小越重视多样性,通常用离线实验或线上 A/B 调参确定
    λ∈[0,1]\lambda \in [0, 1]
  5. 贪心选择argmax 表示每一轮都选“相关 − 惩罚”综合分最高的那个物品加入结果
    argmax\text{argmax}

强化学习重排

宴席越办越多,主人发现客人的口味是会发生“连锁反应”的:吃了辣的,下一道想喝汤;吃得太饱,后面的硬菜再好也吃不下。固定公式很难刻画这种“顺序带来的动态变化”。主人决定像下棋一样通盘考虑:这一步选什么,还要预判后面几步客人会怎么反应。

强化学习(Reinforcement Learning)正是把重排建模成序列决策问题:状态 s_t 是“已经排好的前 t 个物品 + 用户画像和上下文”,动作 a_t 是“下一个位置放哪个候选物品”,奖励 r_t 是用户对这一步的真实反馈——点击了、停留了、收藏了还是划走了。目标是训练一个策略网络,学会在“当前局面”下选出最优的下一步。

实践中有两条路线:基于价值的路线估计状态价值或动作价值,然后选 Q 值最大的动作;基于策略的路线直接对 J(θ) 做梯度上升(如 REINFORCE、PPO)。工业界常用“离线模拟 + 线上 A/B”的训练方式:先用历史日志离线训练,再小流量验证,最后逐步扩量。RL 重排效果上限高,工程复杂度也高,适合用户反馈即时的超大规模场景。

主人最终请来一位“有大局观的总管”:他不再只看下一道菜好不好吃,而是预测整桌菜的走向,从第一道到甜品都心里有数。这正是强化学习重排的视野。

J(θ)=Eπθ[∑t=0Tγt⋅rt]J(\theta) = \mathbb{E}_{\pi_\theta} \left[ \sum_{t=0}^{T} \gamma^{t} \cdot r_{t} \right]
策略的目标:让自己做出的每一步决策,带来的“未来折扣累计奖励”的期望最大。这才是真正意义上的“全局最优”。
  1. 策略 π_θ参数为 θ 的函数,输入当前已排序列,输出下一个放哪个候选物品的概率
    πθ\pi_\theta
  2. 累计奖励从第 0 步到最后一步的奖励求和,代表整局宴席的总满意度
    ∑t=0Trt\sum_{t=0}^{T} r_{t}
  3. 折扣因子 γ对未来奖励打折,γ 越小表示越看重眼前反馈,γ 越大表示越有耐心等待长期回报
    γt⋅rt\gamma^{t} \cdot r_{t}
  4. 期望 E策略本身带随机性,训练时反复采样,用多次模拟的平均回报作为优化目标
    Eπθ\mathbb{E}_{\pi_\theta}

行列约束

客人后来要求把圆桌换成方桌、按网格入座。主人发现麻烦升级了:不仅要管“上菜顺序”,还要管“邻座关系”——同一排左右两位不能都吃同一道菜,前后两排的同列位置也得错开。

在手机上,推荐结果往往不是单列而是网格:电商首页双列瀑布流、App 宫格入口。这时一维的“间隔”不够用了,需要行列约束。它把列表看成二维矩阵,同时施加两类约束:行内约束——同一行的卡片两两不能太相似,否则用户一眼扫过去全是同类;列间约束——相邻两行的同一列位置也不能出现同类物品,否则上下滑动时还是会撞见扎堆内容。

工程实现上,行列约束通常配合“逐行填充 + 回溯”来做:按行从上到下填,填某一行时先检查行内约束,再检查与上一行同列的约束,不满足就尝试换一个候选;解不出来时放宽阈值或允许少量违规并记录惩罚。这类约束也常与打散、业务规则组合成“打分 + 约束检查”的整体流程。

主人重新画了座位图:同一横排口味错开,前后排同列也不撞菜。二维的体验,果然比一维顺畅得多。

∀i,j∈同一行,Sim(di,dj)≤θ\forall i, j \in \text{同一行}, \quad \text{Sim}(d_i, d_j) \leq \theta
对同一行的任意两个位置,它们摆放的物品相似度都必须小于阈值 θ,否则就要换一个物品重新安排。
  1. 任意性 ∀约束对同一行里所有位置组合都生效,任何一对违规都不行
    ∀i,j\forall i, j
  2. 同一行限定约束作用域是横向相邻的卡片,这是与“打散间隔”不同的二维视角
    ∈同一行\in \text{同一行}
  3. 相似度度量Sim 用类目是否相同或 Embedding 余弦相似度来定义“同质”
    Sim(di,dj)\text{Sim}(d_i, d_j)
  4. 阈值 θ相似度的上限,一旦超过就判定为扎堆,需要重新安排位置
    ≤θ\leq \theta

业务规则与新鲜度

办宴席不只是让客人满意,还得满足一堆“硬规矩”:招牌菜必须上、VIP 那桌必须上海鲜、上次刚吃过的主食这次要换。主人的排菜方案,从此多了一堆不得不照顾的条条框框。

真实推荐系统同样如此。业务规则分为两类:硬约束(Hard Constraint)——直接把物品固定在某个位置,比如广告位、置顶活动、必须屏蔽的类目,重排时直接修改序列;软约束(Soft Constraint)——不强制位置,而是以“加分/减分”的形式影响排序。新鲜度是典型的软约束:用户刚点击、购买、看过的物品,分数要按时间衰减,越久远的越“新鲜”。

一个常见的新鲜度实现是:分数乘以 exp(−Δt / τ),其中 Δt 是距离用户上次看过的时长,τ 是衰减半衰期。注意硬约束要在打分之前先落地(先置顶、先删除),软约束则是叠加进公式之后统一排序。业务人员通过配置中心动态调整规则,不需要改代码,重排模块每次请求读配置、算约束、出序列。

主人心里有了一本账:哪些菜雷打不动要上(硬约束),哪些菜看情况调整(软约束),哪些菜已经吃过该换换(新鲜度)。规矩和体验,终于能一起照顾。

s~i=si+∑k=1Kαk⋅rk(i)\tilde{s}_i = s_i + \sum_{k=1}^{K} \alpha_k \cdot r_k(i)
重排时用的最终分数 = 精排原始分数 + 各条软规则给出的加权分。分数变了,顺序自然就变了。
  1. 原始分数 s_i精排给出的相关性或点击率预估分
    sis_i
  2. 规则加分 r_k(i)第 k 条规则对物品 i 的评价,置顶系数、新鲜度衰减、商业化加权都可以编码成加或减的分值
    rk(i)r_k(i)
  3. 规则权重 α_k每条规则的影响力度,由业务方在配置中心调整,比如广告权重临时调高
    αk\alpha_k
  4. 汇总得到新分数把所有规则的加权分累加到原始分数上,最终按这个新分数排序
    s~i\tilde{s}_i

部署与评估

新菜单确定后,主人没有立刻全镇宣传,而是先办几场小型试吃:一半客人吃老菜单,一半客人吃新菜单,对比两边的满意度。数据好看,才正式推向全镇。

重排模块上线也走同样的流程:A/B 测试。流量按用户分桶,实验组走新的重排逻辑,对照组保持旧逻辑,观察一段时间的指标差异。核心指标包括:CTR、人均浏览条数、停留时长、转化率等业务指标,以及类目覆盖率、相邻物品平均相似度等多样性指标——只有业务指标涨、多样性指标不降,才算一次健康的优化。

工程上,重排在精排之后、组装下发之前,对延迟极其敏感,预算一般只有 10 到 50 毫秒。因此线上架构必须轻:候选规模小(精排只出前 100 到 200 条)、算法用贪心或轻量模型、相似度和特征走缓存、规则走配置中心。评估上还要防止“指标反弹”——CTR 涨了但次日留存降了,说明是用短期兴趣透支换来的。组合指标 + 长期观察,才是重排效果的真实裁判。

主人的试吃会收获一致好评,新菜单才正式上线。他也记住了:不能只看客人第一口的表情,要看他从开席到散席、以及下次还来不来的完整表现。

lift=xˉA−xˉBxˉB×100%\text{lift} = \frac{\bar{x}_{A} - \bar{x}_{B}}{\bar{x}_{B}} \times 100\%
lift 表示实验组相对对照组的提升百分比,用它来决定是否全量上线。
  1. 实验组均值 x̄_A走新重排逻辑的用户平均指标,比如人均点击 12 次
    xˉA\bar{x}_{A}
  2. 对照组均值 x̄_B走旧逻辑的用户平均指标,比如人均点击 10 次
    xˉB\bar{x}_{B}
  3. 相对提升两组差值除以对照组,得到“提升了百分之多少”
    xˉA−xˉBxˉB\frac{\bar{x}_{A} - \bar{x}_{B}}{\bar{x}_{B}}

AI 应用场景

信息流内容打散与去重

阶段:排序后处理(召回 → 精排 → 重排 → 组装下发)

解决的问题:精排按单品分数降序下发,导致同类内容连续扎堆(连着几条都是娱乐八卦),用户刷两下就疲劳流失。重排通过打散和去重,让不同品类交错出现,提升整页的浏览体验。

具体案例:某资讯 App 信息流接入 MMR 重排后,娱乐、科技、体育三类内容交替展示,人均浏览条数提升约 15%,用户跳出率下降 8%。重排模块只处理精排输出的前 100 条候选,单次耗时稳定在 20 毫秒以内。

电商首页双列瀑布流布局

阶段:排序后处理 + 规则引擎

解决的问题:电商首页首屏是 2×3 网格,若同一行两个卡片都是同品类,或相邻行同列撞类目,会显得整屏内容单调。同时大促期间活动商品必须置顶、新款必须加权,传统精排无法处理这些业务约束。

具体案例:某电商平台首页采用“行列约束 + 业务规则”重排:第一屏网格中,同行不同类、同列错位;硬约束把大促活动位固定在首位,软约束给新品 15% 的分数加成。上线后首屏点击率提升 9%,活动位曝光量达到预期的 100%。

短视频流的强化学习重排

阶段:排序后处理 + 强化学习在线推理

解决的问题:短视频用户反馈极快,划走、完播、点赞都发生在几秒内,且上一刷的反馈会直接影响下一刷的耐心。固定公式难以捕捉这种顺序依赖,需要 RL 根据“当前已刷列表”动态决策下一刷放什么。

具体案例:某短视频平台用策略网络做重排,以完播率、点赞、关注为组合奖励,离线用历史日志训练、线上小流量验证。经过两周 A/B,实验组人均时长提升 6%,且内容类目覆盖率显著提高,随后逐步全量。

Python 演示

python51 行
# -*- coding: utf-8 -*-"""MMR rerank demo: 在精排分数基础上引入多样性惩罚"""import math  def cosine_sim(a, b):    """计算两个物品向量的余弦相似度, 值越大表示越相似"""    dot = sum(x * y for x, y in zip(a, b))    na = math.sqrt(sum(x * x for x in a))    nb = math.sqrt(sum(x * x for x in b))    return dot / (na * nb + 1e-9)  def mmr_rerank(items, lam=0.6, top_k=None):    """items: [{'id':.., 'score':.., 'emb':..}], 按 MMR 贪心重排"""    cand = list(items)    picked = []    top_k = top_k or len(items)    for _ in range(top_k):        best_idx = -1        best_val = -float("inf")        for idx, item in enumerate(cand):            relate = lam * item["score"]            if picked:                max_sim = max(cosine_sim(item["emb"], p["emb"]) for p in picked)            else:                max_sim = 0.0            val = relate - (1 - lam) * max_sim            if val > best_val:                best_val = val                best_idx = idx        picked.append(cand.pop(best_idx))    return picked  def main():    items = [        {"id": 1, "score": 0.95, "emb": [1.0, 0.1]},        {"id": 2, "score": 0.90, "emb": [0.9, 0.2]},        {"id": 3, "score": 0.86, "emb": [0.1, 1.0]},        {"id": 4, "score": 0.83, "emb": [0.8, 0.1]},        {"id": 5, "score": 0.80, "emb": [0.2, 0.9]},        {"id": 6, "score": 0.77, "emb": [0.0, 1.0]},    ]    result = mmr_rerank(items, lam=0.6)    print("原始精排顺序:", [x["id"] for x in items])    print("MMR重排顺序:", [x["id"] for x in result])  if __name__ == "__main__":    main()
目的:用纯 Python 实现 MMR 重排,演示“精排分数”和“相似度惩罚”如何共同决定最终顺序。

常见误区

误区精排已经给出分数了,重排不就是把分数再验证一遍、最多调调阈值吗?为什么还要单独做一个模块?

正解精排的分数是“单点视角”,重排引入的是物品之间的相互关系。两个同样 0.9 分的物品,一个与已选列表高度相似、一个完全不同,它们在重排中的地位天差地别。重排的核心不是“重新打分”,而是“看菜下碟、错开上菜”。

为何常见:初学阶段容易望文生义,“重排”这个名字听起来就是“再排序”,让人忽略它真正解决的是列表内部相互作用的问题。

误区既然同类扎堆会伤体验,那就把所有相似物品尽量隔远,差异越大越成功。

正解多样性必须和相关性做权衡。如果为了错开,把一堆用户根本不感兴趣的物品顶上来,点击率反而会下降。MMR 里的 λ、打散的间隔阈值都是要调的平衡点,不是越大越好。过度打散等于捡芝麻丢西瓜。

为何常见:看到“同类扎堆”的危害后容易矫枉过正,把多样性当成了重排的唯一目标,忽略了相关性这个基本面。

误区MMR 每一步都选一个和已选列表最不一样的物品放到下个位置,差异越大越优先。

正解MMR 的目标是“相关分 − 相似惩罚”的差值最大,不是单纯相似度最小。一个相关性极高、与已选略相似的物品,往往比一个完全不相似但相关性很差的物品更值得选。只看“最不相似”会丢掉相关性这一半。

为何常见:因为公式里有个 max 相似度惩罚项,容易被误读成“选最大相似度最小的”,漏看了前面的相关项。

误区行列约束不就是把打散策略搬到网格上用吗?算法完全一样,换个说法而已。

正解一维打散只约束顺序上的间隔;行列约束要同时约束“同一行内两两不相似”和“相邻行同列不相似”等多个方向的相邻关系,属于二维约束,求解更复杂,通常需要逐行填充加回溯检查。

为何常见:两者都涉及“相似度 + 间隔”,概念边界容易混淆,但只要想到“方桌邻座”和“圆桌上菜顺序”的差别,就能分清。

误区A/B 实验 CTR 涨了 2%,这次重排肯定有效,直接全量上线!

正解CTR 提升可能只是把高点击的标题党提前了,但多样性、新鲜度可能下降,甚至伤害次日留存。重排是全局优化,评估要同时看 CTR、深度互动、多样性和长期留存,单点指标的局部提升不等于全局收益。

为何常见:单指标评估最简单,但重排的价值恰恰体现在“多指标的组合平衡”上,只看 CTR 是对“全局最优”的误解。

面试题

Q1. 在推荐系统中,重排模块通常位于哪个环节?

单选题 · easy

  • A.召回阶段之前
  • B.精排阶段之后← 正确答案
  • C.特征工程之中
  • D.模型训练之外

答案:B。重排发生在精排之后,对精排输出的候选列表做全局优化。召回负责从全库捞候选,特征工程和模型训练都不是在线链路的具体环节,所以选 B。

Q2. 精排结果按单个物品分数排序的主要局限是什么?

单选题 · easy

  • A.无法处理大规模候选
  • B.物品被独立打分互不影响← 正确答案
  • C.模型训练成本过高
  • D.无法利用用户特征

答案:B。精排对每个物品独立预估点击率,忽略了物品之间的相互影响,就像每道菜单独好吃但五道都是红烧肉,组合起来体验很差。其余选项与精排的主要局限无关。

Q3. MMR 中平衡系数 λ 取 1 时,重排结果等价于什么?

单选题 · mid

  • A.完全随机打乱顺序
  • B.退化为精排原始顺序← 正确答案
  • C.只保留相似度惩罚项
  • D.列表顺序完全反转

答案:B。λ=1 时相似度惩罚项的系数 (1−λ) 变为 0,MMR 只保留相关性项,等价于按精排分数排序,相当于没做重排,所以选 B。

Q4. MMR 公式中惩罚项 max Sim₂(dᵢ, dⱼ) 表示什么?

单选题 · mid

  • A.与已选集合中最相似物品的相似度← 正确答案
  • B.与已选集合所有物品的平均相似度
  • C.与未选集合中任一物品的相似度
  • D.该物品在精排结果中的名次

答案:A。公式里 max 的对象是“dⱼ 遍历已选集合 S”,取的是候选物品与已选集合中“最像的那个”的相似度,用来估计最坏重复感,而不是平均值,也不是名次。

Q5. 行列约束与一维打散的核心区别是什么?

单选题 · mid

  • A.行列约束只约束第一行内容
  • B.行列约束同时约束行内与列间相邻关系← 正确答案
  • C.一维打散只用于广告场景
  • D.两者在算法上完全相同

答案:B。一维打散只看单向排列的间隔;行列约束针对网格布局,要同时考虑同一行内两两不相似、相邻行同列不相似等多个方向的约束,属于二维空间上的优化。

Q6. 强化学习重排中,设计奖励函数时通常不会直接使用哪个信号?

单选题 · hard

  • A.用户点击行为
  • B.页面停留时长
  • C.用户手机型号← 正确答案
  • D.下单转化行为

答案:C。奖励函数描述“用户对列表的实时反馈”,点击、停留、转化都在其中。手机型号是用户属性,属于状态 s_t 的一部分,不参与奖励计算,所以选 C。

Q7. 下列哪些属于重排阶段可以应用的业务规则?

多选题 · mid

  • A.广告位固定置顶← 正确答案
  • B.类目数量配额控制← 正确答案
  • C.新鲜度时间衰减← 正确答案
  • D.用户设备型号统计

答案:ABC。置顶、配额、新鲜度衰减都是作用于列表序列的业务规则。用户设备型号是用户特征,不是业务规则,属于特征输入而非约束条件。

Q8. 关于打散策略,下列说法正确的有哪些?

多选题 · mid

  • A.打散前需要定义相似度或类目← 正确答案
  • B.最小间隔可由列表长度和类目数推算← 正确答案
  • C.打散不会牺牲任何相关性
  • D.打散与相关性之间存在权衡← 正确答案

答案:ABD。打散必须先定义“什么算同质”;间隔常用 N/M 推算;但打散必然与相关性存在此消彼长的权衡,选项 C 的说法是错误的,因此选 A、B、D。

Q9. 重排模块线上 A/B 测试时,应关注哪些指标?

多选题 · hard

  • A.列表整体点击率← 正确答案
  • B.类目覆盖率等多样性指标← 正确答案
  • C.人均浏览时长← 正确答案
  • D.模型参数量大小

答案:ABC。CTR 反映短期吸引力,多样性指标反映列表质量,时长反映深度体验,三者组合才是全局评估。参数量是工程指标,与线上效果没有直接关系,所以不选 D。

Q10. 关于硬约束与软约束的区别,下列说法正确的是?

单选题 · hard

  • A.硬约束直接修改列表序列← 正确答案
  • B.软约束直接删除违规物品
  • C.硬约束只写日志不生效
  • D.硬约束与软约束完全相同

答案:A。硬约束直接改变序列,比如置顶、必插、屏蔽;软约束以加分或减分的形式影响排序,但不强制修改序列。删除物品属于硬约束,软约束不会直接删除,所以选 A。