这是「推荐系统系列」的开篇。这个系列会把一套能跑的推荐链路——召回 → 排序 → 过滤 → 重排 → 全链路评估——从直觉到代码逐段讲透。本篇先用一个统一比喻建立**召回(recall / candidate generation)**的整体心智模型:它在系统里管什么、不管什么、怎么评估、有哪些流派。后续每一篇再逐一深挖:ItemCF 协同过滤、热门召回、双塔召回、多路融合 RRF、排序精排、过滤与重排、全链路离线评估。
Table of contents
Open Table of contents
一句话理解
召回 = 录像带出租店里的「挑片员」。从全店 1 亿部片(工业界规模)里,几十毫秒帮你粗筛出 200 部候选,交给后面的「老板」(排序)精挑细选。
它管「不能漏掉你的真爱片」,不管「哪部更好看」——那是老板的活。
一旦挑片员没把对的片放进 200 部名单里,后面老板再会挑也救不回来。
1. 召回在整个系统里的位置(漏斗)
全链路是一层层收窄的漏斗:召回负责「大海捞针不漏片」,排序负责「精挑细选排对序」,重排负责「兜底与调味」。
| 阶段 | 干啥 | 关心 |
|---|---|---|
| 召回 | 大海捞针,从 10⁸ 选 10³ | 你的真爱片在不在 200 部名单里? |
| 排序 | 200 部里精挑 10 部 | 哪部更好看?打分排序 |
| 重排 | 加多样性 / 加广告 / 去重 | 别让 10 部都是同一类型 |
关键洞察:召回这步只问「在不在候选集里」,根本不在乎排第 1 还是排第 200。这就是它跟排序的本质区别。
2. 召回的 3 个 KPI = 挑片员的 3 个考核
| KPI | 挑片员语言 | recsys-mini 实测 |
|---|---|---|
| Recall@K | 「你给我 200 部,我的真爱片在里面吗?」 | 50.20%(每 2 个用户里有 1 个的真爱被捞中) |
| Coverage@K | 「整个片库你用了多少?还是只反复推那几部爆款?」 | 69.36%(70% 的电影至少出现在某人的候选里) |
| Latency | 「给我 200 部,能不能 50ms 内出?」 | 现在还没上线 |
注意:召回不评 NDCG——排序会把 200 部全打散重排,你召回内部排第几,根本不重要。
3. 8 大召回家族 = 8 种「挑片员流派」
每种都是真实业务里的一类召回算法:
| # | 挑片员流派 | 推荐术语 | 干啥 |
|---|---|---|---|
| 1 | 口碑老挑片员 | CF(协同过滤) | 「跟你品味相同的客人,最近租了并喜欢哪些片 → 也推给你」 |
| 2 | 气质速配 | 双塔(向量召回) ⭐ | 给用户和每部片各填「气质问卷」转成向量,向量近的就匹配 |
| 3 | 顺藤摸瓜 | 图召回(LightGCN) | 通过「看过它的人还看过」链路找候选 |
| 4 | 标签速配 | 倒排召回(tag) | 你说「喜欢科幻、悬疑、90 年代」,三个标签的片立刻调出来 |
| 5 | 关注推送 | 关注 / 社交召回 | 你关注的导演 / 演员出新片,直接推 |
| 6 | 场景挑片 | 上下文召回(LBS) | 同城、周末、雨天 → 推适合当下的片 |
| 7 | 保底兜底 | 热门召回 | 啥都失败时,给你看本周热租爆款 |
| 8 | 新客专属 | 冷启动召回 | 新用户 / 新片,用 Bandit、look-alike 等专门策略 |
真实平台同时跑 6–12 种——每种擅长不同场景,互相补盲。冷启动相关的召回策略详见冷启动问题。
4. 三个最核心的玩法,用大白话讲清楚
4.1 ItemCF — 「口碑老挑片员」
逻辑:
「你之前租过《美国往事》《教父》都看得很过瘾」
「历史上,喜欢这两部的人也大都喜欢《华尔街之狼》」
「→ 把《华尔街之狼》推给你」
完全不看《华尔街之狼》讲了啥、谁演的——只看「历史上有没有跟它常被同一批人一起喜欢的片,正好你也喜欢」。
公式 1 行就能写:
两部片有多像 = 「同时喜欢两部的客人数」 / √(喜欢 A 的人 × 喜欢 B 的人)
致命弱点:新片还没人租过 → 算不出相似度 → 永远召不出来(冷启动)。展开细节见 ItemCF 协同过滤。
4.2 双塔 — 「气质速配」
用户塔 → 把你(年龄、爱好、最近看过的片)→ 压成 128 个数字(向量)
物品塔 → 把每部片(类型、年代、主创、简介)→ 也压成 128 个数字
把两个向量塞进同一个「气质坐标系」(同一个向量空间)
↓
向量靠得近 = 越对味
训练目标:让「历史上你看了并喜欢的片」向量靠近你,没看 / 不喜欢的离远。
关键设计:两个塔互相不能偷看对方的资料——否则你就没法离线把全库片的向量都算好。一旦「得看见你才能算出片的向量」,1 亿部片每次都要重算,毫秒级响应做不到。
离线(每晚跑一次):
→ 把 1 亿部片的向量都算好,建索引
在线(你刷新一次):
→ 算一下「你」的向量(你的塔,毫秒级)
→ 去索引里找最近的 200 个向量
→ 完成,p99 < 30ms
为什么这是工业界标准:YouTube DNN 2016 年提出,10 年了基本没换过框架。完整拆解见 双塔召回。
4.3 ANN — 「片库的卡片柜」
问题:1 亿张片卡,你拿一张「你」的卡片去找最像的 200 张
暴力法:1 亿张卡片一张张比 → 几分钟 → 不可能
ANN 法:先按「楼层 → 分类 → 货架」导航 → 只跟某个小货架的卡片比 → 30ms 搞定
代价:偶尔会漏掉真正最相似的(比如它在另一个货架)。
收益:1000 倍速度提升。99% 召得到 vs 100% 但慢 1000 倍——业务永远选前者。
主流算法:HNSW(最常用)、IVF + PQ(最省内存)、FAISS(最常用的库)。
5. 多路融合 — 「请 6 个挑片员并行选片」
没有一路召回能覆盖所有场景,所以平台同时跑多路,各管一摊,再用 RRF 融成一份名单。
为啥不能只靠 1 个挑片员?
| 你的真实需求 | 单一挑片员的盲区 |
|---|---|
| 我想看刚上架的这部冷门片 | 老挑片员没数据,算不出 |
| 我是新客,从没租过任何片 | 老挑片员束手无策 |
| 这个月全站最火的爆款 | 个性化匹配可能漏 |
| 周末 / 下雨 / 我在外地 | 静态匹配感知不到 |
怎么融合 6 个挑片员的名单?
最常用是 RRF(也是 recsys-mini 现在在用的):
每个候选的最终分 = Σ 1 / (60 + 它在第 N 个挑片员的排名)
翻译人话:只看每个挑片员把你排第几,不看打了几分。这样不同挑片员的「打分体系」不一致也不影响。RRF 的完整推导见 多路召回融合。
6. 三个最常踩的评估坑
坑 1:召回阶段看 NDCG 没意义
召回只问「在不在 200 部里」
NDCG 是「排第几」
→ 你召回内部排第几,排序会全部打散重新排
→ 看 NDCG 等于自欺欺人
正确做法:召回阶段只看 Recall@K + Coverage。
坑 2:Coverage 高 ≠ 候选多样
6,000 个用户,每人 200 个候选
总共覆盖 70% 的物品 ← 看似不错
但每个用户的 200 个候选可能高度雷同 ← 用户体验仍然单调
正确指标:要看 每个用户列表内的 ILD(Intra-List Diversity)。
坑 3:K 一变,指标就不可比
A 模型 Recall@10 = 6%
B 模型 Recall@200 = 50%
→ 这不能比!K 不一样
铁律:对比模型,K 必须固定。这是最常见的「伪提升」陷阱。
7. 一个隐藏的大坑 — SSB
SSB = Sample Selection Bias(样本选择偏差)。
场景:
昨天:店里只用「老挑片员 + 兜底」挑片
→ 老板打分系统就是基于「这些候选」训练的
今天:你给店里升级了「气质速配(双塔)」
→ 候选的分布完全变了(多了一堆从没推过的片)
→ 老板之前训练的打分体系不再适用
→ 排序质量暴跌
解决:任何一次召回升级,都必须重新训练排序。这是 recall ↔ ranking 的「耦合契约」,跑不掉。这条铁律会在 双塔召回 和 排序精排 里反复出现。
8. 一个可跑的召回基线
用 MovieLens-1M 搭的教学级推荐系统 recsys-mini,当前召回路线:
召回路线:
ItemCF + Popular → RRF 融合 → Recall@200 = 50.20%
| 排名 | 下一步要做的 | 期待收益 | 工作量 |
|---|---|---|---|
| ⭐⭐⭐ | 上双塔召回(DSSM + FAISS) | Recall@200 → 60%+ | 3–5 天 |
| ⭐⭐⭐ | 上内容召回(用电影标题做 NLP 向量) | 解决冷门电影召不出的问题 | 1–2 天 |
| ⭐⭐ | 把「是哪个召回路出的」作为排序特征 | 不动召回也能提升排序 | 半天 |
| ⭐⭐ | 学习式融合替代 RRF | 突破现在的 RRF 上限 | 1 天 |
TL;DR — 三句话
-
召回 = 挑片员,排序 = 老板。 召回宁可多搬 200 部片上桌(高 Recall@K),也别漏掉你的真爱片(漏了老板救不回来)。
-
现代召回 = 双塔 + ANN 是主力。 双塔把用户和物品都压成向量,ANN 让 1 亿候选里秒找 200。这是过去 10 年没变过的工业界标配。
-
多路并行召回 + RRF 融合 + 重训排序,是一套「系统工程」。 没有一种召回路能 cover 所有需求,所以平台同时跑 6–12 路。每次召回改了,排序必须重训——这是 SSB 的铁律。
对照表 — 比喻 ↔ 术语
| 本文比喻 | 推荐系统术语 |
|---|---|
| 挑片员 | Recall(candidate generation) |
| 老板 | Ranking |
| 老板娘 / 最终摆片 | Re-ranking / final mix |
| 200 部候选 | top-K candidates |
| 真爱片在不在 | Recall@K |
| 挑片员用了多少片库 | Coverage@K |
| 8 种挑片员流派 | 8 families of recall |
| 口碑老挑片员 | Collaborative filtering(CF / ItemCF / Swing) |
| 气质速配 | Two-tower(DSSM / YouTube DNN) |
| 卡片柜 | ANN indexing(HNSW / IVF / FAISS) |
| 顺藤摸瓜 | Graph recall(LightGCN / PinSage) |
| 标签速配 | Inverted recall(tag / category) |
| 6 个挑片员并行选 | Multi-route fusion + RRF |
| SSB 隐藏大坑 | Recall ↔ ranking consistency(SSB) |
下一篇进入召回的第一路、也是最经典的一路——ItemCF 协同过滤:一本 25 年前的「老账本」,凭什么今天还在抖音、淘宝、Netflix 的召回里活蹦乱跳。