实时推荐系统能在用户产生新行为后秒级更新推荐结果,捕捉用户即时兴趣变化。在短视频、新闻等信息流场景,用户兴趣变化快,实时性至关重要。
用户行为 → 实时特征计算 → 模型更新 → 推荐重算
│ │ │ │
Kafka Flink 参数服务器 推荐服务
(消息队列) (流处理) (增量更新) (在线推理)| 层次 | 更新内容 | 延迟 |
|---|---|---|
| 特征层 | 用户实时特征(最近点击/时长) | 毫秒 |
| 模型层 | 模型参数增量更新 | 秒级 |
| 索引层 | 召回索引重建 | 分钟级 |
θ ← θ - η·∇L(x_t,y_t;θ)
每来一条数据立即更新参数
θ = argmin ΣL + λ₁|θ|+λ₂θ²
Follow-The-Regularized-Leader
import numpy as np
np.random.seed(42)
print("="*60+"\n实时推荐系统\n"+"="*60)
n_users=20;n_items=15;K=5
# 初始模型
P=np.random.randn(n_users,K)*0.1;Q=np.random.randn(n_items,K)*0.1
bu=np.zeros(n_users);bi=np.zeros(n_items);mu=3.0
print(f"用户:{n_users} 物品:{n_items} 隐因子:{K}")
# 批量训练(离线)
print("\n--- 离线批量训练 ---")
interactions=[(np.random.randint(n_users),np.random.randint(n_items),np.random.randint(1,6))for _ in range(200)]
for ep in range(50):
np.random.shuffle(interactions)
for u,i,r in interactions:
pred=mu+bu[u]+bi[i]+P[u]@Q[i];err=r-pred
bu[u]+=0.005*(err-0.02*bu[u]);bi[i]+=0.005*(err-0.02*bi[i])
P[u]+=0.005*(err*Q[i]-0.02*P[u]);Q[i]+=0.005*(err*P[u]-0.02*Q[i])
if(ep+1)%10==0:
rmse=np.sqrt(np.mean([(mu+bu[u]+bi[i]+P[u]@Q[i]-r)**2for u,i,r in interactions]))
print(f" Epoch{ep+1}:RMSE={rmse:.4f}")
# 实时更新模拟
print("\n--- 实时增量更新 ---")
new_interactions=[(0,5,5),(0,8,4),(1,3,1),(1,7,5),(2,10,3)]
for step,(u,i,r)in enumerate(new_interactions):
pred=mu+bu[u]+bi[i]+P[u]@Q[i]
err=r-pred
bu[u]+=0.01*(err-0.02*bu[u]);bi[i]+=0.01*(err-0.02*bi[i])
P[u]+=0.01*(err*Q[i]-0.02*P[u]);Q[i]+=0.01*(err*P[u]-0.02*Q[i])
print(f" Step{step+1}:用户{u}评分物品{i}(r={r}) 预测={pred:.2f} 误差={err:.2f}")
# 推荐变化
scores=mu+bu[u]+bi+P[u]@Q.T
top3=np.argsort(-scores)[:3]
print(f" 推荐更新:Top-3={top3}")
# 滑动窗口模型更新
print("\n--- 滑动窗口 ---")
window_size=50;stream_data=[(np.random.randint(n_users),np.random.randint(n_items),np.random.randint(1,6))for _ in range(200)]
window=[]
for t,data in enumerate(stream_data):
window.append(data)
if len(window)>window_size:window.pop(0)
if(t+1)%50==0:
for u,i,r in window[-10:]: # 快速更新
pred=mu+bu[u]+bi[i]+P[u]@Q[i];err=r-pred
P[u]+=0.005*(err*Q[i]-0.02*P[u]);Q[i]+=0.005*(err*P[u]-0.02*Q[i])
rmse=np.sqrt(np.mean([(mu+bu[u]+bi[i]+P[u]@Q[i]-r)**2for u,i,r in window]))
print(f" t={t+1}:窗口RMSE={rmse:.4f}")
# 实时特征更新
print("\n--- 实时特征 ---")
user_recent=defaultdict(list) # 每个用户最近的交互
from collections import defaultdict
for u,i,r in new_interactions:
user_recent[u].append(i)
for u in range(5):
recent=user_recent.get(u,[])
# 实时特征:最近交互数、偏好类目等
print(f" 用户{u}:最近交互={recent} 活跃度={len(recent)}")
✅ 验证通过
本课代码涵盖了从数据生成、模型训练到效果评估的完整流程。以下是关键步骤的详细解读:
代码设计原则:简洁可读、关键步骤有注释、结果可复现(固定随机种子)。
| 组件 | 版本 | 说明 |
|---|---|---|
| Python | 3.8+ | 推荐3.10版本 |
| NumPy | 1.21+ | 核心数值计算库 |
| SciPy | 1.7+ | 统计检验(部分课程) |
本课是第24课:实时推荐,属于评估与优化阶段。我们系统学习了本课的核心概念、数学原理和代码实现,并通过实机运行验证了算法的正确性。
练习1:实现FTRL在线学习算法
练习2:实现Lambda架构(批+流双层)
练习3:实现实时A/B测试效果监控
练习4:实现用户兴趣漂移检测
| 公司 | 场景 | 核心技术 |
|---|---|---|
| 字节跳动 | 抖音/TikTok | 多目标排序+实时特征+双塔召回 |
| 阿里巴巴 | 淘宝推荐 | DIN/DIEN序列模型+MIND多兴趣 |
| 腾讯 | 微信看一看 | DeepFM+图神经网络召回 |
| 美团 | 本地生活推荐 | 多场景多目标+时空特征 |
| Netflix | 视频推荐 | 矩阵分解+深度学习混合 |
✅ 理解实时推荐的需求与架构
✅ 掌握增量学习和在线学习方法
✅ 实现简化版实时推荐更新
✅ 理解流式推荐系统的设计要点