Skip to content

X 上的“为你推荐”信息流所依据的算法

License

Notifications You must be signed in to change notification settings

0xcii/x-algorithm

 
 

Repository files navigation

X「为你推荐」信息流算法

本仓库包含支撑 X「为你推荐(For You)」信息流的核心推荐系统。它将网络内内容(来自你关注的账号)与网络外内容(通过基于机器学习的召回在全量语料中发现)进行合并,并使用基于 Grok 的 Transformer 模型对全部候选内容进行排序。

说明: Transformer 的实现移植自 xAI 的 Grok-1 开源版本,并针对推荐系统场景做了适配。

目录


概览

「为你推荐」信息流算法会从两类来源召回、排序并过滤帖子:

  1. 网络内(Thunder):来自你关注的账号的帖子
  2. 网络外(Phoenix Retrieval):从全量语料中通过机器学习召回发现的帖子

两类候选会合并后交由 Phoenix 统一排序。Phoenix 是一个基于 Grok 的 Transformer 模型,会为每条帖子预测多种互动行为的概率,最终分数则是这些概率的加权组合。

系统中我们移除了所有手工特征工程以及大部分启发式规则。基于 Grok 的 Transformer 会通过理解你的历史互动序列(点赞、回复、转发、分享等)来判断内容与你的相关性,从而承担主要的建模与排序工作。


系统架构

┌─────────────────────────────────────────────────────────────────────────────────────────────┐
│                                      为你信息流请求                                         │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
                                               │
                                               ▼
┌─────────────────────────────────────────────────────────────────────────────────────────────┐
│                                         HOME MIXER                                          │
│                                       (编排层)                                            │
├─────────────────────────────────────────────────────────────────────────────────────────────┤
│                                                                                             │
│   ┌─────────────────────────────────────────────────────────────────────────────────────┐   │
│   │                                      查询补全                                      │   │
│   │  ┌──────────────────────────┐    ┌──────────────────────────────────────────────┐   │   │
│   │  │ 用户行为序列             │    │ 用户特征                                     │   │   │
│   │  │(互动历史)              │    │(关注列表、偏好等)                           │   │   │
│   │  └──────────────────────────┘    └──────────────────────────────────────────────┘   │   │
│   └─────────────────────────────────────────────────────────────────────────────────────┘   │
│                                              │                                              │
│                                              ▼                                              │
│   ┌─────────────────────────────────────────────────────────────────────────────────────┐   │
│   │                                     候选来源                                      │   │
│   │         ┌─────────────────────────────┐    ┌────────────────────────────────┐       │   │
│   │         │        THUNDER              │    │     PHOENIX RETRIEVAL          │       │   │
│   │         │     (网络内帖子)           │    │     (网络外帖子)              │       │   │
│   │         │                             │    │                                │       │   │
│   │         │  来自你关注账号的帖子        │    │  基于 ML 的相似度检索           │       │   │
│   │         │                             │    │  覆盖全量语料                   │       │   │
│   │         └─────────────────────────────┘    └────────────────────────────────┘       │   │
│   └─────────────────────────────────────────────────────────────────────────────────────┘   │
│                                              │                                              │
│                                              ▼                                              │
│   ┌─────────────────────────────────────────────────────────────────────────────────────┐   │
│   │                                       补全                                        │   │
│   │  拉取额外数据:帖子核心元数据、作者信息、媒体实体等                                   │   │
│   └─────────────────────────────────────────────────────────────────────────────────────┘   │
│                                              │                                              │
│                                              ▼                                              │
│   ┌─────────────────────────────────────────────────────────────────────────────────────┐   │
│   │                                       过滤                                        │   │
│   │  移除:重复内容、过旧内容、本人发帖、已拉黑作者、静音关键词等                          │   │
│   └─────────────────────────────────────────────────────────────────────────────────────┘   │
│                                              │                                              │
│                                              ▼                                              │
│   ┌─────────────────────────────────────────────────────────────────────────────────────┐   │
│   │                                       打分                                        │   │
│   │  ┌──────────────────────────┐                                                       │   │
│   │  │  Phoenix 打分器          │    基于 Grok 的 Transformer 预测:                    │   │
│   │  │(ML 预测)                │    P(like), P(reply), P(repost), P(click)...          │   │
│   │  └──────────────────────────┘                                                       │   │
│   │               │                                                                     │   │
│   │               ▼                                                                     │   │
│   │  ┌──────────────────────────┐                                                       │   │
│   │  │  加权打分器              │    加权分数 = Σ (weight × P(action))                  │   │
│   │  │(组合预测)               │                                                       │   │
│   │  └──────────────────────────┘                                                       │   │
│   │               │                                                                     │   │
│   │               ▼                                                                     │   │
│   │  ┌──────────────────────────┐                                                       │   │
│   │  │  作者多样性打分器         │    衰减重复作者得分                                   │   │
│   │  │                          │    以确保信息流多样性                                  │   │
│   │  └──────────────────────────┘                                                       │   │
│   └─────────────────────────────────────────────────────────────────────────────────────┘   │
│                                              │                                              │
│                                              ▼                                              │
│   ┌─────────────────────────────────────────────────────────────────────────────────────┐   │
│   │                                       选择                                        │   │
│   │                    按最终分数排序,选择 Top K 候选                                   │   │
│   └─────────────────────────────────────────────────────────────────────────────────────┘   │
│                                              │                                              │
│                                              ▼                                              │
│   ┌─────────────────────────────────────────────────────────────────────────────────────┐   │
│   │                                   过滤(选择后)                                   │   │
│   │                 可见性过滤(删除/垃圾/暴力/血腥等)                                  │   │
│   └─────────────────────────────────────────────────────────────────────────────────────┘   │
│                                                                                             │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
                                               │
                                               ▼
┌─────────────────────────────────────────────────────────────────────────────────────────────┐
│                                    排序后的信息流响应                                       │
└─────────────────────────────────────────────────────────────────────────────────────────────┘

组件

Home Mixer

位置: home-mixer/

用于组装「为你推荐」信息流的编排层。它基于 CandidatePipeline 框架,按如下阶段执行:

阶段 说明
查询补全器(Query Hydrators) 拉取用户上下文(互动历史、关注列表)
来源(Sources) 从 Thunder 和 Phoenix 召回候选
补全器(Hydrators) 为候选补全更多数据
过滤器(Filters) 剔除不符合展示条件的候选
打分器(Scorers) 预测互动并计算最终分数
选择器(Selector) 按分数排序并选择 Top K
选择后过滤(Post-Selection Filters) 最终可见性校验与去重
副作用(Side Effects) 缓存请求信息以便后续使用

服务对外提供 gRPC 接口(ScoredPostsService),用于按用户请求返回排序后的帖子列表。


Thunder

位置: thunder/

一个以内存为主的帖子存储与实时写入链路,用于跟踪全体用户的近期发帖。它会:

  • 从 Kafka 消费帖子创建/删除事件
  • 为每个用户维护原帖、回复/转帖、视频帖等存储
  • 为请求用户提供其关注网络内的帖子候选
  • 自动裁剪超过保留期的历史帖子

Thunder 让网络内内容可以在亚毫秒级完成检索,无需访问外部数据库。


Phoenix

位置: phoenix/

机器学习组件,主要包含两项能力:

1. 召回(双塔模型)

用于发现网络外的相关帖子:

  • 用户塔(User Tower):将用户特征与互动历史编码为向量
  • 候选塔(Candidate Tower):将全量帖子编码为向量
  • 相似度检索:通过点积相似度检索 Top-K 帖子

2. 排序(带候选隔离的 Transformer)

为每个候选预测互动行为概率:

  • 输入包含用户上下文(互动历史)与候选帖子
  • 通过特殊注意力掩码(attention mask)让候选之间不能相互关注
  • 输出多种行为类型的概率(点赞、回复、转帖、点击等)

更详细的架构说明见 phoenix/README.md


Candidate Pipeline

位置: candidate-pipeline/

用于构建推荐流水线的可复用框架,为以下 trait(接口)定义了标准接口:

Trait(接口) 用途
Source 从数据源获取候选
Hydrator 为候选补充更多特征/字段
Filter 剔除不应展示的候选
Scorer 计算用于排序的分数
Selector 排序并选择 Top 候选
SideEffect 执行异步副作用(缓存、日志等)

框架会在可行时并行执行 sources 与 hydrators,并提供可配置的错误处理与日志能力。


工作原理

流水线阶段

  1. 查询补全(Query Hydration):获取用户近期互动历史与元信息(如关注列表)

  2. 候选召回(Candidate Sourcing):从以下来源召回候选:

    • Thunder:关注网络内的近期帖子
    • Phoenix Retrieval:从全量语料中机器学习召回的网络外帖子
  3. 候选补全(Candidate Hydration):为候选补全信息,例如:

    • 帖子核心数据(文本、媒体等)
    • 作者信息(用户名、认证状态)
    • 视频时长(仅视频帖)
    • 订阅状态
  4. 打分前过滤(Pre-Scoring Filters):剔除以下帖子:

    • 重复内容
    • 过旧内容
    • 观看者本人发帖
    • 来自已拉黑/已静音账号的内容
    • 命中静音关键词的内容
    • 已经看过或近期已分发过的内容
    • 不符合订阅条件的内容
  5. 打分(Scoring):按顺序应用多个打分器:

    • Phoenix Scorer:从 Phoenix Transformer 获取机器学习预测
    • Weighted Scorer:将预测组合为最终相关性分数
    • Author Diversity Scorer:衰减重复作者的分数以提升多样性
    • OON Scorer:对网络外内容进行分数修正
  6. 选择(Selection):按分数排序并选择 Top K 候选

  7. 选择后处理(Post-Selection Processing):对最终待分发候选执行校验与收尾处理


打分与排序

Phoenix 的 Grok-based Transformer 模型会为多种互动行为预测概率:

预测:
├── P(favorite)
├── P(reply)
├── P(repost)
├── P(quote)
├── P(click)
├── P(profile_click)
├── P(video_view)
├── P(photo_expand)
├── P(share)
├── P(dwell)
├── P(follow_author)
├── P(not_interested)
├── P(block_author)
├── P(mute_author)
└── P(report)

Weighted Scorer 会将这些概率组合成最终分数:

最终分数 = Σ (weight_i × P(action_i))

正向行为(点赞、转帖、分享等)对应正权重;负向行为(拉黑、静音、举报等)对应负权重,从而降低用户可能不喜欢的内容得分。


过滤

过滤发生在两个阶段:

打分前过滤(Pre-Scoring Filters):

过滤器 用途
DropDuplicatesFilter 移除重复的帖子 ID
CoreDataHydrationFilter 移除未能补全核心元数据的帖子
AgeFilter 移除超过阈值的老帖子
SelfpostFilter 移除用户本人发帖
RepostDeduplicationFilter 对同一内容的转帖去重
IneligibleSubscriptionFilter 移除用户无法访问的付费内容
PreviouslySeenPostsFilter 移除用户已看过的帖子
PreviouslyServedPostsFilter 移除会话内已下发过的帖子
MutedKeywordFilter 移除命中用户静音关键词的帖子
AuthorSocialgraphFilter 移除来自已拉黑/已静音作者的帖子

选择后过滤(Post-Selection Filters):

过滤器 用途
VFFilter 移除已删除/垃圾/暴力/血腥等不可见帖子
DedupConversationFilter 对同一对话线程的多分支去重

关键设计决策

1. 不做手工特征工程

系统完全依赖基于 Grok 的 Transformer 从用户互动序列中学习相关性,不再针对内容相关性做人工特征工程,从而显著降低数据流水线与在线服务基础设施的复杂度。

2. 排序阶段的候选隔离

Transformer 推理时,候选之间不能相互 attention,只能关注用户上下文。这保证某条帖子的得分不依赖同一 batch 中其他候选的存在,从而让分数更稳定,也更易于缓存。

3. 基于哈希的 Embedding

召回与排序都通过多个哈希函数进行 embedding 查表。

4. 多行为预测

模型不会只预测单一的「相关性」分数,而是预测多种行为的概率。

5. 可组合的流水线架构

candidate-pipeline crate 提供了灵活的推荐流水线框架,具备:

  • 将流水线执行与监控从业务逻辑中解耦
  • 独立阶段并行执行,并支持优雅的错误处理
  • 便捷扩展新的 source、hydrator、filter 与 scorer

许可证

本项目采用 Apache License 2.0 许可证,详见 LICENSE

About

X 上的“为你推荐”信息流所依据的算法

Resources

License

Code of conduct

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 46.5%
  • Python 34.3%
  • HTML 19.2%