网易推荐系统全揭秘:如何让用户越刷越上头?(附算法逻辑+特征样例+召回实测)

102 阅读3分钟

网易云音乐、新闻、游戏、邮箱、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 + 类似用户迁移学习补齐数据不足问题

彩录:

“网易推荐系统不是要‘推荐内容’,而是‘推荐你想成为的样子’。”