本页面向产品、运营和创作者,介绍 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 |