设计推荐系统
需求
设计内容/商品推荐系统,支持:
- 千万级用户、百万级物品
- 推荐延迟 < 100ms
- 支持多种推荐场景(首页、详情页、搜索结果)
架构设计
四层漏斗
| 层级 | 目标 | 候选数 | 延迟 | 方法 |
|---|---|---|---|---|
| 召回 | 从全量中选出候选集 | 全量 → 1000 | 10ms | 多路召回 |
| 粗排 | 快速过滤 | 1000 → 200 | 10ms | 轻量模型 |
| 精排 | 精确打分 | 200 → 50 | 30ms | 深度模型 |
| 重排 | 多样性、业务规则 | 50 → 20 | 5ms | 规则引擎 |
召回策略
| 召回通路 | 方法 | 适用场景 |
|---|---|---|
| 协同过滤 | UserCF / ItemCF | 有行为历史的用户 |
| 向量召回 | Embedding ANN | 全量用户 |
| 热门召回 | 全站/分类 TopN | 冷启动用户 |
| 标签召回 | 基于用户标签匹配 | 新用户 |
| 关联召回 | 看了又看、买了又买 | 详情页推荐 |
-- ItemCF:基于物品的协同过滤
-- 找到与用户历史行为物品相似的物品
WITH user_items AS (
SELECT user_id, item_id
FROM user_behaviors
WHERE behavior_type = 'click'
AND behavior_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
),
item_similarity AS (
SELECT
a.item_id AS item_a,
b.item_id AS item_b,
COUNT(DISTINCT a.user_id) AS co_users,
-- 余弦相似度
COUNT(DISTINCT a.user_id) / SQRT(
(SELECT COUNT(DISTINCT user_id) FROM user_items WHERE item_id = a.item_id) *
(SELECT COUNT(DISTINCT user_id) FROM user_items WHERE item_id = b.item_id)
) AS similarity
FROM user_items a
JOIN user_items b ON a.user_id = b.user_id AND a.item_id < b.item_id
GROUP BY a.item_id, b.item_id
HAVING co_users >= 5
)
SELECT item_b AS recommend_item, similarity
FROM item_similarity
WHERE item_a IN (SELECT item_id FROM user_items WHERE user_id = 'target_user')
ORDER BY similarity DESC
LIMIT 100;
特征工程
| 特征类型 | 示例 | 更新频率 |
|---|---|---|
| 用户特征 | 年龄、历史购买品类、活跃度 | T+1 |
| 物品特征 | 价格、品类、CTR、上架时间 | T+1 |
| 上下文特征 | 时间、设备、地点 | 实时 |
| 交叉特征 | 用户×品类偏好、用户×价格段 | T+1 |
常见面试问题
Q1: 冷启动如何解决?
答案:
| 冷启动类型 | 解决方案 |
|---|---|
| 新用户 | 热门推荐 → 引导选择兴趣 → 基于注册信息推荐 |
| 新物品 | 基于内容特征匹配 → 小流量曝光测试 → 收集数据后迭代 |
Q2: 如何评估推荐效果?
答案:
| 评估方式 | 指标 | 说明 |
|---|---|---|
| 离线评估 | Precision/Recall/NDCG | 历史数据回测 |
| 在线 A/B | CTR、转化率、人均消费 | 真实流量实验 |
| 长期指标 | 用户留存、多样性 | 防止茧房效应 |