网易云音乐、新闻、游戏、邮箱、LOFTER、网易号……你可能不知道:
“网易内部推荐系统每天调用超10亿次,为数十个业务场景提供‘你喜欢’。”
而背后的推荐不是玄学,而是一整套多阶段召回 + 特征工程 + 多塔深度模型 + 实时重排的系统。
今天,我们不仅讲算法,还讲代码、样例和真实召回逻辑。
一、网易推荐架构全景图(多阶段、多模型、多业务)
graph TD
A[用户请求] --> B[粗排召回层]
B --> C[多路召回通道]
C --> D[候选集合并]
D --> E[特征工程处理]
E --> F[排序模型层(DNN+LR+GBDT)]
F --> G[TopK生成]
G --> H[用户前端展示]
二、召回阶段:网易的“六路召回”策略
通道 | 描述 | 示例 |
---|---|---|
用户行为召回 | 根据用户点击/点赞记录 | “你最近听过的歌手” |
相似内容召回 | 根据内容 embedding 相似度 | “听了A推荐B” |
热门召回 | 当前热点内容或热榜 | “今日热议话题” |
标签匹配召回 | 用户兴趣与内容打标签匹配 | “你关注的‘爵士乐’” |
地域兴趣召回 | 区域偏好挖掘 | “广州本地最火游戏” |
社交传播召回 | 好友互动内容推送 | “你朋友点赞了...” |
三、代码演示:内容 embedding 相似度召回(简化)
# 1. 基于 FastText/Word2Vec/自研embedding模型获取内容向量
def get_embedding(content_id):
return content_embedding_db[content_id]
# 2. 计算与目标内容的余弦相似度
def cosine_sim(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# 3. 召回最相似的10条内容
def recall_similar_content(target_id, topk=10):
target_vec = get_embedding(target_id)
all_scores = []
for cid in content_pool:
if cid == target_id:
continue
score = cosine_sim(target_vec, get_embedding(cid))
all_scores.append((cid, score))
return sorted(all_scores, key=lambda x: -x[1])[:topk]
✅ 输出样例:
[
('song_324', 0.976),
('song_871', 0.953),
('song_112', 0.941),
...
]
这些候选内容就是召回阶段第一步结果,将进入后续排序。
四、特征工程:网易推荐模型的关键“黑魔法”
每个候选内容,网易会生成超200维特征,分为:
类别 | 示例特征 |
---|---|
用户侧 | uid、历史点击 CTR、活跃天数、兴趣词向量 |
内容侧 | content_id、类型、标签、热度、embedding |
行为侧 | 展现时间、点击时间、页面位置、设备类型 |
交叉特征 | 用户兴趣 × 内容标签;地域 × 内容类型等 |
五、排序模型:DNN + Wide & Deep + 多塔网络(DeepFM)
网易推荐排序核心模型是类似如下结构:
import torch.nn as nn
class NetEaseRankModel(nn.Module):
def __init__(self):
super().__init__()
self.wide = nn.Linear(200, 1)
self.deep = nn.Sequential(
nn.Linear(200, 128),
nn.ReLU(),
nn.Linear(128, 64),
nn.ReLU(),
nn.Linear(64, 1)
)
def forward(self, x):
wide_out = self.wide(x)
deep_out = self.deep(x)
return wide_out + deep_out
- Wide部分捕捉稀疏组合(如:广州+游戏)
- Deep部分捕捉非线性兴趣(如:你最近总在听“民谣”)
六、真实重排流程(简化)
def rerank(candidates, user_features):
scored = []
for cid in candidates:
content_feat = get_content_feature(cid)
combined = combine(user_features, content_feat)
score = model.predict(combined)
scored.append((cid, score))
return sorted(scored, key=lambda x: -x[1])[:10]
✅ 实测输出(Top10):
[ ('song_871', 0.91), ('song_112', 0.89), ('song_324', 0.85), ...]
这些就是最终推荐给你的列表。
七、网易个性化推荐的亮点总结:
特性 | 说明 |
---|---|
多源召回 | 精准构建候选内容池 |
海量特征 | 支持多业务横向扩展 |
模型混合 | Wide + Deep、FM、GBDT 多模型融合 |
实时性强 | 推荐请求延迟 < 100ms |
强调用户冷启动 | 使用 user embedding + 类似用户迁移学习补齐数据不足问题 |
彩录:
“网易推荐系统不是要‘推荐内容’,而是‘推荐你想成为的样子’。”