X Algorithm 仕様書: システム概要
#プロジェクト概要
本リポジトリは、Xの「For You」フィードを支えるコアレコメンデーションシステムの実装を含みます。 このシステムは、ユーザーがフォローしているアカウントからのコンテンツ(イン・ネットワーク)と、 機械学習ベースの検索で発見されたコンテンツ(アウト・オブ・ネットワーク)を組み合わせ、 Grokベースのトランスフォーマーモデルを使用してランキングします。
主な特徴
手動特徴量エンジニアリングの排除
システムはGrokベースのトランスフォーマーに完全に依存し、ユーザーのエンゲージメント履歴から関連性を学習します
候補分離(Candidate Isolation)
ランキング時に候補同士が互いに参照できないよう特殊なアテンションマスクを使用
マルチアクション予測
単一の「関連性」スコアではなく、複数のエンゲージメントタイプの確率を予測
構成可能なパイプラインアーキテクチャ
柔軟で拡張可能なレコメンデーションパイプラインフレームワーク
トランスフォーマー実装について: 本システムのトランスフォーマー実装は、 xAIによるGrok-1オープンソースリリースからポートされ、レコメンデーションシステムのユースケースに適応されています。
#For Youフィードとは
パーソナライズされたタイムラインの仕組み
For Youフィードは、Xにおけるパーソナライズされたタイムラインであり、各ユーザーに最も関連性の高いコンテンツを表示することを目的としています。 従来の時系列ベースのタイムラインとは異なり、機械学習モデルがユーザーの興味・関心に基づいてコンテンツを選択・順序付けします。
コンテンツソース
| ソース | 説明 | コンポーネント |
|---|---|---|
| イン・ネットワーク | ユーザーがフォローしているアカウントからの投稿 | Thunder |
| アウト・オブ・ネットワーク | グローバルコーパスからML検索で発見された投稿 | Phoenix Retrieval |
#主要コンポーネント一覧
Home Mixer
home-mixer/For Youフィードを組み立てるオーケストレーションレイヤー。Candidate Pipelineフレームワークを活用し、各ステージを実行します。
Thunder
thunder/イン・ネットワークコンテンツを提供するリアルタイム投稿ストア。Kafkaから投稿イベントを消費し、サブミリ秒のルックアップを実現。
Phoenix
phoenix/機械学習ベースの検索とランキングを担当。Two-Tower ModelによるRetrievalとTransformerによるRankingの2機能を持ちます。
Candidate Pipeline
candidate-pipeline/再利用可能なレコメンデーションパイプラインフレームワーク。Source, Hydrator, Filter, Scorer, Selectorなどのトレイトを定義。
Home Mixerのステージ
| ステージ | 説明 | 主要コンポーネント |
|---|---|---|
| Query Hydrators | ユーザーコンテキストの取得 | UserActionSeqQueryHydrator, UserFeaturesQueryHydrator |
| Sources | 候補の取得 | ThunderSource, PhoenixSource |
| Hydrators | 候補データの補完 | CoreDataCandidateHydrator, GizmoduckHydrator等 |
| Filters | 不適格な候補の除去 | AgeFilter, MutedKeywordFilter, AuthorSocialgraphFilter等 |
| Scorers | スコア計算 | PhoenixScorer, WeightedScorer, AuthorDiversityScorer, OONScorer |
| Selector | 上位候補の選択 | TopKScoreSelector |
| Post-Selection Filters | 最終検証 | VFFilter, DedupConversationFilter |
| Side Effects | 非同期処理 | CacheRequestInfoSideEffect |
Phoenix: 予測されるアクション
ポジティブアクション
favorite, reply, repost, quote, click, profile_click, video_view, photo_expand, share, dwell, follow_author
ネガティブアクション
not_interested, block_author, mute_author, report
#技術スタック
プログラミング言語
| 言語 | 用途 | バージョン |
|---|---|---|
| Rust | Home Mixer, Thunder, Candidate Pipeline | 安定版 |
| Python | Phoenix ML モデル | 3.10+ |
機械学習フレームワーク
| フレームワーク | 用途 |
|---|---|
| JAX | 高性能数値計算、自動微分 |
| Haiku | JAX上のニューラルネットワークライブラリ |
通信・インフラ
| 技術 | 用途 |
|---|---|
| gRPC | サービス間通信(Home Mixer, Thunder, Phoenix間) |
| Protocol Buffers | データシリアライゼーション |
| Kafka | リアルタイムイベントストリーミング(投稿イベント) |
| Tonic | Rust gRPCフレームワーク |
| Axum | Rust HTTPフレームワーク |
| Tokio | 非同期ランタイム |
| gzip/Zstd | gRPCメッセージ圧縮 |
#システム全体の目的と設計思想
設計目標
ユーザー体験の最適化
- -パーソナライゼーション: 各ユーザーの興味・関心に合わせたコンテンツ提供
- -発見性: フォロー外の関連コンテンツを適切に提示
- -多様性: 単一著者のコンテンツ偏重を防止
技術的優位性
- -スケーラビリティ: 数億ユーザー規模に対応
- -レイテンシ: サブミリ秒〜数十ミリ秒でのレスポンス
- -柔軟性: 新しいソース、フィルタ、スコアラーの容易な追加
主要な設計決定
従来のアプローチ
ドメイン知識・仮説が必要
本システムのアプローチ
特徴量学習を自動化
問題: 候補間の相互参照がある場合、スコアがバッチ構成に依存し、キャッシュ不可で不安定な結果となる
解決策: 候補分離マスクにより、各候補はユーザーコンテキストのみ参照可能
単一の「関連性」スコアではなく、複数のエンゲージメントタイプの確率を予測:
ポジティブ: +weight / ネガティブ: -weight
#データフロー概要
プロトコル: gRPC (Protocol Buffers) |圧縮: gzip, Zstd |認証: 内部サービス間認証
#用語集
| 用語 | 説明 |
|---|---|
| イン・ネットワーク | ユーザーがフォローしているアカウントからのコンテンツ |
| アウト・オブ・ネットワーク | フォロー外のアカウントからのコンテンツ |
| 候補分離 | ランキング時に候補同士が互いに参照できないようにする設計 |
| Two-Tower Model | ユーザーとアイテムを別々のタワーでエンコードする検索モデル |
| ハイドレーション | 候補データに追加情報を付与するプロセス |
| ANN | Approximate Nearest Neighbor(近似最近傍探索) |