Skip to content

推荐系统工作原理

一条帖子进入 For You 推荐流的完整链路:凑候选、补资料、过滤、打分、选择、可见性检查、混排。

Updated

本页面向产品、运营和创作者,介绍 For You 推荐流从请求到展示的完整流程。本页不贴代码;每节末尾链接到对应的技术页。

核心流程概述

用户打开 X 的 For You 时,home-mixer 实时组装一份推荐流。它从多个来源取出候选帖子,过滤掉不能看的,用 Phoenix 排序模型 给每条帖子打分,选出前 35 条,再检查每条能不能展示给这位用户,最后插入广告和推荐关注等模块。

另一条路径在后台持续运行:内容理解模型和规则给帖子、账号打标签。请求路径在“可见性检查”这一步读取这些标签。详见 系统架构总览。

排序靠模型预测,不靠人工加分规则

排序不靠“带图加分、粉丝多加分”这类人工规则。Phoenix 排序模型 读取用户最近的互动序列,预测用户对每条候选帖子做出各种行为的概率。

模型的输入也包括帖子的公开互动数:点赞、回复、转发、引用、浏览 5 个计数。帖子发布超过约 14 天后,这些计数不再输入模型(phoenix/xrex/data/recsys/feature_config.py:87-88)。

一条帖子进入推荐流的七个步骤

flowchart TB
    A["① 凑候选<br/>关注的人发的 + 站外来源"] --> B["② 补资料<br/>正文 / 作者 / 媒体 / 互动数"]
    B --> C["③ 预打分过滤<br/>拉黑 / 看过 / 超过 48 小时"]
    C --> D["④ 模型打分<br/>预测每种行为的概率并加权"]
    D --> E["⑤ 选择<br/>先取 50 条,最终留 35 条"]
    E --> F["⑥ 可见性检查<br/>按标签决定展示、遮罩或丢弃"]
    F --> G["⑦ 混排<br/>插入广告、推荐关注等模块"]

1. 凑候选:多个来源同时取帖

home-mixer 同时向多个候选源取帖(home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs:380-390)。主要来源有四个:

  • 站内帖子(你关注的人发的):由 Thunder 提供。Thunder 在内存里保存最近 2 天发布的帖子。
  • Phoenix 召回(站外):Phoenix 召回 用双塔模型从全网找出与你兴趣接近的帖子。用户会刷到未关注的人,主要来自这一路。
  • SimClusters(站外):SimClusters 用你最近互动过的帖子做种子,找相似的帖子。开源默认开启。
  • 热门帖子(站外):一份全站共享的热门列表。离线任务按粉丝数从高到低选作者,人数为近 7 天活跃发帖人数的 0.005%,每人最多 5 条、共 500 条(home-mixer/util/popular_authors.rs:11,25-30、home-mixer/util/popular_posts.rs:39-40)。

全部来源见 home-mixer 编排层。

2. 补资料(水合)

候选源返回的通常只有帖子 ID。水合(hydration)指按 ID 补齐帖子的正文、作者资料、媒体信息、互动数等字段。详见 home-mixer 编排层。

3. 预打分过滤:先去掉不该出现的帖子

打分之前,21 个过滤器依次去掉不合格的候选(home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs:285-543)。例如:

  • 发布超过 48 小时的帖子(home-mixer/params/config.rs:39)。
  • 你拉黑或静音的作者的帖子。
  • 命中你屏蔽词的帖子。
  • 你已经看过、或本次会话已经推给你的帖子。
  • 你无权查看的订阅专属帖子。

完整清单见 过滤流水线。

4. 模型打分:预测行为概率,再加权求和

Phoenix 排序模型 对每条候选预测多种行为的概率,包括点赞、回复、转发、停留、点开主页,以及“不感兴趣”、拉黑、举报等负向行为。

vm-ranker 把每个概率乘以对应权重,再求和,得到帖子的最终分(xai-value-model/scoring.rs:79-218)。正向行为的权重为正,负向行为的权重为负。

权重乘的是“你做出这个行为的预测概率”,不是帖子收到的互动次数(xai-value-model/scoring.rs:28-56)。权重数值、作者多样性衰减、站外降权和新作者扶持,见 打分与排序。

5. 选择:先取 50 条,最终留 35 条

系统按最终分从高到低取前 50 条,再经过选后检查,最终保留 35 条(home-mixer/params/config.rs:17-18,开源默认值)。详见 选帖过程。

6. 可见性检查:按标签决定能不能展示

排序决定先后,可见性过滤 决定能不能展示。home-mixer 对选中的每条帖子询问可见性过滤服务(home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs:487)。服务读取后台打好的标签,给出四种答复之一:

答复 结果
ALLOW 正常展示
NOTICE 展示,并附一条提示
INTERSTITIAL 展示,但加一层遮罩,用户点开才能看
DROP 不展示

对未关注的作者,有些规则更严格:同一条帖子可以推给关注者,却不推给非关注者。详见 限流与 shadowban。

7. 混排:插入广告和其他模块

外层流水线把排好的帖子与广告、推荐关注、提示卡片等模块组装在一起。广告混排开源默认使用 multi_risk 策略,按品牌安全等级决定广告能挨着哪些帖子。详见 广告混排。

为什么分成召回和排序两阶段

全网每时每刻都有大量新帖子,系统无法对每一条都运行大模型。因此分两阶段:

阶段 做什么 特点
召回(Retrieval) 用计算量小的双塔模型,从全网帖子里找出一批候选 快,覆盖面广
排序(Ranking) 用计算量大的 Transformer 模型,对候选逐条精细打分 慢,但准

候选隔离:一条帖子的分数不受同批帖子影响

排序模型一次读入很多条候选,但注意力掩码让候选之间互相看不见。所以一条帖子的分数只取决于用户和这条帖子本身,不受同一批里其他帖子的影响。

这样同一条帖子在不同请求里得分一致,分数也可以缓存复用。详见 候选隔离注意力掩码。

后台的内容理解:给帖子和账号打标签

Grox 在帖子发布后异步运行一组分类器,判断垃圾内容、成人内容、暴力媒体等,并生成帖子的文本和图片嵌入。媒体模型 处理图片和视频。账号层面,账号信号 从拉黑、举报和行为序列给账号打分。

这些分数经 打标签规则 和 处置服务 变成标签,最终由可见性过滤读取。

深入阅读

出处

本页结论均来自技术页,不引入新结论。精确行号见各技术页的“源码锚点”。

结论 技术页 主要源码
9 个候选源同时取帖 home-mixer 编排层 home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs:380-390
帖子公开互动数是模型输入,约 14 天后不再输入 Phoenix 排序模型 phoenix/xrex/data/recsys/feature_config.py:87-88
超过 48 小时的帖子被过滤 过滤流水线 home-mixer/params/config.rs:39
最终分是行为概率的加权和 打分与排序 xai-value-model/scoring.rs:79-218
先取 50 条,最终留 35 条 选择与成型 home-mixer/params/config.rs:17-18
可见性检查在选择之后 可见性过滤 home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs:487
候选之间互相看不见 候选隔离注意力掩码 phoenix/xrex/models/attention.py:26

相关页面

Type to search…

↑↓ navigate↵ selectEsc close