🏠 总目录📚 本教程 06 · 工业架构
📑 本页目录(点开跳转)

06 · 工业架构:召回 → 粗排 → 精排 → 重排

20 分钟 | ⭐⭐⭐ 全教程最重要的一节


🎯 一句话

真实推荐系统是一个漏斗:每一层用「更贵但更准」的模型处理「更少」的候选。用计算量换准确度,用分层换时延。

召回1 亿 → 几千粗排几千 → 几百精排几百 → 几十重排几十 → 几个每一层都在「用更贵的模型,处理更少的候选」上一层漏掉的,下面再准也找不回来
越往下候选越少、模型越贵、算得越精。⭐ 这个结构的代价是:上一层漏掉的东西,下面再准也找不回来 —— 所以召回决定了整条链路的上限。

如果你只看这份教程的一节,看这节。这是所有推荐岗面试的第一个问题。


🚰 全景图(把它印在脑子里)

物品库:1 亿每层耗时预算① 召回 Retrieval多路并行,每路只管一个角度 · 向量检索 / 查倒排表指标:召回率 —— 别漏了好东西~10-30ms② 粗排 Pre-Ranking小模型(双塔 / 轻量 DNN),作用是给精排减负指标:与精排 Top-K 的一致性,不是 AUC~10-20ms③ 精排 Ranking大模型(DIN / DeepFM / Transformer)几百上千维特征 + 交叉特征,多目标预估指标:AUC / GAUC~50-100ms④ 重排 Re-Ranking规则 + 序列模型:去重 / 打散 / 频控 / 广告混排指标:多样性 · 业务约束满足~5-10ms几千 ~ 1 万几百几十10 个 → 用户屏幕全链路 ~100ms
同一条漏斗,这次把每层的模型、指标和耗时预算都标上了。⭐ 关键是右边那列:候选每砍掉一个数量级,你才买得起下一层更贵的模型 —— 四层加起来必须压进 100ms 量级。

🤔 为什么必须分层?(一道算术题)

假设你的精排模型对一个 (用户, 物品) 打分要 0.1 毫秒

方案 耗时 可行?
直接给 1 亿物品打分 0.1ms × 10⁸ = 10,000 秒 ≈ 2.8 小时 ❌ 用户早跑了
分层:召回 1 万 → 精排 500 30ms + 50ms ≈ 80ms

核心权衡

              准确度 ↑                 候选数量 ↑
   召回  ┃  ▁▁▁▁                    ████████████████
   粗排  ┃  ▃▃▃▃▃▃                  ████
   精排  ┃  ████████████            ▃
   重排  ┃  ██████ (+业务规则)       ▁

💡 一句话记住越往后,模型越贵,候选越少。总计算量在每一层大致相当。


① 召回:多路并行,宁滥勿缺

核心心态转变 ⭐

召回不追求「排得准」,只追求「别漏」。

所以召回的指标是召回率,不是准确率。

典型的多路召回配置

一个真实的信息流产品会同时跑 20–50 路召回,每路出几百个:

召回路 逻辑 解决什么
协同过滤 (ItemCF/Swing) 看了又看 行为相关性
向量召回 (双塔/DSSM) 用户向量 ANN 检索物品向量 语义泛化,主力通路
内容/标签召回 用户偏好标签 → 倒排索引 冷启动、可解释
热门召回 全局/分类热榜 兜底,永不为空
地理位置召回 同城 本地生活、社交
社交召回 关注的人发的 / 好友赞过的 社交产品必备
实时召回 最近 5 分钟点击的相似物品 捕捉即时兴趣 ⭐
作者/店铺召回 你关注的创作者的新内容 创作者生态
探索召回 随机 / 新物品 打破茧房,收集无偏数据

合并方式:各路取 TopN → 去重 → 打上「来源」标记 → 送入粗排。

🔧 实战经验:加一路新召回通常比调优现有模型的收益更大。 召回的多样性 ≈ 系统的天花板。 但每路都要配额,否则某一路会淹没其他路。


② 粗排:一个「妥协」的产物

粗排本质是个工程妥协:召回出了 1 万个,但精排模型只跑得动 500 个,中间需要一刀。

关键设计约束:粗排必须比精排快至少 10 倍,同时尽可能像精排

常见做法

做法 说明
双塔模型 用户塔和物品塔分开算,物品向量离线算好,线上只做点积 → 极快
精排蒸馏 用精排模型的打分当「老师」,训练一个小模型当「学生」⭐ 主流做法
COLD (阿里) 特征筛选 + 网络裁剪 + 工程优化协同设计

粗排的正确指标

❌ 不是 AUC。 ✅ 是 「粗排 Top-K 和精排 Top-K 的重合度」(一致性 / Recall@K vs 精排)。

因为粗排的唯一职责是「别把精排会喜欢的东西砍掉」。


③ 精排:全系统的核心战场

这里是模型最复杂、投入最大、收益最直接的地方。

特征规模

用户特征     ID、画像、长期兴趣、短期行为序列(近500次)……      ~百维
物品特征     ID、类目、作者、时长、统计特征、多模态Embedding……  ~百维
上下文特征   时间、地点、设备、网络、当前会话……                 ~几十维
交叉特征     用户类目偏好 × 物品类目、用户价格带 × 物品价格……    ~几百维
────────────────────────────────────────────────────────────
总计         几百到几千维,Embedding 表可达 TB 级

⭐ 多目标:精排真正复杂的地方

用户在一个视频上可以做很多事,每一件都是一个预估任务

一次精排同一次前向pCTR | 会点吗?pFinish | 会看完吗?pLike | 会点赞吗?pComment | 会评论吗?pShare | 会转发吗?pFollow | 会关注作者吗?融合成一个最终分加权乘积,权重是业务旋钮⭐ 一次前向分出多个头,最后融合 —— 权重是产品调的,不是学出来的
精排不是「一个模型出一个分」,而是一次前向、分出多个预估头,最后融合成一个分。⭐ 融合公式里的权重是业务旋钮,不是学出来的 —— 调大 pFinish 长视频就起来,调大 pShare 内容就变 social。

融合公式(真实公司里的样子):

$$\text{Score} = pCTR^{w_1} \times (\alpha + pFinish)^{w_2} \times (\beta + pLike)^{w_3} \times \cdots$$

🎚️ 这些 w业务旋钮,不是学出来的。 调大 pFinish 的权重 → 长视频更容易被推;调大 pShare → 内容更「social」。 算法工程师和产品经理吵架的主战场就在这几个数字上。

多任务模型架构演进

  ①  Shared-Bottom (最朴素)
      共享底层 → 每个目标一个塔
      ❌ 问题:任务冲突时互相拖后腿(跷跷板效应)

  ②  MMoE (Google, 2018)  ⭐ 工业界最常用
      多个专家网络 + 每个任务一个门控网络自己挑专家
      ✅ 任务间有冲突时也能各取所需

  ③  PLE / CGC (腾讯, 2020)
      专家分成「共享专家」和「任务专属专家」
      ✅ 进一步缓解跷跷板

  ④  ESMM (阿里, 2018)
      针对 CVR 的样本选择偏差:pCTCVR = pCTR × pCVR
      ✅ 在全空间建模,解决「只有点击了才有转化标签」的问题

④ 重排:模型管不了的事,规则来管

精排给出了「每个物品单独看有多好」,但最终展示的是一个列表,列表有列表的问题:

问题 处理
重复 同一作者、同一话题连续出现 → 打散
多样性不足 十条全是同一类目 → MMR / DPP(第 11 节)
已读/已购 去重过滤
频控 同一个物品一天最多曝光 3 次
业务强插 广告位、运营位、新人任务卡
生态调控 给新作者/冷启内容保底流量
上下文效应 一个物品排在什么东西旁边,点击率会变(Context-aware Reranking)

现代做法:不只是规则


🗺️ 一次完整请求的时序图

 t=0ms    用户请求到达
          ↓
 t=0-10   【特征服务】拉用户画像、实时行为序列 (Redis/特征平台)
          ↓
 t=10-40  【召回】20 路并行 ────┬─ ItemCF 查倒排  (2ms)
                               ├─ 双塔 ANN 检索   (8ms)
                               ├─ 标签召回        (3ms)
                               ├─ 热门(缓存)      (1ms)
                               └─ ... 取最慢的那路
          ↓ 8000 个候选
 t=40-60  【粗排】小模型批量打分 → 留 500
          ↓
 t=60-140 【精排】大模型批量打分 → 多目标融合 → 留 50
          ↓
 t=140-150【重排】打散 + 多样性 + 业务规则 → 留 10
          ↓
 t=150    返回结果
          ↓
 [异步]   曝光埋点 → 消息队列 → 实时特征更新 + 样本落盘 → 模型训练

⚠️ 端到端预算通常是 200–500ms。超时怎么办?降级:跳过精排直接用粗排结果,或直接返回缓存/热门。永远不能返回空。


💡 三个反直觉但极其重要的经验

1. 各层的优化收益不同,且随时间变化

早期系统:加召回路 收益最大。 成熟系统:精排模型 + 特征 收益最大。 超大规模系统:重排和多样性 反而成为增长点(因为单点准确度已经饱和)。

2. 「链路一致性」是隐形杀手

如果召回按 A 标准选、精排按 B 标准排,好东西会在中间被误杀。 → 现代做法:用精排的分数去指导(蒸馏)粗排和召回的训练,让全链路目标对齐。

3. 离线涨了,线上不一定涨

离线 AUC +0.5%,线上 CTR 可能不动甚至跌。原因: - 离线用的是历史曝光数据(有偏),线上面对的是全量候选 - 离线没有多样性/新鲜度约束,线上有 - 用户会适应,短期涨不代表长期涨

一切以 A/B 实验为准(第 12 节)。


🔗 这一章连到哪里

去哪为什么
AI基础设施 15精排的 200ms 预算是推理侧约束:延迟 vs 吞吐、批量打分、超时降级都源于此
上线之后 03新链路上线先走影子流量验证一致性,再灰度放量,永远留回滚开关
上线之后 05四层漏斗每层的耗时、降级率、空结果率该怎么监控才不至于出事没人知道

✅ 检查点

这几题请务必答出来,面试必考:

  1. 画出推荐系统四层架构,说出每层的候选数量级和耗时。
  2. 为什么召回的指标是召回率而不是准确率?
  3. 粗排的指标应该是什么?为什么不是 AUC?
  4. 多目标融合的权重是学出来的还是人定的?
  5. 「链路一致性」是什么问题?怎么缓解?
  6. 端到端超时了怎么办?
👀 答案 1. 召回(1亿→1万, 10-30ms) → 粗排(1万→500, 10-20ms) → 精排(500→50, 50-100ms) → 重排(50→10, 5-10ms) 2. 因为召回漏掉的东西后面永远救不回来(不可逆),而混进来的烂东西精排会排到后面(可逆)。 3. 与精排 Top-K 的重合度/一致性。因为粗排的职责不是排得准,而是「不误杀精排想要的」。 4. 人定的(业务旋钮)。它们编码的是产品策略,不是数据规律。 5. 各层优化目标不一致导致好物品被中间层误杀。缓解:用精排分数蒸馏粗排/召回,全链路目标对齐。 6. 降级:跳过精排用粗排结果、返回缓存、返回热门兜底。绝不返回空。

🛑 可以停在这里 —— 你已经掌握了推荐系统的骨架

到这一节为止,你已经能和推荐算法工程师正常对话了。

后面的章节都是往这个骨架上挂肉: - 第 7、8 节 → 精排的模型和特征 - 第 9、10 节 → 召回的模型和检索 - 第 11 节 → 重排 - 第 12、13、15 节 → 让它真的能上线


走神救援

四层漏斗:召回(1亿→1万,多路并行,重召回率) → 粗排(→500,精排蒸馏,重一致性) → 精排(→50,多目标 MMoE,重 AUC) → 重排(→10,多样性+业务规则)。总时延 200ms 内。核心权衡:越往后模型越贵候选越少。三个坑:链路不一致、离线涨线上不涨、超时要降级。每一层的正确指标是不一样的:召回只看 Recall(别漏),粗排看的不是 AUC 而是「粗排 Top-K 与精排 Top-K 的重合度」——它唯一的职责是别把精排会喜欢的东西砍掉;精排才看 AUC。⭐ 精排真正复杂的地方是多目标:pCTR / pFinish / pLike / pShare 各预估一个,再乘起来融合成最终分,而那几个权重 w业务旋钮,不是学出来的——它就是算法和产品吵架的主战场。架构上 Shared-Bottom 会有跷跷板效应,MMoE 用门控让每个任务自己挑专家,PLE 再拆出「共享专家 + 任务专属专家」,ESMM 则用 pCTCVR = pCTR × pCVR 解决「只有点击了才有转化标签」的样本选择偏差。⚠️ 各层的收益会随系统成熟度迁移:早期加召回路最赚,成熟期靠精排模型和特征,超大规模系统反而是重排和多样性成为增长点。

下一节 👉 07-特征工程.md

打卡记录保存在你的浏览器里,首页能看到总进度