xAIのx-algorithm更新でXのFor Youフィードが手元で少し動かせるようになった
目次
xAIの x-algorithm が2026年5月15日に更新されていた。
XのFor Youフィードを動かす推薦システムの公開リポジトリで、1月20日の初回公開からコミットは2本だけ。
今回のコミットはREADME上でも「May 15th, 2026」更新として扱われている。
Grokをチャットモデルや画像生成APIとして見る話とは別に、XのフィードではGrok系Transformerが推薦モデルとして使われている。
このブログでは以前、Grokを含むLLM安全フィルタの違いやGrok ImagineのAPI価格に触れたが、今回はユーザーに何を見せるかを決める側のコードだ。
1月版は構造説明に近かった
初回公開時点の x-algorithm は、For Youフィードの全体像を読むには十分だった。
in-networkのThunder、out-of-networkのPhoenix Retrieval、Home Mixer、Candidate Pipelineという構成が見えていた。
ただ、実際に手元で試すには欠けているものが多かった。
Phoenixは検索とランキングの2段階モデルとして説明されていたが、モデル成果物と一体で「この入力からこの候補を出す」まで流せる形ではなかった。
READMEの差分を見ると、今回の更新は説明の追記だけではない。
grox/、home-mixer/ads/、多数のhydrator/source、phoenix/run_pipeline.py、Git LFS扱いのPhoenix成果物が増えている。
graph TD
A[For Youリクエスト] --> B[Home Mixer]
B --> C[Query hydrators]
C --> D[Thunder<br/>フォロー中アカウントの投稿]
C --> E[Phoenix Retrieval<br/>グローバル候補検索]
D --> F[Candidate hydrators]
E --> F
F --> G[Filters]
G --> H[Phoenix ranker]
H --> I[Weighted scorer]
I --> J[Ads blender]
J --> K[Visibility filters]
K --> L[フィード応答]
この図のうち、1月版でも概念としては読めた部分が多い。
5月版で変わったのは、Phoenixの小さな実行経路と、Home Mixerの周辺処理がコードとして太くなった点だ。
Phoenixはスポーツコーパスで検索からランキングまで流す
phoenix/README.md には、公開版Phoenixの性格がかなりはっきり書かれている。
本番モデルそのものではなく、同じリアルタイムエンゲージメントデータで訓練されたmini版。
本番はより大きなモデルで継続学習され、公開版はある時点の凍結チェックポイントとして扱われる。
成果物には sports_corpus.npz が含まれる。
これはSportsトピックで絞った約53.7万件の投稿IDを6時間分集めたデモ用コーパス。
example_sequence.json には、NFL、NBA、NHLの投稿に対する例のユーザー行動履歴が入る。
実行経路はこうなる。
ユーザー履歴をエンコードし、事前計算済みの候補表現との内積で上位候補を取り、ランキングモデルでfavorite、reply、repost、dwell、video viewなどの確率を出す。
デフォルトでは検索でtop 200を取り、表示用にtop 30を出す。
cd phoenix
unzip artifacts/oss-phoenix-artifacts.zip -d artifacts/
uv run run_pipeline.py --artifacts_dir artifacts/oss-phoenix-artifacts
実行可能になった範囲は「Xの全フィード再現」ではなく「Phoenixの検索とランキングの縮小デモ」だ。
公開成果物はREADME上で約3GBとされ、埋め込みテーブルが大半を占める。
ユーザー、投稿、authorの語彙はそれぞれ100万で、ハッシュ埋め込みを使ってID空間を表現に落としている。
rankingで候補同士を見せない
Phoenixのrankingで目を引くのはcandidate isolation。
候補投稿はユーザー情報と履歴にはattentionできるが、別の候補投稿にはattentionしない。
候補Aのスコアが、同じバッチに候補Bが入っているかどうかで変わらないようにする設計だ。
これは推薦システムではけっこう実務的な話になる。
候補同士を見せると、ランキングモデルはバッチ全体の文脈を使える。
その代わり、同じ投稿でも同席した候補次第でスコアが変わり、キャッシュやデバッグが難しくなる。
公開READMEは、この設計を「score for a post doesn’t depend on which other posts are in the batch」と説明している。
Xのフィードでは、候補生成、除外、広告混合、可視性フィルタが何段も挟まる。
ランキングスコアを候補単体に寄せておくと、後段で候補集合が変わっても扱いやすい。
Groxはフィード前後の理解タスクを担う
今回増えた grox/ は、Phoenixのランキングモデルそのものではない。
spam検出、post category分類、PTOS policy enforcement、reply ranking、multimodal post embeddingなどのタスクが入っている。
ASR処理、Kafka loader、Strato loader、task dispatcherも含まれていて、投稿を理解して注釈や埋め込みを作る側のコードに見える。
For Youフィードを「ランキングモデルだけ」と見ると、この部分を落としやすい。
実際の候補にはテキスト、画像、動画、返信、引用、言語、ブランドセーフティ、ポリシー分類が付く。
Phoenixが確率を出す前に、候補をどの状態で渡すかを決める処理がかなりある。
5月版ではHome Mixer側にもhydratorが増えた。
engagement counts、language code、media detection、quote post expansion、mutual follow score、brand safety signalなどが追加されている。
「手作り特徴量を消した」とREADMEに書かれていても、投稿やユーザーの周辺情報を集めるコードは残る。
広告混合まで公開コードに入った
home-mixer/ads/ が増えたのも今回の更新点だ。
organic候補と広告候補を混ぜる partition_organic_blender、広告間隔を扱う safe_gap_blender、広告注入ログのside effect、brand safety hydratorが追加されている。
ここはクリエイター向けの「アルゴリズム攻略」記事が雑に扱いがちな部分でもある。
推薦モデルが投稿のエンゲージメント確率を出しても、最終フィードには広告、可視性フィルタ、重複排除、既読履歴、muted keyword、blocked user、served historyが入る。
モデルの好みだけを読んでも、実際に画面へ出る順番とは一致しない。
公開コード上でも、post-selectionのvisibility filterが最後にある。
削除済み、spam、violence、goreなどの判定はランキング後にも適用される。
「Grokが好きそうな投稿を作る」だけで説明できるほど単純なパイプラインではない。
公開されたものと残っている穴
Phoenixの縮小パイプラインを手元で流せるのが1月版との大きな差分だが、公開版だけで本番For Youフィードを再現できるわけではない。
本番Phoenixは公開mini版より大きく、継続学習されている。
公開コーパスはSportsトピックの6時間分で、X全体の投稿集合ではない。
重み、実験設定、feature flag、ライブのポリシー分類、広告配信側の制約も本番とは切り離されている。
今回の公開版は、そのうちPhoenixの小さな断面とHome Mixer周辺のかなり具体的な断面を触れるようにしたものだ。