
2026 年 1 月,X (Twitter)平台再次向全球开发者开放了其“For You”推荐算法的源代码。

相较于 2023 年部分开源的碎片化版本,2026 版内核实现了底层架构的范式重构:全面废除手工特征工程。
本文从推荐算法的视角,聚焦 X推荐系统的算法部分,按照推荐系统的标准阶段进行拆解:
X 抛弃了统计特征、交叉特征,直接全部使用 ID特征 。(没有使用多模态embedding、物品tag特征,会不会少很多先验知识?)
X的用户和帖子的 ID 空间巨大(数十亿级别),如果只用 1 次hash,要把冲突率降到极低,表必须开得很大,因此这里采用多重Hash Embedding 的方案:
ID通过2种hash方式(或2种seed),得到2个hash值,分别过look-up table得到128d的embedding。接着把他们concat起来过一个无激活函数的Linear层再压缩回128d

从配置可以看出来,作者id、用户id、物品id都用了2套hash:
# Hash configuration
hash_config = HashConfig(
num_user_hashes=2,
num_item_hashes=2,
num_author_hashes=2,
)为什么用多重 Hash?
用户序列的处理方式很普通,而且只有互动序列一种,具体细节:
只有1个上下文特征(没错,就1个):
Context 特征 | 用途 |
|---|---|
product_surface | 场景(关注流、发现流、搜索流……) |
client_app_id | 设备系统或设备号 |
country_code | 国家 |
language_code | 语言偏好 |
is_bottom_request | 区分首刷 |
注意:只有 product_surface 是作为模型输入的 Embedding 特征。其他特征并没有送入模型,而是做了一些未开源的策略。
只有 1个ID 特征(没错,就1个)
简单粗暴,模型只需要 ID + 序列 + 场景,让 Transformer 端到端学习一切。

没有特别重的业务逻辑(可能是没开源呢?),都是一些普通的过滤:
过滤器 | 功能 | 过滤条件 |
|---|---|---|
DropDuplicatesFilter | 去重 | 相同 tweet_id 只保留第一个 |
RetweetDeduplicationFilter | 转推去重 | 原帖和转推只保留一个 |
AgeFilter | 时效过滤 | 帖子时效 > max_age |
SelfTweetFilter | 自己发表的帖子 | author_id == user_id |
AuthorSocialgraphFilter | 负反馈过滤 | 作者在 blocked 或 muted 列表 |
MutedKeywordFilter | 关键词屏蔽 | 帖子文本包含屏蔽词 |
PreviouslySeenPostsFilter | 已读过滤 | 使用布隆过滤器 |
PreviouslyServedPostsFilter | 下发过滤 | 过滤本次下发的物品 |
IneligibleSubscriptionFilter | 订阅权限控制 | 付费内容 + 用户未订阅 |
DedupConversationFilter | 会话去重 | 根据祖先帖子 ID确定对话链,同一对话链中只保留 score 最高的帖子 |
CoreDataHydrationFilter | 非法数据 | author_id=0 或内容为空 |
VFFilter | 安全过滤 | 安全审核标记为 Drop |
没有粗排,只做了召回截断。
X 的精排模型基于 Grok Transformer:

与传统的Transformer Encoder区别:
max_attn_val = jnp.array(30.0, dtype=attn_logits.dtype)
attn_logits = max_attn_val * jnp.tanh(attn_logits / max_attn_val)模型参数仅供参考,感觉是随便给的:
参数 | 测试值 | 说明 |
|---|---|---|
emb_size | 128 | Embedding 维度 |
key_size | 64 | Attention Key/Query 维度 |
num_q_heads | 2 | Query 头数 |
num_kv_heads | 2 | Key/Value 头数(支持 GQA) |
num_layers | 2 | Transformer 层数 |
widening_factor | 2 | FFN 扩展因子 |
attn_output_multiplier | 0.125 | Attention logits 缩放因子 |
history_seq_len | 128 | 历史序列长度 |
candidate_seq_len | 32 | 候选物品数量 |
标准 Transformer 的 Self-Attention 会让所有位置互相影响。如果候选之间可以互相 attend,那么候选 A 的分数会受候选 B 影响,因此对于候选集做了mask如下图:

注意:开源的代码和readme中所给的图不一致,如果严格按照代码则是使用causal attention,如下图:

精排模型直接同时预测 18 种用户行为的概率:
类型 | 预测目标 | 说明 |
|---|---|---|
正向 | favorite_score | P(点赞) |
正向 | reply_score | P(回复) |
正向 | retweet_score | P(转推) |
正向 | quote_score | P(引用) |
正向 | click_score | P(点击详情) |
正向 | profile_click_score | P(点击作者主页) |
正向 | vqv_score | P(视频观看) |
正向 | share_score | P(分享) |
正向 | share_via_dm_score | P(私信分享) |
正向 | share_via_copy_link_score | P(复制链接) |
正向 | dwell_score | P(停留) |
正向 | photo_expand_score | P(展开图片) |
正向 | quoted_click_score | P(点击引用帖) |
正向 | follow_author_score | P(关注作者) |
负向 | not_interested_score | P(不感兴趣) |
负向 | block_author_score | P(block作者) |
负向 | mute_author_score | P(mute作者) |
负向 | report_score | P(举报) |
连续 | dwell_time | 预测停留时长 |
所有预测结果通过加权求和得到 weighted_score(居然是加法公式):
具体的权重值未开源
精排之后,X 通过一系列重排策略对候选进行最终调整:
目标:防止同一作者的帖子霸占信息流。
公式:
其中:
设计意图:大 V 刷屏时,后续帖子会被逐渐压低,给其他作者的内容让出位置。
目标:平衡发现流和关注流内容的比例。
计算公式:
其中:
设计意图:
开源代码没有强插部分
本文基于 x-algorithm编写,聚焦算法层面的分析。如有理解不对的地方,欢迎指正!
参考链接:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。