工程实践
X Algorithm Deep Dive — For You Feed 推荐算法全景解析
基于 X 开源推荐算法代码库的逐行深度分析。覆盖完整 Pipeline、21 个评分维度、权重体系、流量池分层策略,以及面向不同体量博主的实操指南。
Pipeline:从发帖到展示的 7 步旅程
每条推文经历以下完整链路。任何一步不通过,都不会出现在用户 For You Feed 中。
1. Query Hydration — 理解“谁在刷”
系统加载查看者的完整上下文:
- 互动历史:点赞、回复、转推记录
- 关注列表
- 屏蔽/静音列表
- 订阅信息
- 话题偏好
- 地理位置
- 设备类型
- 已看过的帖子 Bloom Filter
home-mixer/query_hydrators/ 共 15+ 个 hydrator 并行加载。
2. Candidate Sourcing — 从哪里找帖子
候选帖子来自六个源:
- Thunder(In-Network)
- Phoenix Retrieval(OON)
- Phoenix Topics
- Phoenix MoE
- TweetMixer
- Cached Posts
Thunder:你关注的人发的帖子,亚毫秒内存检索。
Phoenix Retrieval:Two-Tower 模型 + 向量相似度搜索全站内容。
3. Hydration — 补充帖子特征
给每条候选帖子补充:核心元数据、作者信息(粉丝数、screen name)、视频时长、是否含媒体、订阅状态、被屏蔽关系、语言代码、互关 Jaccard 分数、话题分类、引用帖展开。
home-mixer/candidate_hydrators/ 共 16 个 hydrator。
4. Pre-Scoring Filters — 过滤不合格候选
| Filter | 作用 |
|---|---|
DropDuplicatesFilter |
去重复帖子 ID |
CoreDataHydrationFilter |
移除加载失败的帖子 |
AgeFilter |
移除超过保留期的旧帖 |
SelfTweetFilter |
移除查看者自己的帖子 |
RetweetDeduplicationFilter |
同一原始内容的转推去重 |
IneligibleSubscriptionFilter |
移除无权查看的付费内容 |
PreviouslySeenPostsFilter |
移除已看过的帖子(Bloom Filter) |
PreviouslyServedPostsFilter |
移除本次会话已展示的帖子 |
MutedKeywordFilter |
移除含用户静音关键词的帖子 |
AuthorSocialgraphFilter |
移除被屏蔽/静音作者的帖子 |
VideoFilter |
按设置过滤视频 |
TopicIdsFilter |
话题匹配过滤 |
5. Scoring — 核心排名(最关键的一步)
三个 Scorer 依次运行:
- PhoenixScorer — Grok-based Transformer 预测 15+ 种互动概率。
- RankingScorer — 加权合成 + Author Diversity 衰减 + OON 权重调整。
- VMRanker — Value Model 服务端重排序(可选)。
6. Selection — 取 Top K
按最终得分排序,选取前 K 条候选。代码实现为 TopKScoreSelector。
7. Post-Selection + Ads Blending
最终安全过滤(VFFilter:删除/垃圾/暴力等)、对话去重、广告安全插入。Premium+ 用户看到的广告更少。
21 个评分维度
Phoenix Transformer 模型预测每条帖子在每个维度上的互动概率,然后加权合成最终得分。
正向信号
越高越好——这些信号推高帖子在 Feed 中的排名。
| 维度 | 代码字段 | 含义 | 权重级别 |
|---|---|---|---|
| P(favorite) | favorite_score |
用户点赞的概率 | 最高 ≈ 1.0 |
| P(reply) | reply_score |
用户回复的概率 | 高 ≈ 0.5 |
| P(retweet) | retweet_score |
用户转推的概率 | 高 ≈ 0.3 |
| P(quote) | quote_score |
用户引用转推的概率 | 中等 |
| P(share) | share_score |
用户分享的概率 | 中等 |
| P(share_via_dm) | share_via_dm_score |
用户通过私信分享的概率 | 中等 |
| P(share_via_copy_link) | share_via_copy_link_score |
用户复制链接分享的概率 | 中等 |
| P(click) | click_score |
用户点击帖子的概率 | 中等 |
| P(profile_click) | profile_click_score |
用户点击作者头像的概率 | 中等 |
| P(dwell) | dwell_score |
用户停留阅读的概率 | 中等 ≈ 0.2 |
| Dwell Time | dwell_time |
预测停留时长(连续值) | 连续 |
| Click Dwell Time | click_dwell_time |
点击后停留时长 | 连续 |
| P(video_quality_view) | vqv_score |
视频质量观看概率(需满足最低时长) | 有条件 |
| P(photo_expand) | photo_expand_score |
用户展开图片的概率 | 较低 |
| P(follow_author) | follow_author_score |
用户关注作者的概率 | 加分 |
| P(quoted_click) | quoted_click_score |
点击引用帖子的概率 | 较低 |
| P(quoted_vqv) | quoted_vqv_score |
引用帖视频观看概率 | 较低 |
负向信号
越高越糟糕——这些信号会直接把帖子排名拉到底部。
| 维度 | 代码字段 | 含义 | 危害级别 |
|---|---|---|---|
| P(not_interested) | not_interested_score |
用户点“不感兴趣”的概率 | 严重 |
| P(block_author) | block_author_score |
用户屏蔽作者的概率 | 致命 |
| P(mute_author) | mute_author_score |
用户静音作者的概率 | 严重 |
| P(report) | report_score |
用户举报帖子的概率 | 致命 |
| P(not_dwelled) | not_dwelled_score |
用户快速滑过不停留的概率 | 中等 |
负向信号的杠杆效应
负向信号不是简单地扣分。当加权得分 < 0 时,offset 公式会将得分压缩到
[0, NEGATIVE_SCORES_OFFSET]范围内,这意味着一条被频繁举报的帖子几乎不可能出现在任何人的 Feed 中。一次批量举报可能永久压低你的帖子在模型中的预测概率。
权重体系可视化
基于 run_pipeline.py:356 示例权重和代码分析推断的相对权重。生产权重通过 Feature Switches 动态配置。
正向互动权重
| 互动 | 相对权重 |
|---|---|
| Favorite(点赞) | 1.00 |
| Reply(回复) | 0.50 |
| Retweet(转推) | 0.30 |
| Dwell(停留) | 0.20 |
| Share(分享 / DM / Copy Link) | ~0.15 |
| Quote / Click / Profile Click | ~0.10 |
| VQV / Photo Expand / Follow Author | ~0.05–0.10 |
后处理乘数
| 内容或位置 | 乘数 |
|---|---|
| In-Network(关注列表)内容 | ×1.0 |
| Out-of-Network 内容(OON) | ×OON_WEIGHT_FACTOR |
| 新用户 OON 加成 | ×NEW_USER_OON_WEIGHT |
| Author Diversity 衰减(同一作者第 2 条) | ×decay^1 |
| Author Diversity 衰减(同一作者第 3 条) | ×decay^2 |
核心评分公式
三段式评分:加权合成 → 多样性调整 → OON 系数。
| 步骤 | 公式或行为 |
|---|---|
| 1. Phoenix Transformer 预测互动概率 | P = PhoenixModel(user_context, candidate) → 15+ 维概率向量 |
| 2. 加权合成 | weighted_score = 1.0×P(fav) + 0.5×P(reply) + 0.3×P(rt) + 0.2×P(dwell) + w_share×P(share) + w_click×P(click) + ... - w_block×P(block) - w_mute×P(mute) - w_report×P(report) |
3. Offset(确保负分不会跌破 0):if weighted_score < 0 |
score = (weighted_score + negative_sum) / total_sum × NEGATIVE_OFFSET |
3. Offset:else |
score = weighted_score + NEGATIVE_OFFSET |
| 4. Author Diversity 衰减 | multiplier = (1 - floor) × decay^position + floor;adjusted_score = score × multiplier;position = 同一作者已出现次数 |
5. OON 调整:if !in_network |
final_score = adjusted_score × effective_oon_weight |
5. OON 调整:else |
final_score = adjusted_score;关注列表内容不打折 |
关键洞察
具体的权重数值不在开源代码中。它们通过
FeatureSwitches系统在运行时注入,并且根据用户的user_roles(订阅等级)、account_age_days(账号年龄)、country(国家)、has_phone_number(是否绑定手机)动态调整。这意味着 X 可以在不部署代码的情况下,随时改变任何用户群体的推荐策略。
DO / DON'T 操作指南
基于算法代码逻辑推导的确定性建议。
DO — 一定要做
- 优化点赞触发 — 点赞权重是回复的 2 倍、转推的 3.3 倍。写能让人“随手点赞”的内容(金句、共鸣、实用信息)是 ROI 最高的策略。
- 引导回复和讨论 — 回复权重 0.5,仅次于点赞。用提问、投票、争议性话题引发评论区讨论。
- 提高停留时长 — 用 Thread、信息密度高的图文、吸引人的开头。
dwell_time是连续值预测——停留越久加分越多。 - 激励分享/私信转发 — DM 分享和复制链接分享是独立的正向信号。
- 发视频超过最低时长门槛 — 视频必须超过
MIN_VIDEO_DURATION_MS才能获得 VQV 权重加成。太短的视频等于放弃了一个完整的正向信号维度。 - 建立互关网络 —
mutual_follow_jaccard是后排序信号。与目标受众互关,提高你在他们 In-Network 源中的优先级。 - 保持发帖频率适中 — Author Diversity Scorer 指数衰减同一作者的第 2、3 条帖子。3 条精品 > 10 条灌水。
- 关注 Banger 质量分 ≥ 0.4 — Grok VLM 初筛评估内容质量。有实质内容 + 相关媒体是通过门槛的基础。
- 带有媒体(图片/视频) —
has_media是独立布尔信号,会被传入模型。纯文字帖少了一个维度的信号。 - 保持帖子新鲜度 —
post_age_bucket是模型输入特征。超过 4800 分钟(80 小时)会进入溢出桶。
DON'T — 千万不要做
- 不要发容易被举报的内容 — P(report) 有负权重。模型学会“你的内容容易被举报”后,这个概率会持续影响所有帖子。
- 不要让人屏蔽/静音你 — P(block_author) 和 P(mute_author) 是致命信号。被 100 人屏蔽的伤害远大于被 1000 人忽略。
- 不要刷屏发帖 — Author Diversity 使用指数衰减。第 3 条以后的帖子分数可能不到第 1 条的 25%。
- 不要发 AI 灌水内容 — Banger 初筛有
slop_score(AI 灌水检测)。批量 AI 生成的低质内容会被检测并降分。 - 不要发让人快速滑走的内容 —
not_dwelled_score是独立的负向信号。开头无聊 = 快速滑走 = 负分。 - 不要触发“不感兴趣” — P(not_interested) 权重极高。投喂错误的受众群体会导致大量“不感兴趣”反馈。
- 不要在付费墙后面放重要内容 —
IneligibleSubscriptionFilter会直接过滤非订阅者看不到的内容。 - 不要使用常见的静音关键词 —
MutedKeywordFilter在评分前就过滤。含有广泛被静音关键词的帖子会从很多人的候选池中直接消失。 - 不要发超短无实质视频 — 低于
MIN_VIDEO_DURATION_MS的视频会让 VQV 权重直接为 0。 - 不要忽视帖子新鲜度 — 帖子超过 80 小时进入溢出桶,模型对旧帖的推荐概率显著下降。不要指望旧帖“慢热”。
流量池分层策略
算法对不同体量的博主有结构性的差异化处理。
种子期 · Seed Stage
范围:0–1,000 粉丝
| 维度 | 状态 |
|---|---|
| 主要流量源 | In |
| OON 候选池 | 小 |
| 模型状态 | 冷启动 |
算法行为
- In-Network 为主 — 你的内容主要展示给关注你的人。Thunder 源直接推送到粉丝的候选池。
- OON 突破门槛高 — Phoenix Retrieval 需要你的帖子 embedding 与海量候选竞争。粉丝少 = 互动数据少 = embedding 向量缺乏独特性。
- Author Embedding 弱 — 模型通过
author_hashes编码你的身份。互动历史少的作者,其 embedding 不够“锐利”。 - P(follow_author) 是突破点 — 当 OON 用户看到你的帖子并关注你,这直接扩大你的 In-Network 覆盖。
- Mutual Follow Jaccard 极低 — 几乎没有共同关注网络,在排名后处理中处于劣势。
关键策略
- 利用 Topic 系统破圈 — 发帖紧贴 Grok Topics 分类,确保帖子被
PhoenixTopicsSource检索到。这是小号进入 OON 候选池的最可靠路径。 - 极致单帖质量 — Author Diversity 衰减意味着你的第 2、3 条帖子分数大幅打折。用 1 条高质量帖击穿阈值,比发 5 条平庸帖效果好得多。
- 引导关注转化 — P(follow_author) 是独立正向权重。每一个新关注者都直接扩大你的 In-Network 池。
- 互关策略建网络 — 主动关注并与同领域创作者互动,提高
mutual_follow_jaccard分数。
增长期 · Growth Stage
范围:1,000+ 粉丝
| 维度 | 状态 |
|---|---|
| 主要流量源 | In+OON |
| OON 候选池 | 大 |
| 模型状态 | 成熟 |
算法行为
- In-Network + OON 双引擎 — 粉丝互动为帖子提供强初始信号,Phoenix Retrieval 将高互动帖推向全站。
- Author Embedding 成熟 — 大量互动数据让模型能准确预测“谁会喜欢你的内容”,OON 检索精准度更高。
author_followers_count作为 VMRanker 输入 — 粉丝数量是 VMRanker 请求中的特征字段,影响 Value Model 的重排序。- Author Diversity 是核心约束 — 粉丝量大后,你可能同时有多条帖子进入同一用户的候选池。衰减效应更明显。
- 负向信号杠杆更大 — 覆盖面广意味着更多人可能触发 block/mute/report。负面信号的统计显著性更强。
关键策略
- 保护负向指标 — 避免被屏蔽/举报比追求更多点赞更重要。一次争议事件引发的批量屏蔽,可能需要数周才能恢复。
- 利用引用推文 —
quoted_click_score和quoted_vqv_score是独立维度。引用其他热门帖子可以搭载其互动热度。 - 分享驱动 — DM 分享和复制链接是独立信号。创作“值得转给朋友”的内容在这个阶段 ROI 更高。
- 视频战略 — 发布超过最低时长门槛的视频,解锁 VQV 权重通道。大 KOL 的视频更容易被推荐给 OON 用户。
- 订阅等级 — Premium/Premium+ 通过 Feature Switches 获得不同的排名参数。参数差异化的架构已确认存在。
流量池对比矩阵
| 维度 | 种子期(0–1K) | 增长期(1K+) | 代码出处 |
|---|---|---|---|
| 主要流量源 | Thunder(In-Network) | Thunder + Phoenix(In + OON) | phoenix_candidate_pipeline.rs |
| OON 检索精度 | 低 — embedding 向量模糊 | 高 — 大量互动训练数据 | recsys_retrieval_model.py |
| Author Diversity 衰减 | 影响小 — 候选池中很少出现多条 | 影响大 — 频繁多条同时候选 | ranking_scorer.rs |
| 负向信号风险 | 低 — 曝光少,绝对数量少 | 高 — 广泛曝光,批量 block 风险 | ranking_scorer.rs |
| VQV 收益 | 基础 — 视频触达有限 | 放大 — OON 推荐扩大视频曝光 | weighted_scorer.rs |
| Mutual Follow 影响 | 关键 — 唯一排名加成来源 | 辅助 — 互动信号已足够强 | mutual_follow_jaccard_hydrator.rs |
| Topic 系统价值 | 核心 — 进入 OON 的主要通道 | 补充 — 已有强自然检索 | phoenix_topics_source.rs |
| Feature Switch 参数 | 标准参数(可能因新用户有特殊值) | 可能因 user_roles / 订阅等级获得优化参数 |
server.rs |
实操手册 — 一条帖子的完整优化
按照算法的评分公式,一条帖子的优化 Checklist。
点赞优化
权重 ≈ 1.0(最高)
- [ ] 内容是否包含可共鸣的观点/金句?
- [ ] 是否提供了即时价值(实用、有趣、震惊)?
- [ ] 第一行是否就能让人产生“说得好”的反应?
回复优化
权重 ≈ 0.5
- [ ] 帖子末尾是否有明确的问题/讨论引导?
- [ ] 话题是否有多个合理立场(引发辩论)?
- [ ] 发布后 30 分钟内是否回复了评论?
转推优化
权重 ≈ 0.3
- [ ] 内容是否是“必须让别人也看到”类型?
- [ ] 是否包含原创数据/洞察/独家信息?
- [ ] 是否适合引用转推(QT 是独立信号)?
停留优化
权重 ≈ 0.2 + 连续值
- [ ] 开头是否足够吸引人阻止快速滑动?
- [ ] 内容长度是否足够支撑 5+ 秒阅读?
- [ ] 图片/视频是否值得仔细看?
视频优化
VQV 有最低时长门槛
- [ ] 视频时长是否超过最低阈值?
- [ ] 前 3 秒是否有足够的吸引力?
- [ ] 引用帖中的视频也会被单独评分
负向防护
负权重 — 最优先避免
- [ ] 内容是否可能引发举报?
- [ ] 是否会让不感兴趣的人群看到?
- [ ] 是否含有常见静音关键词?
- [ ] 是否可能触发批量屏蔽?
最终总结:算法的本质
X 推荐算法的核心是一个 Grok-based Transformer,它从你的历史互动中学习模式,然后预测你会如何与每条候选帖子互动。没有手工特征、没有人工干预规则——一切都是互动数据驱动。
这意味着:你的受众的行为定义了你的帖子的分数。吸引到正确的受众(高点赞、高回复、低屏蔽),比任何“黑科技”都有效。算法不是一个需要“破解”的黑箱,而是一面反映你内容质量和受众匹配度的镜子。
基于 X Algorithm 开源代码的技术分析。
Commit 0bfc279 · 2026-05-15
By @stometaverse · Builder of claude-review-loop & Invoice-Manager
Design reference: Airbnb Design System