そもそも何の話か
Xの「For You(おすすめ)」タイムラインに、どの投稿がどの順番で表示されるかを決めているプログラムの中身が、2026年8月にX(開発元のxAI社)から一般公開されました。今までは「秘密のレシピ」だったものが、誰でも読めるようになったということです。今回はその中身を実際に読んで、仕組みと最近の変更点をまとめました。
おすすめが表示されるまでの4つのステップ
雑誌の編集部が、読者一人ひとり専用の号を毎回作っていると想像してください。
ステップ1: 候補を集める まず「あなたがフォローしている人の最新投稿」と「あなたが興味を持ちそうな、フォローしていない人の投稿」を集めてきます。後者は、あなたの過去の行動(いいねした投稿、長く見た投稿など)と似た傾向を持つ投稿をAIが探してきます。
ステップ2: それぞれに点数をつける 集めた投稿一つひとつに対して、「あなたがこの投稿に、いいねしそうか」「返信しそうか」「シェアしそうか」「逆に、興味ない/ブロックしそうか」をAIが予測し、点数化します(詳しくは次の章)。
ステップ3: 点数順に並べて、少し調整する 点数の高い順に並べますが、そのままだと同じ人の投稿ばかりになったり、似たような投稿が続いたりするので、
- 同じ人の投稿が連続しないよう、2つ目以降は少し点数を割り引く
- フォローしていない人の投稿は少し控えめにする
- 逆に、まだあまり見られていない新しいアカウントの投稿は多少押し上げる
- 内容が似た投稿が並ばないよう、最後にもう一度シャッフル
といった微調整が入ります。
ステップ4: 最後に「表示していいか」の審査 点数とは全く別の仕組みで、「この投稿はそもそも表示していいものか」という審査が入ります。スパム、成人向けコンテンツ、規約違反アカウントなどはここで弾かれます。「点数が高い=必ず表示される」ではなく、点数付けと表示可否の審査は別チームの別プログラムが担当している、というのがポイントです。
点数のつけ方(AIは何を「良い投稿」と考えているか)
AIは「あなたがその投稿に対してどんな行動を取りそうか」を予測し、行動の種類ごとに重要度(重み)をかけて足し合わせます。目安として、下の表のようなイメージです(数字は「他の行動と比べてどれくらい重要視されるか」の比率で、実際の得点そのものではありません)。
| あなたがしそうな行動 | 重要度の目安 |
|---|---|
| リンクをコピーしてシェアする | とても高い |
| DMで送る/返信する | 高い |
| フォローする | 高い |
| リポスト/シェア | やや高い |
| いいね | 普通 |
| クリックする | 普通〜低い |
| 「興味ない」を押す/ミュート/ブロック/通報する | マイナス(大きいほど強く順位を下げる) |
ここで大事な注意点があります。この「重要度」は、あなたが実際にとった行動の”回数”にかかるのではなく、AIが予測した”確率”にかかります。 よく誤解されるのですが、「通報の重要度がいいねの何百倍もあるから、通報1件でいいね数百件分を打ち消せる」という話ではありません。単純に、通報という行動自体がもともと滅多に起きないため、AIの予測に意味を持たせるには重要度を大きくする必要がある、というだけの話です。開発元自身がこの誤解を防ぐため、コードにわざわざ注意書きを添えています。
最近何が変わったか(2026年7月〜8月)
① お互いにフォローし合っている相手への返信が届きやすくなった 7月に「相互フォロー(お互いにフォローし合っている)関係にある人」が投稿した、通常の投稿(返信やリポストではないもの)について、「あなたが返信しそうか」の重要度を通常より大きく見積もる調整が入りました。狙いは、親しい関係にある相手同士の会話がタイムラインに出やすくなること。最初は影響が大きすぎたため、7月後半に少し弱める調整も行われています。
② ブラジルの選挙関連の対応 2026年のブラジル選挙に合わせ、ブラジルの選挙裁判所に通報されたアカウントの投稿は、そのアカウントをフォローしていない人には表示しない、という現地法対応のフィルターが追加されました。
③ 「不正な多重アカウントの自作自演で得できるか」について 別のアカウント(同じIPアドレスや同じ電話番号で登録したもの)を使って自分の投稿を引用したりリアクションしたりしても、点数を計算する仕組みの中には「同じIP/電話番号だから加点する」というルールは見当たりませんでした。点数は「その投稿を見ている本人がどう反応しそうか」だけで決まるため、他人(別アカウント含む)が何をしたかは基本的に影響しません。
一方で、Xには不正行為やなりすましを見つけるための別の監視の仕組みもあり、そちらでは「同じアカウントが短時間に不自然なほど連続して行動している」「同じ投稿ばかりに異常に集中している」といった”人間らしくない行動パターン”を検知の手がかりにしていることが確認できました。ただし単に「同じネット回線(IP)を毎回使っている」だけであれば、それは普通の利用者の大半に当てはまることなので、それ自体が問題視されるわけではありません。
完全にはわからない部分もある
公開されたのはあくまで大部分であって、全部ではありません。悪用されるリスクがある一部の判定ルール(不正の見分け方の細かい基準など)や、AIモデルの学習結果そのもの(具体的にどれくらい賢く判断できるかの中身)は、非公開のままです。「仕組みの大枠は公開されたが、細かい”さじ加減”は依然としてブラックボックス」というのが正確なところです。
X「For You」アルゴリズム アップデート仕様まとめ
対象リポジトリ: xai-org/x-algorithm 確認基準日: 2026年8月16日(最新コミットは2026年8月14日付)
1. 今回のアップデートで公開・変更された内容
リポジトリのREADMEが明記している直近2回の更新内容。
2026年8月14日
| 変更 | 内容 |
|---|---|
| 重みの解釈に関する補足 | home-mixer/params/param.rsとhome-mixer/scorers/ranking_scorer.rsにコメントを追加。重みは「行動の生の回数」ではなく「予測確率」にかかる係数であることを明記(詳細は本書3節)。 |
| ブラジル2026年選挙対応 | Brazil2026ElectionFilterを追加。ブラジル選挙裁判所に通報されたアカウントの投稿を、フォロワー以外には表示しないフィルター。ブラジル選挙法対応。実装はhome-mixer/filters/brazil_2026_election_filter.rs。 |
2026年8月13日
| 変更 | 内容 |
|---|---|
| 主要パラメータの公開 | 各アクションの重み、home-mixer/params/param.rsの設定値を追加。 |
| 可視性フィルタリング系の公開 | 投稿を表示/非表示/インタースティシャル化するvisibility-filtering/一式を公開。 |
| ラベル生成システムの公開 | botmaker/・botmaker-rules/・scarecrow/(ルールベースのラベル付け)、agatha/・bdsm/・user-cred-v2/(アカウントスコアリング)、media-model-proxy/・clip/(画像/動画分類)、abuse-enforcement-service/(凍結等の処分実行)を公開。 |
| Phoenixモデルの実体公開 | それまでのサンプル実装(Grok-1移植版)を廃止し、実際に学習・推論に使われているJAXコードとRustサービング層そのものを公開。合成データ生成コードも同梱し、手元で学習〜推論まで再現可能。 |
| SimClusters公開 | フォロー外アカウントの投稿を拾う追加のリトリーバル経路simclusters/を公開。 |
| Under the Hood透明化ツール | 自分のアカウント・投稿に付与された可視性関連ラベルを確認できるツールを試験公開(x.com/i/under_the_hood)。 |
実例として提示されている過去の変更: 相互フォロー返信ブースト
READMEが「今後の更新もこういう形でdiffとして追える」という具体例として載せているケース。
| 日付 | 変更内容 |
|---|---|
| 2026年7月10日 | 相互フォロー関係にある著者への返信重みブーストをA/Bテスト開始。値は0/5/10/15/20を一部ユーザーにランダム割当(大半のユーザーは0=ブースト無し)。同時に滞在時間ブーストもテストしたが、これは広くは採用されず。 |
| 2026年7月13日 | 初期結果が良好だったため、多くのユーザーにブースト値20を展開。並行して0/5/10/15での実験は継続。 |
| 2026年7月24日 | ワールドカップ関連投稿がフォロー外中心だったことへの反応を受け、ブースト値を20から15に調整(現行のデフォルト値)。 |
このブーストは「相互フォローしている著者のオリジナル投稿(返信・リポストではない)」にのみ適用され、返信予測確率への加算重みという形で効く(bidirectional_boost_eligible関数で判定)。
2. パイプライン全体構成
リクエストはhome-mixer/が受け、以下の順で処理される。
- クエリ・ハイドレーション — 直近の行動履歴、フォローリスト、ブロック/ミュート等を取得
- 候補ソース(並列取得) — イン・ネットワーク(
thunder/=フォロー中アカウントの最新投稿)とアウト・オブ・ネットワーク(phoenix/のリトリーバルモデル、simclusters/のクラスタ類似度) - 候補ハイドレーション — 投稿本文・著者情報・エンゲージメント数などを付与
- 事前フィルター — 重複、48時間超過、自分の投稿、ブロック/ミュート対象、既読投稿などを除外
- スコアリング —
PhoenixScorerが各アクションの予測確率を算出し、RankingScorerが重み付き和を計算、VMRankerが多様性のための並べ替えを行う - 選定 — スコア上位K件を採用
- 選定後フィルター — 可視性フィルタリングの判定(表示/インタースティシャル/非表示)を反映
この後段でブレンディングパイプラインが広告・Who to Follow・プロンプトを混ぜ込む。
3. スコアリング仕様
3.1 基本式
Final Score = Σ (weight_i × P(action_i))
P(action_i)はPhoenixモデルがそのビュワー・投稿の組み合わせについて予測した確率(または滞在時間などの連続値)。重みは生のエンゲージメント数ではなく、この予測確率にかかる係数。「reportの重みはlikeの468倍だから、report1件でlike468件分が相殺される」という読み方はコード側のコメントで明示的に否定されている誤解。reportの基準発生率がlikeより1000倍以上低いため、モデルの予測を最終順位に反映させるにはこの程度の重みが必要、という設計。
3.2 デフォルト重み一覧(home-mixer/params/param.rs)
| アクション | 重み | 分類 |
|---|---|---|
| Reply | 5.0(相互フォロー著者のオリジナル投稿は+15.0) | 正 |
| Share via Copy Link | 20.0 | 正 |
| Share via DM | 5.0 | 正 |
| Quote | 5.0 | 正 |
| Share | 2.0 | 正 |
| Follow Author | 4.0 | 正 |
| Retweet | 1.0 | 正 |
| Click | 0.4 | 正 |
| Open Link | 0.2 | 正 |
| Favorite | 0.5 | 正 |
| Photo Expand / Video Open / VQV / Quoted Click | 0.05 | 正(小) |
| Post Unexplored | 0.02 | 正(探索促進) |
| Continuous Dwell Time | 0.004 | 正(連続値) |
| Not Dwelled | -0.02 | 負 |
| Not Interested | -43.2 | 負 |
| Block Author | -31.2 | 負 |
| Mute Author | -58.8 | 負 |
| Report | -234.0 | 負 |
3.3 スコア確定後の3つの補正
| 補正 | 内容 | デフォルト値 |
|---|---|---|
| オーサー多様性 | 同一著者の2投稿目以降をdecay^kで減衰、下限あり | decay=0.5、floor=0.25 |
| アウト・オブ・ネットワーク割引 | 非フォロー投稿(+フォロー中著者の返信/リポストも条件次第)を割引 | 係数0.75(トピック指定時は0.5) |
| 新規著者ブースト | インプレッションが閾値未満の著者を目立つ位置まで押し上げ | 閾値1000インプレッション、投稿24時間以内 |
この後vm-ranker/が行列式点過程(DPP)で最終並べ替えを行う(theta=0.65、対象は上位150件)。似た投稿の連続を避けるため、多少スコアを犠牲にして多様性を確保する。
4. Phoenixモデルの仕様
| 項目 | ランキング(本番) | リトリーバル(本番) |
|---|---|---|
| 埋め込み次元 | 2560 | 1024 |
| Transformer層数 | 8 | 8 |
| Query/KVヘッド(GQA) | 20 / 4 | 16 / 4 |
| 履歴シーケンス長 | 1022 | 1023 |
| 候補シーケンス長 | 64 | 64 |
| セマンティックID | 6階層×256コード | 6階層×256コード(候補の識別子) |
| 離散アクション種別数 | 64 | 64(正例はfavorite) |
設計上の要点は「候補分離」で、候補投稿同士は注意機構上で互いを参照できず、ユーザーと行動履歴のみを見る。これによりスコアがどの投稿と同時に採点されたか(バッチ構成)に依存せず、キャッシュ可能になる。埋め込みはハッシュベース(語彙管理不要)に加え、投稿のマルチモーダル埋め込みを量子化したセマンティックIDを用いることで、学習時に存在しなかった新規投稿にも汎化が効く。
5. 可視性フィルタリングと不正検知系(今回のアップデートで公開された範囲)
ランキング(順位付け)と可視性判定(表示可否)は別レイヤーという設計。visibility-filtering/がALLOW/INTERSTITIAL/DROPを判定し、判定材料となるラベルは以下が生成する。
agatha/— ブロック・報告比率などからアカウントを評価するオフラインバッチジョブbdsm/— 時系列の行動パターンから不正・不正行為らしさを推定するモデルuser-cred-v2/— フォロー・エンゲージメントグラフ上のPageRankでアカウント信頼度を算出scarecrow/+botmaker/— イベント駆動でルールベースにラベルを付与するエンジンabuse-enforcement-service/— 上記スコア・ラベルを読み、ラベル付与・アカウント凍結等を実行
補足Q&A(本セッションで確認した内容)
引用ポストを別アカウント(同一IP・同一電話番号で登録)から行った場合の加点について確認したところ、ランキング側のコードにそうした加点ロジックは見つからなかった。引用の重み(5.0)はビュワー本人の予測確率にかかる係数であり、誰が引用したかは影響しない。引用数などの生カウントもnew_user_min_engagement_filter(新規著者の表示可否の足切り)以外には使われていない。
逆に、IPアドレスはbdsmの特徴量(uniq_ips=アカウント自身の行動履歴内でのIP多様性)として不正検知モデルの入力に使われており、電話番号ベースの関連性グラフ(PhonebookGraph)もagathaの特徴量ソース定義に存在する。ただし同一IPの反復利用そのものは大半の実ユーザーに共通する自然なパターンであり、単独では不正シグナルにならない。モデルが反応しやすいのは、短時間のバースト、同一対象への異常な集中、機械的に規則的なタイミングといった行動パターン。複数アカウントを横断してIP・電話番号で結びつける具体的な突合ロジックは、READMEが「ゲーミング防止のため一部非公開」としている範囲に含まれる可能性が高く、公開コードからは確認できなかった。
6. このリポジトリで確認できない範囲(限界)
- Groxの分類器が使う具体的なLLMプロンプト(j2ファイル)は非公開
- 一部のbotmakerルール(複数アカウントの結託検知など、悪用されやすい判定ロジックを含むと推測される)は非公開
bdsm・agatha等の不正検知モデルの学習済み重み・閾値は非公開(アーキテクチャのみ公開)param.rsの値は「本番環境の値に同期するcronスクリプトがある」との記載のみで、参照時点と実際の本番値に数日単位のズレが生じ得る(確認したコミットのコメントには2026-08-12同期と記載)


コメント