1. 项目概述:当推荐系统遇上短视频
三年前接手一个短视频平台重构项目时,我第一次体会到协同过滤算法的魔力。当时平台日活30万用户,但平均观看时长只有2.1分钟。引入基于用户行为的协同过滤后,三个月内观看时长提升到4.7分钟——这就是为什么我现在每次聊推荐系统都特别来劲。
这个Python+Django+Vue3技术栈的短视频系统,核心在于用协同过滤算法解决内容分发的"冷启动"和"信息茧房"问题。不同于传统基于内容标签的推荐,协同过滤通过挖掘用户群体行为模式,能发现"喜欢A视频的人也倾向于喜欢B视频"这类隐藏关联,即使这两个视频的标签毫无交集。
2. 系统架构设计解析
2.1 技术栈选型逻辑
选择Django作为后端框架时,我们重点考察了其ORM对复杂查询的封装能力。比如计算用户相似度时需要频繁执行这样的查询:
python复制# 获取用户A点赞过的视频ID列表
liked_videos = UserBehavior.objects.filter(
user_id=target_user,
behavior_type='like'
).values_list('video_id', flat=True)
Vue3的组合式API则完美适配推荐结果的实时更新需求。当用户在移动端下滑刷新时,前端通过axios发送的请求体包含最近10次交互事件的时间戳:
javascript复制const payload = {
last_behaviors: [
{video_id: 123, timestamp: 1689923475, type: 'share'},
{video_id: 456, timestamp: 1689923012, type: 'pause_at_30s'}
]
}
2.2 数据流设计要点
用户行为采集采用异步埋点方案,通过Redis消息队列削峰。我们自定义了行为权重系数:
- 完整观看=1.0
- 点赞=0.7
- 分享=0.5
- 暂停=0.3(根据暂停位置动态调整)
关键经验:不要在用户高频率操作时同步写入数据库,我们曾因此导致API响应时间从200ms飙升到1.2s
3. 协同过滤算法实现细节
3.1 用户相似度计算优化
传统余弦相似度计算在用户量达百万级时性能堪忧。我们的解决方案是:
- 使用NumPy向量化运算
- 对稀疏矩阵采用CSR压缩格式
- 每周离线计算TopN相似用户并缓存
实测表明,在100万用户规模下,查询响应时间从原始方案的4.3s降至0.2s:
| 方案 | 内存占用 | 计算耗时 | 准确率 |
|---|---|---|---|
| 原始计算 | 12GB | 4.3s | 98% |
| 优化方案 | 3.2GB | 0.2s | 95% |
3.2 冷启动处理策略
新视频通过以下维度获得初始曝光机会:
- 上传者粉丝的20%流量池
- 同城用户推荐流
- 标签相似度补偿算法
我们设计了一个热度衰减因子:
code复制初始权重 = 基础分 + 创作者等级系数
每日衰减率 = max(0.1, 1 - 播放完成率)
4. 工程化落地挑战
4.1 实时推荐更新机制
采用混合更新策略:
- 主推荐流:每小时离线计算
- 侧边栏推荐:实时计算(<5分钟延迟)
- 应急通道:热门内容人工加权
数据库分片方案按用户ID哈希分配,但保留10%的弹性分片用于热点用户。曾因某明星入驻导致单个分片QPS突破3万,触发熔断机制。
4.2 性能监控指标
我们建立了四级警报体系:
- 推荐响应时间>500ms
- 行为日志延迟>1分钟
- 相似度计算误差>5%
- 新用户留存率<35%
有一次凌晨3点收到警报,发现是因为Redis集群某个节点内存溢出,导致相似用户查询回退到数据库查询。后来我们增加了缓存降级策略的多级回退机制。
5. 前端交互设计技巧
5.1 加载性能优化
视频卡片采用动态尺寸加载,首屏只加载可视区域+1屏的内容。监测到用户下滑速度加快时,提前触发推荐接口:
javascript复制const scrollHandler = throttle(() => {
if (scrollSpeed > 1000) {
prefetchNextPage()
}
}, 300)
5.2 负反馈收集设计
不同于简单的"不感兴趣"按钮,我们设计了三级反馈:
- 内容质量差(降权该创作者)
- 看过类似内容(调整多样性系数)
- 暂时不想看(24小时内降低该类目权重)
6. 实际效果与调优
上线三个月后的核心指标变化:
| 指标 | 基线 | 当前 | 提升 |
|---|---|---|---|
| 人均观看时长 | 2.1min | 4.7min | 124% |
| 次日留存率 | 31% | 43% | 38% |
| 分享率 | 5% | 9% | 80% |
但我们也发现了一些意外现象:
- 凌晨3-5点的推荐点击率异常高(后来发现是夜班人群的独特偏好)
- 15秒以下的视频在午休时段表现更好
- 教育类内容在周末早上的完播率是工作日的3倍
这些发现促使我们增加了时段特征维度,进一步优化了推荐效果。