Technical Specification

X For You フィードアルゴリズム - アーキテクチャ仕様書

バージョン: 1.0|最終更新日: 2026-01-21|ステータス: 公開

#概要

X For You フィードアルゴリズムは、ユーザーに最も関連性の高いコンテンツを提供する推薦システムです。 本システムは2つのソースからコンテンツを取得し、Grokベースのトランスフォーマーモデル (Phoenix) を使用してランキングを行います。

主要コンポーネント

コンポーネント役割実装言語
Home Mixerオーケストレーション層、パイプライン実行Rust
Thunderインネットワーク投稿のリアルタイム配信Rust
PhoenixML予測(検索・ランキング)Python/JAX
Candidate PipelineパイプラインフレームワークRust

設計原則

手作業による特徴量エンジニアリングの排除

Grokトランスフォーマーがユーザーのエンゲージメント履歴から関連性を学習

候補間の独立性

ランキング時、候補同士はアテンションしない(スコアの一貫性とキャッシャビリティを確保)

ハッシュベース埋め込み

複数のハッシュ関数による埋め込みルックアップ

マルチアクション予測

単一の関連性スコアではなく、複数のアクション確率を予測

#システムアーキテクチャ全体図

高レベルアーキテクチャ
クライアントリクエスト (iOS / Android / Web App)
API Gateway Layer (認証・レート制限・ルーティング)

HOME MIXER (オーケストレーション層)

gRPC: ScoredPostsService
[1] Query Hydration
[2] Candidate Sources
[3] Hydration
[4] Pre-Scoring Filters
[5] Scoring
[6] Selection
[7] Post-Selection
[8] Side Effects
RANKED FEED RESPONSE (スコア付き投稿リスト返却)
コンポーネント間通信図
外部クライアント / API Gateway
gRPC (HTTP/2)
HOME MIXER (ScoredPostsService)
THUNDER

InNetworkPostsService

PHOENIX RETRIEVAL

RetrievalService

PHOENIX RANKING

PredictionService

EXTERNAL

Gizmoduck, TES, Strato...

#8段階パイプライン詳細

Home Mixerが実行するパイプラインの各ステージ

1

Query Hydration

リクエストに必要なユーザーコンテキスト情報を取得

  • -UserActionSeqQueryHydrator: エンゲージメント履歴取得
  • -UserFeaturesQueryHydrator: フォローリスト、設定等取得
  • -両Hydratorは並列実行 (join_all)
2

Candidate Sources

2つのソースから候補投稿を取得

  • -Thunder: インネットワーク投稿 (メモリ内ストア)
  • -Phoenix Retrieval: アウトオブネットワーク (Two-Tower Model)
  • -両ソースは並列実行
3

Hydration

候補に追加データを付与

  • -CoreDataCandidateHydrator: 投稿メタデータ
  • -GizmoduckCandidateHydrator: 著者情報
  • -VideoDurationCandidateHydrator: 動画長
  • -SubscriptionHydrator: サブスクリプション状態
4

Pre-Scoring Filters

スコアリング前に不適格な候補を除外

  • -DropDuplicatesFilter: 重複投稿IDを除外
  • -AgeFilter: MAX_POST_AGE より古い投稿を除外
  • -MutedKeywordFilter: ミュートキーワード含む投稿を除外
  • -AuthorSocialgraphFilter: ブロック/ミュート済み著者を除外
5

Scoring

ML予測を実行し、最終スコアを計算

  • -PhoenixScorer: Grok Transformerで19種類の確率予測
  • -WeightedScorer: 重み付け合計スコア計算
  • -AuthorDiversityScorer: 同一著者スコア減衰
  • -OONScorer: Out-of-Networkスコア調整
6

Selection

スコア順にソートし、上位K件を選択

  • -TopKScoreSelector: 降順ソート
  • -K = params::RESULT_SIZE (設定可能)
  • -スコアが高い順にカットオフ
7

Post-Selection Processing

選択後の最終検証とフィルタリング

  • -VFCandidateHydrator: 可視性フィルタリングデータ取得
  • -VFFilter: 削除/スパム/暴力コンテンツ除外
  • -DedupConversationFilter: 会話スレッド重複排除
8

Side Effects

非同期の副作用処理(キャッシュ、ロギング等)

  • -CacheRequestInfoSideEffect: リクエスト情報キャッシュ
  • -レスポンスをブロックしない (fire-and-forget)
  • -並列実行 (tokio::spawn)

#gRPCサービス構成

Home Mixer Service

Port: 50051

メインのオーケストレーションサービス。クライアントからのリクエストを受け、パイプラインを実行

RPC: GetScoredPosts

Thunder Service

Port: 50052

インネットワーク投稿を高速に取得。Zstd圧縮対応

RPC: GetInNetworkPosts

Phoenix Prediction Service

Port: 50053

ユーザーアクションシーケンスと候補からエンゲージメント確率を予測

RPC: Predict

Phoenix Retrieval Service

Port: 50054

ユーザー特徴からTop-Kアウトオブネットワーク候補を取得

RPC: Retrieve

外部サービス依存関係

サービス名役割使用コンポーネント
Gizmoduckユーザープロフィール情報GizmoduckCandidateHydrator
TES (Tweet Entity Service)ツイートメタデータCoreDataCandidateHydrator等
StratoKVストア/設定UserFeaturesQueryHydrator, CacheSideEffect
SocialGraphフォロー/ブロック関係AuthorSocialgraphFilter
VisibilityFilteringコンテンツ可視性VFFilter
UASユーザーアクション履歴UserActionSeqQueryHydrator

#データモデルとスキーマ

ScoredPostsQuery (パイプライン入力クエリ)

Core Fields

  • user_id: i64 - リクエストユーザーID
  • client_app_id: i32 - クライアントアプリ識別子
  • country_code: String - 国コード
  • language_code: String - 言語コード
  • seen_ids: Vec<i64> - 既読投稿ID
  • served_ids: Vec<i64> - 既配信投稿ID

Hydrated Fields

  • user_action_sequence - エンゲージメント履歴
  • user_features - フォローリスト、ミュートキーワード等
  • request_id: String - トレーシング用ID
PhoenixScores (ML予測スコア群)

Positive Engagement

favorite_score
reply_score
retweet_score
quote_score
click_score
profile_click_score
photo_expand_score
vqv_score
share_score
dwell_score
follow_author_score
dwell_time

Negative Engagement

not_interested_score
block_author_score
mute_author_score
report_score
Thunder PostStore データ構造Rust
pub struct PostStore {
    posts: Arc<DashMap<i64, LightPost>>,                    // post_id -> 完全なポストデータ
    original_posts_by_user: Arc<DashMap<i64, VecDeque<TinyPost>>>,  // user_id -> オリジナル投稿
    secondary_posts_by_user: Arc<DashMap<i64, VecDeque<TinyPost>>>, // user_id -> リプライ/RT
    video_posts_by_user: Arc<DashMap<i64, VecDeque<TinyPost>>>,     // user_id -> 動画投稿
    deleted_posts: Arc<DashMap<i64, bool>>,                         // 削除済み投稿
    retention_seconds: u64,                                         // 保持期間
    request_timeout: Duration,                                      // リクエストタイムアウト
}

#コンポーネント間の通信フロー

リクエストフロー詳細
1
GetScoredPosts|ClientHome Mixer

クライアントからのフィードリクエスト

2a
Query Hydration (parallel)|Home MixerExternal

UAS, Stratoからユーザー情報取得

2b
GetInNetwork + Retrieve|Home MixerThunder/Phoenix

候補ソースから投稿取得 (並列)

3
Hydration (parallel)|Home MixerTES/Gizmoduck

候補データ補完

4
Pre-Scoring Filters|Home MixerInternal

内部処理 - 外部コール無し

5
Predict|Home MixerPhoenix

ML予測実行

6
Selection|Home MixerInternal

内部処理 - ソート + 切り詰め

7
VF Call|Home MixerVisibilityFiltering

可視性フィルタリング

8
Side Effects (async)|Home MixerStrato

キャッシュ更新 (非ブロック)

#MLモデルアーキテクチャ

Phoenix Ranking Model Architecture
OUTPUT LOGITS

[B, num_candidates, num_actions]

GROK TRANSFORMER (N layers)

Multi-Head Attention
  • - num_q_heads: Queryヘッド数
  • - num_kv_heads: Key/Valueヘッド数 (GQA対応)
  • - Rotary Position Embedding (RoPE)
  • - Candidate Isolation Attention Mask
Dense Block (FFN)
  • - Linear V: [D] → [ffn_size]
  • - Linear W1 + GELU: [D] → [ffn_size]
  • - Element-wise multiply
  • - Linear: [ffn_size] → [D]

INPUT CONSTRUCTION

[User: 1, D]+[History: S, D]+[Candidates: C, D]
HASH-BASED EMBEDDINGS

Multiple hash functions → embedding lookup → concat → project

Candidate Isolation Attention Mask

候補同士が互いを参照できないようにする特殊なアテンションマスク:

User + History

双方向アテンション (互いに参照可能)

Candidates → Context

候補はユーザーコンテキストを参照可能

Candidates → Candidates

候補間は参照不可 (自己参照のみ)

Benefits:
  • - スコアの一貫性: 候補のスコアがバッチ内の他の候補に依存しない
  • - キャッシャビリティ: 同一 (user, candidate) ペアは常に同じスコア
  • - 並列推論: バッチサイズを任意に変更可能
Phoenix Retrieval Model (Two-Tower)

USER TOWER

  • - Grok Transformer (候補分離なし)
  • - Mean Pooling over valid positions
  • - L2 Normalization
  • - 出力: user_representation [B, D]

オンラインでリアルタイム計算

CANDIDATE TOWER

  • - Hash Embeddings (post + author)
  • - MLP Projection (2-layer + SiLU)
  • - L2 Normalization
  • - 出力: corpus_embeddings [N, D]

オフラインで事前計算、インデックス化

Retrieval:dot(user_emb, corpus_emb.T) → ANN search (FAISS, ScaNN)

#運用考慮事項

スケーラビリティ

コンポーネントスケーリング戦略
Home Mixer水平スケーリング(ステートレス)
Thunderシャーディング(ユーザーID範囲)
Phoenix PredictionGPU クラスタ、バッチ処理
Phoenix RetrievalANN インデックス + レプリカ
レイテンシバジェット (P99 Target)
Total Request< 200ms
Query Hydration
parallel~20ms
Candidate Sources
parallel~30ms
Hydration
parallel~30ms
Pre-Scoring Filters
sequential~10ms
Phoenix Scoring
GPU~80ms
Weighted/Diversity
CPU~5ms
Selection
sort~2ms
Post-Selection
VF call~20ms

エラーハンドリング戦略

ステージ失敗時の動作
Query Hydrationエラーログ記録、デフォルト値で続行
Thunder Sourceスキップ、Phoenix のみで続行
Phoenix Sourceスキップ、Thunder のみで続行
Hydration部分データで続行
Phoenix Scoringキャッシュスコア使用、または 0 スコア
VF Filter全候補通過(フェイルオープン)

設定パラメータ

パラメータデフォルト値説明
MAX_POST_AGE172800s (2日)投稿の最大経過時間
RESULT_SIZE50返却する投稿数
MAX_POSTS_TO_RETURN1500Thunder から取得する最大投稿数
MAX_INPUT_LIST_SIZE5000フォローリストの最大サイズ
RETENTION_SECONDS172800sThunder の投稿保持期間

Copyright 2026 X.AI Corp. - Licensed under Apache License 2.0