通俗版:把推荐系统当成超市来理解
没有计算机基础也能看懂的 X 算法解读
01 · 摘要一句话先讲完
X(前 Twitter)2026 年 5 月 15 日把它现在用的推荐算法源代码开源了。我读完发现一件大事:X 把推荐系统里所有的「人工规则」都删了,让一个 AI 自己看你过去的行为,自己学出「你接下来会喜欢什么」。
这个改变意味着什么?意味着以前自媒体圈那一整套「带 hashtag、堆关键词、卡发布时间」的涨粉套路,对这套新算法基本失效了。
下面我用大白话把这套系统怎么工作的、为什么这么设计、对你刷 X 和发 X 意味着什么,一次性讲清楚。所有的英文术语都会带翻译,没有计算机基础也能看懂。
02 · 三大部门把它当成一家超市
每次你打开 X 的 For You(推荐流),背后有一套系统在忙活。把它想象成一家超市,每次你走进来,理货员就要现挑商品摆给你看。
这家超市有三个核心部门,三个部门的分工长这样:
Home Mixer] HM --> TH[关注列表近期内容
Thunder] HM --> PH[AI 大脑
Phoenix] TH --> RANK{排序与过滤} PH --> RANK RANK --> OUT[展示给你的信息流]
总调度(英文叫 Home Mixer,意思是「首页混合器」)
它是超市经理,每次你刷信息流,它指挥所有人按八步流程把货摆出来:
这八步,每次你刷一下都跑一遍。
关注列表的近期动态库(英文叫 Thunder,意思是「闪电」)
一个超快的内存仓库。你关注的人一发新内容,几毫秒内就进了这个仓库。它存的就是「你关注的人最近发的东西」。
为什么需要这个?因为如果每次都要去数据库慢慢查,你刷一下要等几秒。Thunder 把这些东西常驻内存,闪电级响应。
Thunder 是「关注列表的免费快车道」。你关注的人发的内容几乎无门槛进入候选池。这一点对内容创作者特别重要。
AI 大脑(英文叫 Phoenix,意思是「凤凰」)
这是真正的 AI 部分。它干两件事:
第一件事,从全网几百万条内容里粗筛出几百条候选。
它怎么做?用一种叫「双塔模型」的方法。听起来玄乎,其实就是把「你」和「每一条内容」分别变成一串数字,再看谁和你的数字串最像:
第二件事,给每条候选打分。
这一步用的是个叫 transformer(中文译「自动学习模型」,是现在所有大模型的底层结构)的 AI。它能同时考虑:
- 你这个人的基本画像
- 你过去做过的所有动作(点过哪些、回过哪些、看了多久、关注了谁)
- 这条候选内容本身
然后给每条候选打分。
03 · 多目标预测AI 在预测的 15 件事(最关键的一节,请认真看)
最有意思的来了。Phoenix 不是预测「你会喜欢这条吗」这一个问题,它同时预测 15 种你可能做的动作,分两大类:
你会做这 15 件事] AI --> P[正向 11 种
会推上去] AI --> N[负向 4 种
会压下去] P --> P1[互动类
点赞 回复 转发
引用转发 分享] P --> P2[浏览类
点开看 点头像看主页
看视频 放大图 停留时长] P --> P3[追随类
关注作者] N --> N1[直接表达不喜欢
按不感兴趣 静音作者
拉黑作者 举报]
中英文动作名对照(点击展开)
| 中文 | 英文 | 方向 |
|---|---|---|
| 点赞 | favorite | 正 |
| 回复 | reply | 正 |
| 转发 | repost | 正 |
| 引用转发 | quote | 正 |
| 点开看详情 | click | 正 |
| 点头像看主页 | profile_click | 正 |
| 看视频 | video_view | 正 |
| 放大图片 | photo_expand | 正 |
| 分享给朋友 | share | 正 |
| 停留时长 | dwell | 正 |
| 关注作者 | follow_author | 正 |
| 按不感兴趣 | not_interested | 负 |
| 拉黑作者 | block_author | 负 |
| 静音作者 | mute_author | 负 |
| 举报 | report | 负 |
总分怎么算?
总分 = 每个动作的权重 × 你做这个动作的概率,全部加起来
正向动作权重为正、负向为负。AI 预测「你会举报」概率很高的内容,分数直接被打到地下室。注意:开源仓库没有公开具体权重数值,只能确定方向(正/负)。
这个设计有几个深刻的含义:
第一,「停留时长」(dwell)和「点开看」(click)是最高频的信号。点赞转发是少数派 —— 你刷 100 条内容可能点赞 3 条,但你的「停留时长」每条都被记录。所以做让人愿意读下去的内容,比做让人想点赞的内容更重要。
第二,引战内容会自爆。短期内可能 favorite 高、reply 高,但同时 mute / block / report 的概率也被拉满,最后总分被负向行为打回原形。长期看,引战内容是负资产。
第三,AI 在预测你会不会做某件事,而不是「你应该做什么」。它从你历史行为里学:你过去对这种类型内容是停留 30 秒还是 3 秒?你看到类似的人是点过关注还是按过 mute?
04 · 关键设计几个特别重要的设计决策
1. 候选互相看不见
AI 给每条候选打分的时候,每条都是被「单独审视」的。它能看你这个人、能看你过去的行为,但看不到当前 batch 里其他候选。
打比方:考试时每个考生独立答卷,不能交头接耳。
对你意味着什么? 你的一条内容好不好,跟它旁边出现谁无关。它必须自己站得住 —— 不能指望「和别的内容组合起来才好看」。
2. 作者多样性会被强制打压
系统里有个组件叫 Author Diversity Scorer(作者多样性打分器)。如果同一个号短时间在你信息流里出现多次,第 2 次分数会被衰减、第 3 次衰减更多、第 4 次基本没机会。
满分推荐] -->|衰减| POST2[第 2 条
分数 -30%] POST2 -->|继续衰减| POST3[第 3 条
分数 -60%] POST3 -->|基本无机会| POST4[第 4 条
分数趋零]
打比方:饭桌上同一道菜上 3 次,第 3 次没人想吃。
对创作者意味着什么? 一天发太多条会自相残杀。同一时段你已经发过一条,再发第二条第三条,每条都在抢自己的分数。
3. 看过的不再推
每个用户都有一份「看过哪些内容」的小账本(用一种叫 Bloom Filter 的省内存数据结构,可以记几百万条内容用很少内存)。重发同一条内容给同一个用户没第二次机会。
对创作者意味着什么? 同一篇内容反复发不会让更多人看到你最在乎的那部分粉丝 —— 他们已经看过了。
4. 关注列表是创作者的免费快车道
Thunder 几乎无门槛把你关注的人发的内容丢进候选池。这意味着:让粉丝关注你的成本是值得花的 —— 一旦关注了,你的内容直接进入他们的候选池,不用走全网粗筛那道窄门。
5. 关键词加分这条路彻底死了
AI 直接从你的行为序列里学规律,不看 hashtag、不识别关键词。「在文末加 3 个相关 hashtag 涨流量」「标题里塞热词」这种做法对新算法毫无作用。
X 在自己文档里这么写:
我们已经从系统里删除了每一个人工设计的特征和大部分启发式规则。基于 Grok 改造的 AI 模型独自扛起了所有理解相关性的工作。
这是这次开源最重要的一句话。
05 · 类比一个相亲所的比喻把整套系统串起来
把 X 推荐系统想成一个相亲介绍所:
| 推荐系统部件 | 相亲所对应 |
|---|---|
| 你的会员档案(行为历史) | 你过去和谁聊得来、和谁聊崩、对谁感兴趣 |
| Thunder(关注列表近期内容) | 你已经在定期联系的朋友 |
| Phoenix Retrieval(双塔检索) | 介绍所根据档案,从陌生人池子里挑可能合得来的 |
| 15 种动作预测 | 不只预测「你会跟他聊得来吗」,还预测「他会主动找你?拉黑你?举报你?」 |
| 候选互不可见 | 一个一个介绍人,不让候选人互相比较 |
| 作者多样性打压 | 不会三天两头给你介绍同一个人 |
| 没有手工规则 | 不用「身高 175 以上加分」这种死规则,而是从你过往反应里学你真正喜欢什么 |
06 · 给两类读者这套架构对你的两个含义
如果你只是刷 X 的人
你训练 AI 的方式是你每次的行为。
- 不喜欢一个号?按 mute 比单纯划过去更有效(它会被记成强负向信号)
- 看到喜欢的内容停下来读完(dwell 时间长),比点个赞划过去对 AI 信号更强
- 关注列表是你主动告诉 AI「这些人的内容请直接推给我」的方式,比靠它自己猜准得多
如果你发 X / 做内容
后面那个「自媒体实操」tab 详细讲。一句话:所有套路都没用了,只剩一条路 —— 让真实用户愿意停下来读完、愿意点开你的主页、愿意关注你。AI 学的就是这些行为,没有别的办法。
07 · 完整流程完整流程图(一张图记住)
重复 太老 屏蔽词 看过] G --> H[AI 打 15 个分数
正向 + 负向] H --> I[加权 + 作者衰减 + 排序] I --> J[最后一道可见性检查] J --> K[呈现在你眼前]
08 · 英文对照关键英文术语对照表
| 英文 | 直译 | 在这套系统里的意思 |
|---|---|---|
| For You | 「为你」推荐流 | X 的主信息流 |
| Home Mixer | 首页混合器 | 总调度模块 |
| Thunder | 闪电 | 关注列表近期内容的内存仓库 |
| Phoenix | 凤凰 | AI 大脑(用来检索和打分) |
| transformer | 自动学习模型 | 现代 AI 的底层结构 |
| Grok | X 自家的 AI 模型 | 这套推荐系统的 AI 就是基于 Grok 改的 |
| embedding | 向量化 / 数字画像 | 把人或内容变成一串数字 |
| retrieval | 检索 | 从几百万条里粗筛几百条 |
| ranking | 排序 | 给候选打分排序 |
| candidate | 候选内容 | 系统正在考虑给你看的某条 post |
| in-network | 网内 | 你关注的人发的 |
| out-of-network | 网外 | 你没关注的人发的 |
| engagement | 互动 | 点赞、回复、转发、停留等行为的统称 |
| dwell | 停留 | 你在某条内容上待了多久 |
| hashtag | 话题标签 | post 里的 #xxx |
| Bloom Filter | 一种数据结构 | 用很少内存记很多东西的小账本 |
| ML / AI | 机器学习 / 人工智能 | 同一回事的不同叫法 |
继续读其他视角
X "For You" 推荐算法机制
对 xai-org/x-algorithm 2026-05-15 开源代码的一次结构化阅读
00 · PREFACE引言 · 这次开源最大的变化
2026-05-15 这版 x-algorithm 仓库,最值得注意的不是某条新公式,也不是某个新指标,而是一句近乎宣言的陈述。
We have eliminated every single hand-engineered feature and most heuristics from the system. xai-org/x-algorithm, README
过去十几年的工业推荐系统,主线是特征工程:把用户行为、内容属性、社交关系等等手工压成几千甚至上万维稠密向量,喂给 GBDT 或 DNN 做点击率预估。运营和算法人力的大头都花在「想出有用的特征」上。
新版 X 把这一层基本拆掉了。User、Item、Author 各自只有一张 100 万词表的哈希嵌入表,剩下交给 transformer 自己学。这是一个相当极端的工程主张:与其相信工程师对世界的建模,不如相信注意力机制对历史序列的建模。
下面 11 节,我们按系统从外到内的顺序,把整套推荐链路拆开来看,看这种主张在代码里如何落地,以及它带来什么新的约束与新的取舍。
01 · OVERVIEW系统总览
整套推荐系统分三层。Home Mixer 是 Rust 写的编排服务,对外暴露 gRPC 接口 ScoredPostsService,每次「拉取 For You」都会进入它的八步流水线。Thunder 提供站内(in-network)实时候选;Phoenix 提供机器学习能力,包括召回和排序。
gRPC ScoredPostsService
Rust]:::mixer TH[Thunder
In-network candidates
in-memory]:::svc --> HM PH[Phoenix
ML retrieval & ranking
JAX]:::svc --> HM KF[(Kafka
post create/delete)]:::data -.->|stream| TH HM --> R[(Ranked Feed)]:::out classDef client fill:#fff,stroke:#1d4ed8,stroke-width:2px,color:#1A1A1A classDef mixer fill:#E8EEFC,stroke:#1d4ed8,stroke-width:2px,color:#1A1A1A classDef svc fill:#fff,stroke:#3D3D3D,color:#1A1A1A classDef data fill:#F2F1EC,stroke:#6B6B6B,color:#1A1A1A classDef out fill:#FFF3C9,stroke:#92400E,color:#1A1A1A
这种分工很干净:编排和业务逻辑全部在 Rust 服务里,机器学习推理全部在 JAX 服务里,Rust 不碰 tensor、Python 不管业务。Thunder 是一个独立的内存索引服务,专门解决"几亿条新 post,秒级找出来"这个问题。
请求生命周期
Query
Hydration]:::s --> B[2
Candidate
Sources]:::s --> C[3
Candidate
Hydration]:::s --> D[4
Pre-Scoring
Filters]:::s --> E[5
Scoring]:::s --> F[6
Selection]:::s --> G[7
Post-Selection
Filters]:::s --> H[8
Side
Effects]:::s classDef s fill:#fff,stroke:#1d4ed8,color:#1A1A1A
02 · ORCHESTRATIONHome Mixer 八步流水线
Home Mixer 整体就是个 candidate-pipeline 的 Rust crate,pipeline 八步走,每一步是一个可组合的 trait 实现。这种写法让团队可以在不动整体的前提下,单独换掉某一步的实现。
这八步的本质,是把"召回 → 过滤 → 排序 → 截断 → 兜底 → 记账"这个推荐系统的经典分层显式写在 trait 上。开源代码里的 candidate-pipeline crate 是通用框架,home-mixer 只是它的一种特化。
03 · IN-NETWORKThunder · 站内候选的实时索引
Thunder 解决一个特定问题:用户打开 App,要立刻看到关注账号最新的 post。这件事不能等离线 pipeline,只能毫秒级查内存。
数据流
- 订阅 Kafka 的
post.create/post.delete事件流; - 按作者 user id分桶,每个桶维护三种存储:原创 post、回复转推、视频;
- Home Mixer 收到请求后,根据用户的关注列表去访问对应桶,拉出最近的若干条;
- 过期 post 在后台自动淘汰,保证内存占用稳定。
这种"按作者分桶 + in-memory + Kafka 实时灌入"的设计,让 Thunder 在工程上更像一个为推荐场景特化的实时索引,而不是通用 KV。三种存储类型分开,是为了让"看视频"和"看原创"这种不同消费模式可以各自调权重。
post events)]:::data -->|subscribe| TH subgraph TH[Thunder · in-memory partitions] direction TB OR[Original posts]:::box RP[Replies & reposts]:::box VD[Videos]:::box end TH -.->|lookup by followed user ids| HM[Home Mixer · Candidate Sources]:::mixer classDef data fill:#F2F1EC,stroke:#6B6B6B classDef box fill:#fff,stroke:#1d4ed8 classDef mixer fill:#E8EEFC,stroke:#1d4ed8
04 · RETRIEVALPhoenix 双塔检索
Thunder 解决"我关注的人",Phoenix Retrieval 解决"我没关注但我会喜欢的人"。这是典型的网外(Out-of-Network,OON)召回问题。整个候选池可能有几百万到几千万条 post,要在几十毫秒内把它压缩到几百条交给排序。
用的是经典的 双塔模型(Two-Tower)。
u,Candidate Tower 离线对全量 post 批量算 v,在线只做近似最近邻检索取 Top-K。双塔之所以经典,是因为它把"用户侧"和"内容侧"解耦:内容向量可以离线批量算、缓存、做 ANN 索引;用户向量每次请求重算,参数不多、延迟可控。代价是两塔之间不能交叉特征,只能在最后一刻点积。所以双塔只做召回,不做排序——精细排序留给下一节的 ranking 模型。
召回漏斗
05 · RANKINGPhoenix Ranking 与候选隔离
排序模型是整套系统的技术核心。结构上是一个 transformer,但有一处不那么常规的设计:候选互不可见。
输入张量
user_emb : [B, 1, D] # 用户向量,一次一个
history_emb : [B, S, D] # 历史序列:post + author + action + surface
candidate_emb : [B, C, D] # 候选集:本次要打分的 C 条 post
三类 token 拼成一段长度为 1 + S + C 的序列,送进 transformer。关键是注意力 mask 怎么写。
注意力 mask 矩阵
| User | History | Candidates | |
|---|---|---|---|
| User | ✓ | ✓ | ✗ |
| History | ✓ | ✓ | ✗ |
| Candidates | ✓ | ✓ | 仅对角 |
这件事意味着什么
常规 transformer 里,每个 token 都能 attend 到序列中其他所有 token。如果候选之间互相可见,结果就是:
- 每条候选的得分依赖于"同批一起打分的其他候选",不可复现;
- 不能缓存,因为同一条 post 在不同候选集中得分不同;
- 不能分布式打分,因为分片会切断候选之间的注意力。
把候选之间的注意力遮掉,得到三个直接收益:
- 分数独立。同一条 post 在任何候选集中得分相同。
- 分数可缓存。
(user, post) → score是个稳定函数。 - 打分可水平扩展。把 C 切成多块,分别送给多个 worker,结果一致。
这种设计上的让步换来工程上的可伸缩性,是典型的"用模型结构换系统性质"的做法。代价是候选之间可能存在的"对比信号"被牺牲掉了——但这正是为什么后续会有Author Diversity Scorer这种规则化补丁来弥补。
History 这一边带了什么
历史序列的每一个位置不是单纯一条 post 向量,而是把post + author + action 类型 + product surface拼到一起的复合 token。这意味着模型能学到「我在哪种界面(首页、搜索、个人页)下,对哪个作者的哪种内容,做过哪种交互」这种很细粒度的行为模式。
06 · OBJECTIVES15 种 Action 与加权打分
Phoenix Ranking 不是预测单一目标,而是一次性预测15 种行为概率(11 正向 + 4 负向)。模型的 proto enum 里其实定义了 19 种 action,开源的 mini 模型里实际启用了 5 种主 action 用作教学;生产模型用完整集合。
最终得分公式
Final Score = Σᵢ wᵢ · P(actionᵢ | user, history, candidate)
每个 action 对应一个权重 wᵢ。正向 action 权重为正,负向为负,这就是为什么"被举报"或"被屏蔽"这类信号本身就是分数的减项,不需要另写一套抑制逻辑。这一步合并在 WeightedScorer 里完成,规则上很直接:先要模型把 15 个概率都打出来,再线性加权。
这种多任务(multi-action)预测的好处是:模型学到的内容表示是被多种目标同时压力测试过的,比起单独训一个"预测点击率",表示更稳健。坏处是工程上必须维护好这套权重表,并保证 mini 模型和生产模型的 action 集合对齐。
开源 mini 模型实际使用的 action
| Action enum value | Name | 意义 |
|---|---|---|
| 1 | favorite | 点赞 |
| 4 | reply | 回复 |
| 5 | quote | 引用转推 |
| 6 | repost | 转推 |
| 11 | dwell | 停留时长 |
| 13 | video_quality_view | 高质量视频观看(达到一定时长 / 比例) |
07 · FILTERS过滤器系统
过滤器在系统里的位置很关键。Pre-Scoring 阶段筛掉不值得打分的东西(省算力),Post-Selection 阶段筛掉不能展示的东西(兜底安全)。两组过滤器一前一后夹住整个 scoring 阶段。
Pre-Scoring · 10 个
- DropDuplicatesFilter同一请求里出现的重复候选合并
- CoreDataHydrationFilter必填核心字段缺失的丢掉
- AgeFilter太老的 post 丢掉
- SelfpostFilter用户自己发的不再推回去
- RepostDeduplicationFilter同一原帖的多份转推合并
- IneligibleSubscriptionFilter付费/订阅条件不满足的丢掉
- PreviouslySeenPostsFilter之前已看过的 (Bloom Filter)
- PreviouslyServedPostsFilter之前推过但未点开的 (servid history)
- MutedKeywordFilter用户配置的屏蔽词命中
- AuthorSocialgraphFilter作者关系链不合规 (拉黑等)
Post-Selection · 2 个
- VFFilterViolence Filter,兜底审核:删除/垃圾/暴力/血腥
- DedupConversationFilter对话树去重:同一根对话只保留一条
设计意图
Pre 侧关注效率,每条算力都不能浪费在不会出现的内容上;Post 侧关注呈现,已经决定排到前面的内容,还要再过一道"绝对不能出现"的安全网。
值得注意的是 PreviouslyServedPostsFilter:很多推荐系统会把"曾经推过但用户没看"也算作负向信号去训练模型,X 这边的做法更直接——曝光过没消费的,下次干脆不再推。
08 · DESIGN五个关键设计决策
把这些点单独拎出来,是因为它们解释了"为什么这套系统长成这样",比任何单独模块的细节都更值得看。
No Hand-Engineered Features
"We have eliminated every single hand-engineered feature and most heuristics from the system." 全部交给 transformer 学。代价是模型变大、训练成本上升;收益是特征维护这件事消失了,团队能集中精力在数据和模型本身。
Candidate Isolation
候选互不可见。换来分数独立、可缓存、可水平扩展三个工程性质,这是整套系统能在 X 的规模下跑起来的关键。多样性问题用后置 scorer 补,不在 attention 里解决。
Hash-Based Embeddings
User、Item、Author 各自一张 100 万词表,每个实体过 2 个不同 hash function 映射到 2 个 slot,再把两个 embedding 平均。哈希碰撞带来的噪声,模型在大规模数据下能"消化掉"。这个做法让 embedding 表的尺寸成为可调超参,而不是随用户量线性增长。
Multi-Action Prediction
一次预测 15 - 19 种 action,正负向用同一头输出。负向 action 不是事后再贴补丁压分,而是天然作为目标参与学习。
Composable Pipeline
candidate-pipeline 是个通用 crate,home-mixer 只是它的一个实例。这意味着同一套抽象可以拿去做搜索、Explore、视频推荐等其他场景。八步流水线不是 For You 专属。
09 · MINI MODEL开源 Mini 模型的具体参数
仓库里给出的是一个跑得动、能复现的"教学版"模型。参数不大,但结构和生产是一致的。
| 项目 | Mini 配置 | 备注 |
|---|---|---|
| Embedding 维度 D | 128 | 新版本默认 256,Mini 用 128 节省显存 |
| Transformer 层数 | 4 | 新版本 2 层(更宽更浅) |
| Attention heads | 4 | |
| Key size | 32 | 每个 head 的 key / query 维度 |
| FFN widening factor | 2 | FFN 隐层 = D × 2 |
| History seq length | 127 | 最近 127 个行为 |
| Candidate seq length | 64 | 一次最多对 64 个候选打分 |
| 词表大小 (User/Item/Author) | 1,000,000 | 每张表 100 万 slot |
| Hash function 数 | 2 | 每实体过 2 个哈希 |
| Action 类型 | 19 | proto enum 总数;mini 用其中 5 个主 action |
读 mini 模型代码的意义不在它的精度,而在它把生产架构的结构原样保留下来。把这些参数等比放大几倍,再换上完整的 action 集合和真实数据,就是生产版的样子。
10 · PERIPHERY周边 · Grox / Ads / Who-to-Follow
Grox · 内容理解服务
Grox 是一个独立服务,不和 Phoenix 共享模型,专门做 spam 检测、post 多标签分类、PTOS(Platform Terms of Service)合规判定。它产出的标签会被 Home Mixer 在 hydration 和 filter 阶段消费,比如 VFFilter 判断"是否暴力血腥"用的就是 Grox 的标签。
把内容理解抽出来做独立服务的好处:它有自己的迭代节奏,模型升级不必和 ranking 模型耦合;坏处是 Home Mixer 多一次 RPC 调用,要么靠批量 hydration,要么靠预计算缓存来摊薄延迟。
Ads · 广告注入
home-mixer/ads/ 模块负责把广告候选注入到 candidate sources 里,同时记录 brand safety 信号——某些广告主不希望自己的广告出现在敏感内容旁边,所以系统在排序后还要做一次"广告位置周边内容是否合规"的检查。这部分逻辑跟内容推荐主链路是分开的,但共享同一个 Home Mixer 编排。
Who-to-Follow
账号推荐和 post 推荐共用同一套 candidate-pipeline 抽象,只是候选类型从 post 换成 user。这是「Composable Pipeline」决策在生产中能落地的直接证据。
11 · TAKEAWAYS结语 · 这种架构的取舍
读完这版 x-algorithm 仓库,最值得记下来的不是某一个数字或某一个模块,而是整套系统在"模型表达力"和"工程可控性"之间做的几次明确选择。
放弃了什么
- 手工特征。过去对内容、用户、关系做的精巧建模都不再显式存在。
- 候选间交互。同一批次内候选之间没有注意力,多样性靠后置 scorer 而不是模型自身。
- 显式启发式规则。大部分 heuristics 从打分链路里删掉了,剩下的几条(重复作者衰减、OON 调整)是少数。
换来什么
- 规模化能力。分数独立、可缓存、可水平扩展,让千万级候选实时打分变成可行的工程问题。
- 统一抽象。八步流水线 + candidate-pipeline crate 让 For You、搜索、WTF 共用同一套骨架。
- 多目标一致性。15 种 action 在同一模型里联合预测,避免了多个独立预测模型之间难以调和的问题。
对一人公司创业者,能拿走什么
不必复刻这套系统,但其中两个抽象在小规模也成立:
- 把"召回"和"排序"分开。召回追求规模和召回率,排序追求精度。即使是从几千条素材里选 10 条,分开两层也比一锅炖好。
- 把"打分"和"过滤"分开。能丢的提前丢,能保的最后保。打分逻辑保持纯净,让规则在两端兜住。
报告读完。源码地址:github.com/xai-org/x-algorithm。本文涉及的所有结构性描述均可在该仓库的 README、proto 定义及 candidate-pipeline / home-mixer / phoenix 三个子目录中得到对应。
继续读其他视角
从 X 算法机制反推一人公司内容策略
当 transformer 直接读你的行为序列,旧的涨粉公式应该如何重写
00引言 · 算法变了,自媒体打法也得变
过去十年的"涨粉公式"大致是这一套:蹭热点 + 三件套(标题/封面/钩子)+ 关键词堆砌 + hashtag。这套打法的底层假设是:算法是一台规则机器,把对的关键词、对的格式、对的时间塞进去,就能换到流量。
但 X 在 2026 年开源的这一版算法,从根上把这个假设掀翻了。
Heavy Ranker 删光了所有手工特征。模型直接读你这个用户最近的行为序列——你刷过哪些 post、每条停留了多久、点开了谁的主页、回复了谁、屏蔽了谁、关注了谁——然后让 transformer 自己学"这种行为模式的人,接下来会在哪条新 post 上做什么动作"。
这件事的后果是:
- 没有"hashtag 加分"了。模型不读 hashtag 加权字典。
- 没有"哪个关键词更容易爆"了。模型读的是用户行为序列,不是关键词频率表。
- 没有"账号标签"这种你能 hack 的东西了。模型学的是"在你这条 post 出现前,那个用户做了什么"。
这听起来像是坏消息——你能操控的杠杆变少了。但反过来看,这意味着:真正能稳定起量的,是那些恰好命中"用户行为序列模式"的内容。算法不再奖励技巧,奖励的是"看完它"、"点开它"、"想回复它"、"想关注作者"这些真实行为。
本文不再讲算法怎么实现(那是兄弟 tab 的内容)。本文只回答一件事:算法在用什么思路推荐内容,你作为一个一人公司创作者应该怎么发?
01思路层 · 算法的底层意图
下面 8 条机制是这一版算法最关键的判断。每一条都给出三件事:它怎么运作、它真正想达成什么、你作为创作者应该怎么应对。
| 机制 | 真正的意图 | 你应该怎么应对 |
|---|---|---|
| 删光手工特征 | 放弃规则、用 transformer 端到端学习用户 | 停掉一切"关键词技巧",把功夫放在让人真的看完、真的回应 |
| 15 种行为概率同预测 | 把"被看见"拆成 15 个可被激活的细节通道 | 每条内容预设要激活哪 2-3 个动作(点开 / 停留 / 关注 / 回复 / 收藏) |
| 候选互不可见 | 每条 post 独立打分,没有"系列加分" | 每一条都必须单独成立,不能依赖上下文 |
| 作者多样性衰减 | 主动反对单一作者刷屏 | 一天 1-2 条主帖足够,更多的话至少间隔 4-6 小时 |
| Bloom Filter 去重 | 看过的不再推 | 同一内容重发是浪费 quota,要么改写要么扩展 |
| 负向权重 mute/block/report | 预测"会让人想拉黑"的内容直接压底 | 所有引战、煽动、人身攻击类内容长期得不偿失 |
| dwell / click 是高频信号 | 停留和点开比点赞密度高一个数量级 | 开头三行决定一切,长尾价值在"读完"而不是"点赞" |
| Thunder 网内召回 | 你的粉丝是免费的第一阵地 | 把"被关注"当作复利杠杆,每条内容都要给陌生人一个 follow 的理由 |
1.1 删光手工特征 · 算法在追求"理解你这个人"
它怎么运作。过去 Heavy Ranker 里塞过几百个特征:你过去 7 天 like 过几条、这个作者 follower 增长率、post 里有没有 link、是不是含 video……这些手工特征在新版本里全部被删除。Heavy Ranker 直接吃 user action sequence —— 一串你过去做过的事,按时间顺序排开。
它真正想达成什么。这是 X 押注 transformer scaling 的结果:与其让工程师拍脑袋猜哪个特征有用,不如把数据原样喂进去让大模型自己学。这意味着算法在追求一件事——理解"你"这个用户的状态,而不是匹配标签。
你应该怎么应对。停掉一切关键词 hack。
- 不要为了"蹭热点"硬塞热点关键词。模型不读关键词字典,但用户会读,硬塞会让 dwell 下降。
- 不要给自己贴标签("AI 博主"、"电商人")。模型不读 bio 加权,读的是过去看过你的人接下来做了什么。
- 把"我这条内容会让看完的人产生什么动作"想清楚,比"我这条内容有没有命中关键词"重要 10 倍。
1.2 15 种行为概率同时预测 · 每条内容都有专属"激活通道"
它怎么运作。Heavy Ranker 对每条候选 post 输出 15 个概率:
最终分 = Σ(权重 × 概率)。正向 11 个(favorite, reply, repost, quote, click, profile_click, video_view, photo_expand, share, dwell, follow_author),负向 4 个(not_interested, block_author, mute_author, report)。
它真正想达成什么。把"这条 post 对这个用户的价值"拆成 15 个细分动作,每一个都是一种"用户表达兴趣"的方式。一个普通点赞和一个"点开主页 + 关注作者"的组合,对模型来说价值天差地别——后者证明这个用户被你勾出了好奇心,想看更多你的东西。
你应该怎么应对。从今天起,每条内容发布前先问自己:
如果答不上来,这条内容大概率会被算法判为"低价值候选"。
不要试图同时激活所有 15 个 action—— 同时讨好所有人 = 谁都不爱。锁定 2-3 个,全力让这条内容激活它们。
1.3 候选互不可见 · 每条必须单独成立
它怎么运作。Heavy Ranker 给每条 post 独立打分,不知道同一 batch 里还有哪些候选。你的"系列第 3 篇"不会因为前两篇火过而加分。
它真正想达成什么。避免"上下文耦合"导致排序不稳定。每条内容必须自带完整价值。
你应该怎么应对。
- "前情提要在主帖里"。系列内容的每一篇都要能让一个从没看过前几篇的人读懂。
- "开头不能依赖外部跳转"。如果第一行需要点开链接才能理解,几乎一定被压。
- "留钩子可以,留悬念不要"。读完这一条没有结论 = dwell 不够 = 算法判低。
1.4 作者多样性衰减 · 算法主动反对刷屏
它怎么运作。Author Diversity Scorer 在候选排序后期主动衰减重复作者的分数。同一个号短时间内再次出现在同一用户的 feed 里,第二条分数 × 0.x,第三条 × 0.xx,越往后衰减越狠。
它真正想达成什么。X 希望 feed 是"多样作者的精选集",不是某个 power user 的个人时间线。这是平台健康度的基本盘。
你应该怎么应对。
- 一天 1-2 条主帖是甜区。第 3 条开始衰减明显。
- 间隔 4-6 小时是给算法"刷新"的时间窗口。早上一条、晚上一条,是默认节奏。
- 评论和回复不受这个限制—— 它们走的是不同的流,可以高频。
- 不要为了"占位"硬发。第 5 条的低质内容会拉低你整体的内容质量信号。
1.5 Bloom Filter 去重 · 重发不会有第二次机会
它怎么运作。PreviouslySeen / PreviouslyServed Filter 用 Bloom Filter 记录"这个用户已经被推过哪些 post"。看过的 post,下次不再出现在他的 feed 里。同一对话树多个分支只留一个,转发同一条原文只留一条。
它真正想达成什么。防止用户疲劳,让 feed 信息密度最大化。
你应该怎么应对。
- 不要原文重发。同一条 post 在不同时间发两次,不会有第二次曝光。
- 要复用就改写。同一个观点,换一个开头、换一个例子、换一个结构(短帖 → 长帖、图文 → 视频),等于一条新内容。
- quote 和 reply 是合法复用通道。quote 自己旧 post 加新观点 = 给老内容第二次激活机会。
1.6 负向行为权重 · 引战短期赚互动、长期挨打
它怎么运作。4 个负向 action(not_interested, block, mute, report)权重是负的。模型预测到你的内容会让人想拉黑,最终分被直接拉到底。
它真正想达成什么。区分"高互动"和"高情绪反弹"。一条引战的 post 短期 favorite 和 reply 会暴涨,但同时 mute/block/report 的预测概率也会拉满。两者抵消后,长期账号会被压。
你应该怎么应对。
- 区分"有立场"和"挑衅"。讲清楚自己的判断是好的;指名道姓骂同行是坏的。
- 区分"批评观点"和"攻击人"。"我觉得这套方法论有漏洞"可以;"做这个的人都是骗子"不行。
- 注意评论区。如果你的评论区充满 mute/block 行为,整个账号在算法眼里的"健康度"都会下降。
1.7 dwell 与 click 是高频信号 · 让人读完比让人点赞重要
它怎么运作。dwell(停留秒数)和 click(点开主帖详情)是用户最常做的动作,每天每个人都在做几百次。favorite/reply/share 是低频高价值动作,每天可能只做几十次。
它真正想达成什么。模型最爱"高频且有信息量"的信号。dwell 既高频,又能反映真实兴趣(强迫不来)。click 同样—— 决定要不要点开是 0.5 秒的判断,骗不来。
你应该怎么应对。这是整个算法时代最重要的一条:
不是写得好,是被读完。
1.8 Thunder 网内召回 · 关注列表是免费的杠杆
它怎么运作。Thunder 召回是 X 的"网内"召回器,它在毫秒级把你关注的人最近发的 post 取出来作为候选。这条路径几乎没有过滤压力——你关注谁,谁的内容就有机会进你的 feed。
它真正想达成什么。用最低延迟保证你看得到你关注的人的内容,这是 X 体验的根基。
你应该怎么应对。对创作者来说,"被关注"是一个有复利的资产:
- 1000 个粉丝 = 1000 个网内召回入口。你每次发帖默认就能被这 1000 人看到(不需要通过 Phoenix 召回竞争)。
- 每一条内容都要给路过的陌生人一个 follow 的理由。这就是为什么 profile_click 和 follow_author 是关键 action。
- follow 漏斗:陌生人刷到 → 读完(dwell)→ 觉得有价值 → 点开主页(profile_click)→ 主页前几条也好 → 关注(follow_author)。任何一环掉都不会有结果。
02实操层 · 具体怎么写、怎么发
下面所有建议都能追溯到上面某条机制。如果一条建议你说不出它对应哪条机制,就不要采用它。
2.1 选题 · 命中多个 action 通道
好选题的判断标准只有一个:它能不能在一条 post 里同时激活 2-3 个 action 通道。下面几类选题模板对一人公司(电商 + AI 方向)特别好用:
| 选题模板 | 激活的主要 action | 例子 |
|---|---|---|
| 反直觉结论 + 数字证据 | click + dwell + reply | "我把客服外包给 AI 三个月,客单价反而涨了 18%—— 不是因为 AI 更聪明" |
| 过程拆解 + 真实账本 | dwell + profile_click + follow | "一人公司做到月营收 50 万,雇过 0 个人。3 个分水岭决定能走多远:" |
| 具体踩坑 + 可复用结论 | dwell + favorite + share | "用 Claude Code 跑电商自动化 6 个月,5 个让我损失过钱的坑" |
| 明确判断 + 邀请反对 | reply + quote + dwell | "我认为 99% 的'AI 工作流'课程是 prompt 复读机。理由 3 条:" |
| 对比同类 + 站队 | reply + share + favorite | "小红书 vs 视频号做电商内容:90% 的人选错了。我用同一条内容测了 30 天" |
| 身份认同 + 抒情 | repost + share + follow | "一人公司不是'公司更小',是把决策权和执行权重新合并" |
2.2 标题(开头第一行)· 决定 click 和 dwell 的入口
X 上没有独立的"标题字段",但 post 的第一行就是标题。它一个人扛三件事:
- 让人决定要不要停下滑动(影响 dwell 起步)
- 让人决定要不要点"展开"(直接对应 P(click))
- 让人决定要不要点开主页看你是谁(profile_click)
2.3 正文 · 把 dwell 拉满
X 已经支持长 post(最长 25000 字符)。这是这一版算法时代最被低估的工具——长 post 是 dwell 收割机。
- 长 vs 短的决策标准:能不能撑住 dwell。如果一条内容需要读者花 20 秒以上才能消化完,写长帖;如果 5 秒就能讲完,写短帖,不要硬撑。
- 开头三行决定剩下的命运。如果前三行没把读者勾住,再长也是浪费。
- 节奏要有"小波峰"。每隔 3-5 行制造一次"信息密度爆点"——一个数字、一个反转、一个具体例子——让读者觉得"再往下还有"。
- 结尾不要空话。不要写"以上就是我的思考,欢迎讨论"。要写一句让人想 reply 或 quote 的话:一个明确的判断、一个开放的问题、一个邀请反驳的立场。
2.4 多媒体 · 激活专属通道
P(video_view) 和 P(photo_expand) 是独立的 action。这意味着多媒体内容拿到的不是"加分",是额外的激活通道。但每种媒体的最佳使用场景不一样:
| 媒体类型 | 主要激活的 action | 什么时候用 |
|---|---|---|
| 纯文本(短帖) | favorite, reply, quote | 一句话能讲完的金句、判断、问题 |
| 纯文本(长帖) | dwell, click, profile_click, follow | 方法论、过程拆解、深度复盘 |
| 单图 | photo_expand, dwell | 需要"先看图再读字"的截图、对比、数据图 |
| 多图(2-4 张) | photo_expand × N, dwell | 步骤分解、前后对比、产品多角度 |
| 视频(<1 分钟) | video_view, dwell, share | 过程演示、产品 demo、操作录屏 |
| 视频(1-3 分钟) | video_view, follow_author | 讲解、观点输出、个人 vlog |
| GIF / 短动图 | video_view, share | 情绪表达、操作演示节选 |
2.5 发布频率与时间间隔
已经在前面讲过作者多样性衰减。这里给具体的执行节奏:
- 主帖:一天 1-2 条,间隔至少 4 小时。电商方向(白领/创业者读者)的最佳时段是早 7-9 点、午 12-14 点、晚 21-23 点。
- 回复/评论:不限。评论自己的主帖给二楼是合法的"补充信息"通道,不受多样性衰减影响,长贴拆短发到评论区也可以。
- quote 转发:一天 0-2 条。quote 别人的内容算你自己的主帖,会占多样性配额。
- 纯转发:一天 1-3 条无害。主要是给关注的人撑场,对自己曝光帮助有限。
2.6 互动管理 · 评论区是账号的第二个内容资产
很多人不知道:你 post 下面的评论质量,会反过来影响这条 post 的算法得分。原因:
- 评论区被举报/拉黑 → 这条 post 的 mute/block 预测概率上升 → 得分被压。
- 评论区有高质量讨论 → reply 概率上升、dwell 上升(用户会停下来读评论)→ 得分上升。
- 你回复评论 → 那个评论作者的下一条互动概率上升 → 长期关系沉淀。
所以:
- 前 10 条评论必须亲自回。这一波回复决定了评论区的基调。
- 遇到有人挑衅,不要正面对线。要么 mute 不理,要么用一条新主帖回应(拉到自己主场)。绝不在评论区互骂——评论区只要有一次互骂,整条 post 的"健康度信号"全废。
- 把最有价值的评论 pin 起来。把"优质讨论"做成内容资产的一部分。
2.7 关注列表维护 · 你 follow 谁会被算法学到
这是 90% 创作者忽略的一条。你的关注列表不光是"你想看谁"——它还是算法用来理解"你这种用户喜欢什么"的训练数据。
从读者侧看:你关注的人决定了 Thunder 召回给你推什么。
从创作者侧看更关键:关注你的那批人的整体画像,决定了 Phoenix Retrieval 会把你的内容召回给哪类陌生人。
具体做法:
- 关注列表保持"主题集中"。如果你的内容主线是电商 + AI,关注列表的主体也应该是这两个圈子里的人。不要乱关注无关明星、政治账号——这些会拉偏算法对"你是谁"的判断。
- 不要互关求粉。互关大量低质账号 = 你的"用户画像"被这些账号污染 = 算法给你推的也跟着跑偏。
- 主动 mute / unfollow 已经不读的账号。清理关注列表是一种"主动信号"。
2.8 规避负向信号 · 这些动作会让你长期挨打
把这条当作"内容的红线清单"。每条 post 发布前对一遍:
2.9 冷启动 · 新账号从 0 开始
这一版算法对新账号其实不算苛刻,因为它不依赖账号历史特征。但有一个隐形门槛:你的内容能不能被 Phoenix Retrieval 召回,取决于"内容 embedding 落在哪个用户行为模式附近"。
冷启动具体做法:
- 第一周:定位密度。主页前 10 条内容必须主题高度集中。陌生人点开主页 3 秒就要能判断"这个号在讲什么"。
- 第二周:找网内入口。主动去 reply 你这个领域的中部账号(5000-50000 粉丝那种),写有内容的 reply,不要彩虹屁。这是免费的 profile_click 流量。
- 第三周:跨账号引流。把你已有的微信公众号 / 小红书 / 视频号粉丝里"也用 X 的人"引过来——这是最快的 Thunder 入口。
- 第四周:观察 Phoenix 召回是否起来。看后台分析:如果有越来越多的陌生人 impression,说明 embedding 已经落到对的位置。
03跨平台 · 这套思路怎么平移
X 的这一版架构(删特征 + transformer + 双塔召回 + 多 action 预测)几乎可以确定是当代主流推荐系统的"目标态"。抖音、小红书、视频号、TikTok 走的路径大同小异。下表是合理推测下的横向对照。
| X | 抖音 | 小红书 | 视频号 | TikTok | |
|---|---|---|---|---|---|
| 是否端到端 transformer | 是(已开源) | 大概率是 | 大概率是 | 追赶中 | 是(更激进) |
| 核心高频信号 | dwell / click | 完播率 / 复播 | 停留 / 截图 | 完播 / 关注转化 | 完播率 |
| 关键负向信号 | mute / block / report | 快速划走 / 举报 | 不感兴趣 / 屏蔽 | 不感兴趣 | 跳过 / 举报 |
| 作者多样性 | 有衰减 | 有衰减 | 有衰减 | 较弱 | 有衰减 |
| 网内召回杠杆 | Thunder · 高 | 低(关注页弱) | 中 | 高(朋友圈式) | 低 |
| 对引战的态度 | 长期压 | 短期奖、长期压 | 长期压 | 较敏感 | 长期压 |
| 开头三秒重要性 | ★★★★ | ★★★★★ | ★★★ | ★★★★ | ★★★★★ |
三条可以放心平移的原则:
- 把"完播 / 读完 / 看到底"作为第一目标—— 所有这些平台都用某种形式的 dwell 或完播率作为高频核心信号。
- 停掉关键词 hack—— 越是端到端的平台,关键词技巧越无效。把功夫放在内容本身能不能勾住人。
- 负向信号在所有平台都是负的—— mute / 不感兴趣 / 举报这一类,在任何平台都是账号长期健康的红线。
不能完全平移的部分:抖音和 TikTok 对"完播率"的权重比 X 对 dwell 的权重更极端,因为短视频天然有"完播"这个清晰的二元事件。所以在那些平台上,视频前 1.5 秒的钩子设计是最大杠杆。X 上长 post 同样的位置叫"开头三行"。
04发布前自检清单
每次发主帖前,把这份清单走一遍。点击勾选,全勾上才发。
- 这条内容单独看能否成立?陌生人不读我其他内容也能懂吗?候选互不可见
- 第一行有没有钩子?数字、反差、判断、对比,至少占一个。P(click)
- 开头三行能不能让陌生人停下来读完整条?P(dwell)
- 这条最想触发哪一个动作?点开、回复、转发、看视频,明确一个。15-action 模型
- 有没有不必要的引战或人身攻击?规避 P(mute/block/report)
- 结尾有没有让人想接话的钩子?(提问、反直觉收尾、留一个能 quote 的金句)P(reply) P(quote)
- 今天发过几条主帖了?第 3 条以上明天再发。作者多样性衰减
- 跟上一条主帖间隔 ≥ 4 小时了吗?作者多样性衰减
- 是旧观点改写吗?如果是,换没换开头、例子或结构?Bloom Filter 去重
- 配了图、视频或表格吗?没有的话能不能顺手加一个?P(photo_expand) P(video_view)
- 有没有堆 hashtag 或关键词?有就删掉。删光手工特征
所有的算法机制最终汇成一句话:让一个原本不认识你的人,读完它、记住它、关注你。剩下的全是技巧。