首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >X 推荐算法详解:从特征到排序的完整链路

X 推荐算法详解:从特征到排序的完整链路

原创
作者头像
Mirza Zhao
修改2026-01-23 15:15:10
修改2026-01-23 15:15:10
1.1K0
举报
文章被收录于专栏:推荐算法学习推荐算法学习

一、前言

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

相较于 2023 年部分开源的碎片化版本,2026 版内核实现了底层架构的范式重构:全面废除手工特征工程

本文从推荐算法的视角,聚焦 X推荐系统的算法部分,按照推荐系统的标准阶段进行拆解:


二、特征工程与样本构建

2.1 无手工特征

X 抛弃了统计特征、交叉特征,直接全部使用 ID特征 。(没有使用多模态embedding、物品tag特征,会不会少很多先验知识?)

2.2 多重 Hash 的ID Embedding

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:

代码语言:javascript
复制
# Hash configuration
hash_config = HashConfig(
    num_user_hashes=2,
    num_item_hashes=2,
    num_author_hashes=2,
)

为什么用多重 Hash?

  1. 控制参数规模:Hash 表大小固定,不随 ID 数量增长
  2. 减少hash冲突:同时在两个hash函数上都冲突的概率极低
  3. 内存优化:假设hash table大小是N,那么只需要N的table存储空间,就可以表示N^2的结果

2.3 用户序列特征处理

用户序列的处理方式很普通,而且只有互动序列一种,具体细节:

  • 序列类型:互动序列,只曝光不互动的不要
  • table共享:与item id共享look-up table
  • 序列长度:保留最近的 N 条,具体长度未开源
  • 聚合方式:时间窗口内 用户id+帖子id 去重,窗口大小未开源
  • side-info:帖子id+作者id+动作+场景
    • 其中动作:采用multi-hot + 线性层处理

2.4 上下文特征

只有1个上下文特征(没错,就1个):

Context 特征

用途

product_surface

场景(关注流、发现流、搜索流……)

client_app_id

设备系统或设备号

country_code

国家

language_code

语言偏好

is_bottom_request

区分首刷

注意:只有 product_surface 是作为模型输入的 Embedding 特征。其他特征并没有送入模型,而是做了一些未开源的策略。

2.5 物品侧特征

只有 1个ID 特征(没错,就1个)

2.6 特征工程总结

简单粗暴,模型只需要 ID + 序列 + 场景,让 Transformer 端到端学习一切。


三、召回

3.1 Thunder 召回(关注流)

  • 功能:负责召回用户关注账号的帖子
  • 召回分:时间戳

3.2 Phoenix 召回(发现流)

  • 召回路数:只有双塔
    • 用户塔用 Transformer,候选塔只用 MLP
    • 没有其他召回通道(如热门、协同过滤、图召回等)
    • L2归一化+点积计算余弦相似度,取topk
  • 召回Quota:未开源
  • 召回降级:如果用户没有序列,则使用关注流召回;如果没关注,就用热门结果

3.3 召回后过滤

没有特别重的业务逻辑(可能是没开源呢?),都是一些普通的过滤:

过滤器

功能

过滤条件

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


四、粗排(无)

没有粗排,只做了召回截断。


五、精排

5.1 精排模型架构

X 的精排模型基于 Grok Transformer

与传统的Transformer Encoder区别:

  • 使用RMSNorm代替LN
  • FFN使用(GELU + Gate)
  • 位置编码使用RoPE
  • 支持GQA
  • Attention 缩放使用Tanh 软裁剪 + 自定义 multiplier
代码语言:javascript
复制
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

候选物品数量

5.2 Candidate Mask

标准 Transformer 的 Self-Attention 会让所有位置互相影响。如果候选之间可以互相 attend,那么候选 A 的分数会受候选 B 影响,因此对于候选集做了mask如下图:

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

5.3 多目标预测

精排模型直接同时预测 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

预测停留时长

5.4 加权评分

所有预测结果通过加权求和得到 weighted_score(居然是加法公式):

\text{weighted_score} = \sum_{i} w_i \cdot P(\text{action}_i)

具体的权重值未开源


六、重排

精排之后,X 通过一系列重排策略对候选进行最终调整:

6.1 多样性打散-同作者打散

目标:防止同一作者的帖子霸占信息流。

公式

\text{score}_{\text{adjusted}} = \text{weighted_score} \times \text{multiplier}(n)
\text{multiplier}(n) = (1 - \text{floor}) \times \text{decay}^n + \text{floor}

其中:

  • n = 该作者第几次出现(0-indexed)
  • decay = 衰减因子
  • floor = 下限(防止分数被压到 0)

设计意图:大 V 刷屏时,后续帖子会被逐渐压低,给其他作者的内容让出位置。

6.2 加权/降权-关注贴调权

目标:平衡发现流和关注流内容的比例。

计算公式

\text{score}_{\text{final}} = \begin{cases} \text{score}_{\text{weighted}} & \text{if 是关注贴} = \text{true} \\ \text{score}_{\text{weighted}} \times \alpha_{\text{oon}} & \text{if 是关注贴} = \text{false} \end{cases}

其中:

  • \text{score}_{\text{weighted}}​ = 精排阶段的加权分数
  • \alpha_{\text{oon}} 是调整系数,未开源

设计意图

  • 用户关注了某人 = 明确表达兴趣,应优先展示
  • 但完全不推荐新内容会导致"信息茧房"

6.3 强插(无)

开源代码没有强插部分


七、总结

  1. 架构极简,部分地方过于简单
  2. 核心超参数、样本、模型参数未开源,只有个骨架
  3. 和现有成熟的推荐系统比,缺少了冷启、粗排、多样性打散等生态策略,更像一个玩具demo(也可能是没开源)
  4. 总之:干货不多(狗头)

本文基于 x-algorithm编写,聚焦算法层面的分析。如有理解不对的地方,欢迎指正!

参考链接:

https://github.com/xai-org/x-algorithm

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、特征工程与样本构建
    • 2.1 无手工特征
    • 2.2 多重 Hash 的ID Embedding
    • 2.3 用户序列特征处理
    • 2.4 上下文特征
    • 2.5 物品侧特征
    • 2.6 特征工程总结
  • 三、召回
    • 3.1 Thunder 召回(关注流)
    • 3.2 Phoenix 召回(发现流)
    • 3.3 召回后过滤
  • 四、粗排(无)
  • 五、精排
    • 5.1 精排模型架构
    • 5.2 Candidate Mask
    • 5.3 多目标预测
    • 5.4 加权评分
  • 六、重排
    • 6.1 多样性打散-同作者打散
    • 6.2 加权/降权-关注贴调权
    • 6.3 强插(无)
  • 七、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档