推荐系统召回机制全景指南:从经典算法到工业级实践
在推荐系统中,召回是离用户最近的一环,也是一道既要"快"又要"准"的技术难题。本文将系统梳理召回层常用策略,从协同过滤到向量检索,从算法原理到工程实现,带你全面理解推荐系统召回的底层逻辑与实际落地。
为什么要做召回?
在推荐系统的三大模块中:
- 召回(Recall):从亿级候选集中快速选出几千个相关物品;
- 粗排(Ranking):利用轻量模型对召回结果进行粗略排序;
- 精排(Re-Ranking):利用复杂模型进一步优化排序结果;
- 重排(Post-Ranking):多样性/新颖性处理。
其中召回作为入口,决定了推荐系统的"上限"。
协同过滤类召回通道
1️⃣ ItemCF(基于物品的协同过滤)
核心思想:"喜欢A的用户也喜欢B" → A 和 B 相似 → 推荐 B
- 利用全体用户行为计算物品间的相似度;
- 用余弦相似度衡量"看过《笑傲江湖》的用户也看了《鹿鼎记》"的频繁程度;
- 建立两个索引:
- 用户 → 最近交互物品;
- 物品 → 相似物品集合。
优势:简单高效,易于实现; 局限:容易被"短时热点"干扰,缺乏多维信息建模能力。
2️⃣ Swing(ItemCF 改进版)
核心思想:在 ItemCF 基础上惩罚"小圈子"效应。
- 两个用户共同喜欢 A 和 B,但如果这两人行为重合度过高(如社群传播),则对相似度贡献较小;
- 使用用户间的 overlap 降低噪声。
更稳健,适合社区产品。
3️⃣ UserCF(基于用户的协同过滤)
核心思想:"我" 和某个用户兴趣相似 → 他喜欢的我也可能喜欢
- 计算用户之间的相似度;
- 基于用户 → 用户 → 物品的链路进行召回。
优势:可解释性强; 局限:用户冷启动问题严重。
向量召回类模型
4️⃣ 矩阵补全(Matrix Factorization)
基础模型:将用户和物品映射到同一向量空间,内积表示兴趣值。
- 用户 → 向量 a_u;
- 物品 → 向量 b_i;
- 兴趣估计:score(u, i) = ⟨a_u, b_i⟩。
工业实践中较少使用,缺点包括:
- 仅用 ID embedding,缺少属性;
- 训练方式落后(平方损失、内积);
- 正负样本构造简单粗暴。
5️⃣ 双塔模型(Two-Tower Model)
工业级向量召回首选方案。
- 用户塔:接入用户画像(性别、兴趣、活跃度等);
- 物品塔:接入内容属性(类目、关键词、作者等);
- 输出向量后做余弦相似度检索。
训练方式有:
- Pointwise:正负样本二分类;
- Pairwise:正负配对进行排序;
- Listwise:同时对一正多负建模。
向量召回过程:
- 离线计算所有物品向量 → 存入 Milvus / Faiss 等;
- 线上实时计算用户向量 → 近似最近邻检索出 topK 个物品。
优势:
- 强表达能力;
- 灵活支持结构化与非结构化特征;
- 支持在线更新用户 embedding。
正负样本构造策略
双塔模型训练的关键:
✅ 正样本:
- 用户点击、点赞、收藏过的物品;
- 为避免过拟合热门物品,需对其做降采样处理。
❌ 错误负样本:
- 曝光但没点的不一定是负样本,可能只是"点击时机未到";
- 精排中淘汰的候选更可能是"困难负样本"。
好的负样本策略:
- 简单负样本:全量池中采样,注意防止对冷门物品不公平;
- 困难负样本:来自排序淘汰、精排靠后内容;
- Hybrid 采样:训练数据中混入易难负样本,提升泛化能力。
工程实现与线上更新机制
1️⃣ 向量数据库加速检索
- 推荐使用 Milvus、Faiss、HnswLib;
- 将物品 embedding 离线构建索引;
- 线上用 query(用户向量)检索余弦相似度最大的候选。
2️⃣ 模型更新机制
- 全量更新:每日训练、发布新模型;
- 增量更新:实时数据微调 Embedding 层,保持在线个性化;
- 两者结合,可提升准确率与实时性。
其他召回通道(用于增强多样性)
类型 | 示例 | 特点 |
---|---|---|
地理位置 | GeoHash召回、同城召回 | 无个性化,但贴近线下兴趣 |
作者相关 | 关注作者、有交互作者、相似作者召回 | 补充个性化召回路径 |
缓存召回 | 精排但未曝光的内容缓存 | 降低计算,复用历史结果 |
✨ 总结
推荐系统的召回策略,从规则驱动的协同过滤,到表达能力更强的深度模型,乃至多源融合的增强通道,已逐步形成丰富的技术体系。在实际工程中,往往会组合使用多种召回通道,形成一个"候选池联盟",为排序模块提供足够多样、质量稳定的候选集。