题目
设计一个短视频平台的个性化推荐系统
信息
- 类型:问答
- 难度:⭐⭐
考点
推荐算法设计,冷启动问题,系统可扩展性,实时性处理
快速回答
设计短视频推荐系统的核心要点:
- 混合推荐策略:结合协同过滤(用户/物品相似度)与内容特征(视频标签/嵌入)
- 冷启动解决方案:新用户使用热门视频+兴趣问卷;新视频使用内容相似推荐
- 实时反馈处理:通过Kafka处理用户行为(点赞/观看时长)实时更新推荐
- 分层架构:离线训练(TensorFlow/PyTorch)+ 近线特征存储(Redis)+ 在线服务(微服务)
- 评估指标:CTR、观看时长、多样性(基尼系数)综合评估
1. 系统架构设计
分层架构示意图:
┌─────────────────┐ ┌─────────────────┐
│ 离线训练层 │◄─────►│ 特征存储层 │
│ (TensorFlow作业) │ │ (Redis/Cassandra)│
└─────────────────┘ └─────────────────┘
▲ ▲
│ │
┌─────────────────┐ ┌─────────────────┐
│ 近线处理层 │ │ 在线服务层 │
│ (Flink/Kafka) │──────►│ (gRPC微服务) │
└─────────────────┘ └─────────────────┘
▲
│
┌─────────────────┐
│ 数据源层 │
│ (用户行为日志) │
└─────────────────┘2. 核心推荐算法
混合推荐策略:
- 协同过滤:基于用户行为矩阵(用户×视频)计算相似度
# 用户相似度计算示例 (Python伪代码) from sklearn.metrics.pairwise import cosine_similarity def user_similarity(user_vectors): return cosine_similarity(user_vectors) - 内容过滤:使用视频标题/图像的嵌入向量(BERT/ResNet)
# 视频嵌入示例 video_embedding = { "video_id": "v123", "title_embedding": [0.12, -0.05, ..., 0.78], # BERT输出 "image_embedding": [0.45, 0.22, ..., -0.33] # ResNet输出 } - 实时排序模型:特征工程 + 深度排序模型
# 排序模型特征示例 features = { "user_id": "u456", "video_id": "v789", "user_video_ctr": 0.15, # 历史CTR "last_7d_interact_count": 5, # 7天互动次数 "embedding_similarity": 0.82 # 用户与视频嵌入相似度 }
3. 冷启动解决方案
| 场景 | 解决方案 | 实现方式 |
|---|---|---|
| 新用户 | 兴趣问卷+热门视频 | 首次登录弹窗选择兴趣标签 |
| 新视频 | 内容相似推荐 | 匹配已有视频的嵌入向量 |
| 低活用户 | 混合全局热度 | 50%个性化+50%热门视频 |
4. 实时性处理
实时反馈流程:
- 用户观看行为 → Kafka消息队列
- Flink实时计算CTR/观看完成率
- 更新Redis中的用户特征向量
- 在线服务每秒可处理10k+请求
// Kafka消费者伪代码
kafkaConsumer.subscribe("user_behavior");
while (true) {
records = kafkaConsumer.poll();
for (record in records) {
updateUserProfile(record.userId, record.videoId, record.action);
redis.increment("user:${userId}:watch_count");
}
}5. 最佳实践与常见错误
最佳实践:
- 使用多臂赌博机(MAB)平衡探索与利用
- 定期进行A/B测试(如新旧算法各5%流量)
- 设置多样性约束:单页推荐中同类视频≤20%
常见错误:
- ❌ 仅依赖协同过滤导致马太效应
- ❌ 忽略特征存储的版本管理
- ❌ 实时系统未考虑消息积压保护
6. 扩展知识
- 深度模型:YouTube DNN/双塔模型
- 重排序技术:MMR算法提升多样性
- 联邦学习:在隐私保护场景下的应用
- 评估指标对比:
- 准确性:AUC/CTR
- 用户体验:平均观看时长
- 生态健康:基尼系数(推荐多样性)