Part 0
読み方と全体像
このアルゴは5つの部品でできている。Home Mixer(司令塔)が Thunder(フォロー中の即時在庫)と Phoenix(フォロー外をAIで探す+採点)から候補を集め、Grox(Grokが投稿を読んで品質・安全を判定)の信号を使い、Candidate-Pipeline(共通の処理枠)の上で流す。
透明性の線引き(最初に固定):公開されているのは ①全部品のロジック(コード)②学習済み“小型”モデル(凍結スナップショット)。公開されていないのは ①本番の重みの実数値(外部feature switch注入)②本番の大型モデル本体③学習データ全体。=構造は確定、倍率は非公開。本書は確定情報を「📄」、そこからの実戦翻訳を「🎯」で必ず分けます。
Part 1 — Home Mixer
① おすすめが組まれる4工程と全部品
工程1:Query Hydration(その人の文脈を集める)
📄 GitHubに書いてあること
リクエスト時に
22種のquery hydratorを並列実行し、見る人の文脈を組む:エンゲージ履歴(user_action_seq)、フォロー中ユーザID、ミュート/ブロックID、購読ユーザ、フォロー中のGrok topic/starter pack、推論されたGrok topic、相互フォローグラフ、過去リクエスト時刻、served履歴、impression bloom filter(既読の超軽量記録)、IP、推論された性別・属性。
🎯 X運用での使い方
アルゴは見る人の
「最近の行動履歴」と「フォローグラフ」を主材料にする。=あなたの投稿は「あなたに過去反応した人に似た履歴の人」へ配られる。だから
狙った層に最初の1反応をさせることがすべての起点(履歴が書き換わる)。属性・性別も推論材料に入るが操作不能、無視してよい。
工程2:Sources(候補をかき集める)
📄
12種のソースを並列実行:
thunder_source(フォロー中の即時投稿)、
phoenix_source/
phoenix_moe_source(AIで探すフォロー外、MoE版)、
phoenix_topics_source(topic面)、
ads_source(広告)、
who_to_follow_source(おすすめユーザ)、
prompts_source(プロンプト系)、
cached_posts_source、
push_to_home_source(即時注入)、
tweet_mixer_source。
🎯
あなたの投稿が他人に届く経路は実質2つ:
(A) フォロワーへ=thunder、
(B) フォロー外へ=phoenix(AIお見合い)。(B)に拾われない限り新規リーチは無い。
push_to_home_sourceの存在=
高初速の投稿はリアルタイムで即注入され得る=出した直後の数十分の初速が"再注入"の点火に直結。
工程3:Candidate Hydration(候補に付箋を貼る)
📄
21種のcandidate hydrator:core data(本文/メディア)、著者情報、エンゲージ数、メディア有無、言語コード、引用展開、相互フォローJaccardスコア、動画尺、購読状態、
ブランドセーフティ(×2)、VF(可視性)、ブロック関係、フォロー中の返信者。
🎯
「動画尺」「言語コード」「メディア有無」が採点前に付与=
動画は尺が、言語は一致が後工程の判定材料。ブランドセーフティ判定が候補段階で付くので、
センシティブ判定された投稿は広告隣接から外れリーチも痩せる(後述)。
工程4:Filters(足切り)→ Scorers(採点)→ Selector(選抜)→ Ads → Post-Filters → SideEffects
📄 フィルタ全19種
採点前:重複除去 / core取得失敗除去 /
AgeFilter(古い投稿=候補から除外・カットオフ秒数は非公開)/ 自分の投稿除去 / RT重複除去 / 課金不可除去 / 既読除去(×2)/ session内served除去 / ミュートKW除去 / ブロック・ミュート著者除去 / topic絞り(×2)/ 動画条件。
選抜後:VFFilter(削除・スパム・暴力・グロ等を除去)/
DedupConversationFilter(同会話の枝を1本に間引き)。
SideEffect 16種:Redis候補キャッシュ、seen IDをKafka publish、served履歴更新/truncate、phoenixリクエストキャッシュ、client events Kafka、reranking Kafka、ads injection logging 等(=結果が次回ループの燃料に戻る)。
🎯
⑴
古い投稿は独りでに他人のおすすめへ再投入されない(後伸びは引用/RT/検索での"再注入"経由)。⑵
既読は同じ人へ再表示なし=1投稿×1ユーザーは初回が勝負(おすすめ面の話。検索/引用は別管轄)。⑶
ミュートKW・ブロック著者は採点前に消滅=そのジャンルでミュートされやすい語を含むと土俵に乗らない。⑷
同じスレッドの枝を量産しても1本に間引かれる。
Part 2 — Ranking Scorer (Rust)
② 採点エンジンの中身(本番処理)
📄 採点式(home-mixer/scorers/ranking_scorer.rs)
点 = Σ(wᵢ × P(アクションᵢ))。各アクションに
専用の重みスロットが個別に実在:
プラス:favorite / reply / retweet / quote / quoted_click / photo_expand / click / profile_click / vqv(動画品質視聴)/ quoted_vqv / share / share_via_dm / share_via_copy_link / dwell / cont_dwell_time(滞在秒・連続)/ cont_click_dwell_time / follow_author
マイナス:not_interested / block_author / mute_author / report / not_dwelled(スルー)
重みの実数値は
params.get(FavoriteWeight) 等で
外部feature switchから実行時注入=リポジトリに無い。
🎯
点は
独立ルートの足し算。いいね一点突破は構造的に不利、
複数ルート同時(返信+滞在+DM共有+プロフ→フォロー)が強い。DM共有・引用・フォローが別レバーなのは確定(専用スロット実在)。「いいねの何倍効くか」は
誰にも読めない=重み数値を断言する解説は全部憶測。
負スコアの潰し方(offset_score)
📄
負の合計が正を上回ると、点が
(combined + negative_sum) / total_sum × NEGATIVE_SCORES_OFFSET で
強く下方リスケールされる(係数値は非公開)。
🎯
ネガ予測が一定を超えた瞬間、投稿は線形でなく
崖のように沈む。"少し炎上気味でもインプレ稼げる"は誤り=閾値を越えると一気に埋もれる。
同一著者の減衰(Author Diversity)
📄
1フィード内、スコア降順に走査し著者ごとに出現位置をカウント。倍率
=(1−floor)×decay^position+floor。2回目以降が指数減衰、floorで下げ止まり。decay/floor値は非公開。
🎯
短時間連投は2発目から自分で自分を潰す。1日数発・間隔を空けて各発を強く。連投はThunder上限(後述)でも過去の良投稿を押し出す=二重で損。
フォロー外減点(OON)と新規ユーザー例外
📄
out-of-network は点に1未満係数を乗算。分岐:topic面リクエスト→
TopicOonWeightFactor/
新規ユーザー(アカウント年齢<閾値 かつ フォロー数≥下限)→緩い NEW_USER_OON_WEIGHT_FACTOR/通常→
OonWeightFactor。全値非公開だが分岐の存在は確定。
🎯
フォロー外リーチは構造的ハンデ。
例外=新規Xユーザー/topic面は減点が緩い。W杯(6/13)など新規流入が増える瞬間="届きやすい層"が一斉増=
最大の突破窓。投稿をSports topicに明確に乗せる(Groxに判定させる、後述)と topic面係数の恩恵。
Part 3 — Phoenix (Python/JAX)
③ AI本体:探し方と採点の仕組み
retrieval=Two-Tower(フォロー外のお見合い)
📄 recsys_retrieval_model.py
ユーザー(履歴)と投稿を同じベクトル空間へ→
L2正規化して内積でTop-K(デモ既定200件)。投稿側は2層MLP(SiLU)射影→正規化。in-batch負例64。投稿ベクトルは
過去に誰がどう反応したかで形成(IDハッシュ埋め込み・本文テキストは入力しない)。
🎯
⑴
テーマ一貫が命:ブレると投稿ベクトルが特定クラスタに刺さらず誰にも配られない。⑵
初回反応の複利:狙った層が一度反応→その人の履歴ベクトルが書き換わり以後あなたの系統が届く。⑶
未投稿の草稿をこのモデルに入れても点は出ない(IDハッシュ式・本文非入力)="事前採点アプリ"はこのモデル直結では不可、別設計が要る。
ranking=Candidate Isolation Transformer
📄 recsys_model.py(grok-1移植)
入力=ユーザー+履歴(投稿+著者+アクション+product_surface)+候補。
アテンションマスクで候補同士はattend不可(ユーザー/履歴のみ参照)。出力=候補×アクションのlogit→sigmoidで確率。
num_actions=19(run_pipeline命名:1=fav,4=reply,5=quote,6=RT,11=dwell,13=動画品質視聴)。post_age粒度60分・product_surface語彙16。
鮮度は最大4800分=80時間(3.3日)までバケット表現しそれ以降はoverflow=モデルが"古い"とみなす上限の目安。連続アクション8種・
滞在時間は正規化上限30で頭打ち(30超の長滞在は追加加点が飽和)。負フィードバックは負例上でマスク。
🎯
あなたの投稿の点は
競合の顔ぶれに左右されない(純粋に投稿×その人)。"強い投稿が同時にいたから埋もれた"は起きない=言い訳不能。post_ageが入力=
鮮度は採点要素(古いほど不利、ただし秒数非公開)。
OSSデモの重み(唯一読める具体数字・本番ではない)
📄 phoenix/run_pipeline.py にそのまま記述
デモ実行スクリプトの「結果を並べる行」に
weighted = P(fav)×1.0 + P(reply)×0.5 + P(RT)×0.3 + P(dwell)×0.2 とベタ書き。
コードに「例」とは書かれていないが、これは"動かして体験する"デモ用で、本番採点はRust側+feature switch(README記載)。デモは4アクションのみ。
🎯
本番の事実として「いいねは返信の2倍」とは言えない(デモの仮値)。使えるのは
「xAIがデモを書いた時の“ざっくり序列感”=fav>reply>RT>dwell」という参考まで。確実なのは数字でなく構造。
Part 4 — Thunder (Rust)
④ フォロワー配信の在庫庫
📄 thunder/posts/post_store.rs
Kafkaの
TweetCreate/DeleteEvent を消費するインメモリ在庫。ユーザー別に
原文/リプライ・RT/動画の3ストア。
retention_seconds 超過は
trim_old_posts()+auto_trimで削除。著者あたり上限定数あり(
MAX_ORIGINAL_POSTS_PER_AUTHOR等、値は外部)。狙いは外部DB不使用でサブミリ秒。
🎯
フォロワー配信は
保持期間と著者上限の世界。古い投稿はin-networkからも消える。連投すると上限で
自分の良い過去投稿が在庫から押し出される。=量より「間隔を空けて1発を強く」が構造的に正解。
Part 5 — Grox(最重要・運用直結)
⑤ Grok(画像も読むAI)が全投稿を読んで判定している
これがコードを全部読んで一番運用に効く発見。フィルタ語マッチではなく、Grok VLM が投稿の本文+画像を実際に読み、品質・安全・スパムを判定して信号を出す。temperatureはほぼ0(毎回同じ判定)。
(a) Banger(品質)判定 — banger_initial_screen.py
📄
Grok VLM が各投稿に
quality_score(0〜1)を付与。
閾値 quality_score ≥ 0.4 で「banger positive」。同時に
slop_score(低品質/AIスロップ度)、
has_minor_score(未成年安全)、
taxonomy_categories、
tags、
description、
is_image_editable_by_grok を出力。カテゴリ=BANGER_INITIAL_SCREEN/GROK_RANKER。
🎯
AIが投稿の"質"を0〜1で採点し、画像も見る。キーワード小細工は無意味。
slop_score=量産・薄い・AIっぽい投稿は機械的に低品質判定される。ミライマの投稿は「具体的な数字・固有名詞・独自の読み」を入れ slop と判定されない密度に。0.4が一つの目安。
(b) スパム判定(低フォロワー特化)— spam.py
📄
SpamEapiLowFollowerClassifier:
低フォロワーのユーザーを対象にGrok VLMがスレッドを読み spam/否を二値判定(spam=1.0)。カテゴリ SPAM_COMMENT。
🎯
新規・低フォロワーアカウントの投稿/リプライはスパム審査が特に厳しい。ミライマがシード/捨て垢的に量産すると spam 判定で沈黙させられる。シードは"低フォロワーでも中身のある人間的投稿"でないと逆効果=
@tpriadaisuki的な本物の活動が正しい。
(c) 安全ポリシー判定(PTOS)— safety_ptos.py
📄
Grok VLM(safety/critical系モデル)が投稿を
7つの明示ポリシーカテゴリで判定(reply-to文脈も読む):
ViolentMedia / AdultContent / Spam / IllegalAndRegulatedBehaviors / HateOrAbuse / ViolentSpeech / SuicideOrSelfHarm。2段(カテゴリ選別→該当ポリシー精査)。重大時は reasoning モデル(deluxe/4.2)で深掘り。
🎯 ミライマに直撃:IllegalAndRegulatedBehaviors
予測市場・射幸性表現は
このカテゴリでAIに精査され得る(しかも文脈・画像込みで)。「賭ける/当てる/一攫千金」等は規制行為連想で危険。=既存のPushコピー鉄則("予想/読み"へ言い換え、射幸ワード回避)は
このPTOS判定を避けるためにそのまま正しい。reply先文脈も読まれるので、煽りリプにぶら下がる形も危険。
(d) リプライ採点 — reply_ranking.py
📄
ReplyScorer:Grokが各リプライに
score(0〜3帯)を付与。systemプロンプトに
large_account_follower_threshold パラメータ(大型アカ閾値で扱いを変える設計)。
🎯
投稿に付くリプライ自体もAIで質採点され、良いリプが上に出る。=
ミライマ公式が良質リプ(鋭い予想・理由)をすると、その会話自体が浮上。他人の人気投稿への"中身あるリプライ"は露出経路になる(大型アカ閾値の特別扱いあり)。
Part5の結論:「アルゴ=数式」だけではない。投稿は出した瞬間、Grokという別のAIに本文も画像も読まれ、品質(quality≥0.4)・スロップ度・7安全カテゴリ・スパム(低フォロワー厳格)で値付けされる。小細工は通らず、"中身の密度"と"規制連想ワード回避"が機械的に効く。
Part 6 — Candidate-Pipeline
⑥ 共通処理基盤(運用には間接的)
📄
再利用trait:Source / Hydrator / Filter / Scorer / Selector / SideEffect。独立段は
join_all で並列、side effectは撃ちっぱなし、hydrator/scorerは候補単位で
Result=
1候補のエラーが他を巻き込まない。手作り特徴量ゼロ設計(README明記)。
🎯
運用直接の打ち手は無いが含意:
フォロワー数・認証バッジは順位の直接ブースト係数ではない(subscriptionはペイウォール判定フィルタであってブーストでない)。=
大型アカでなくても予測エンゲージが高い投稿は普通に勝てる。勝負は設計。
Part 7
⑦ 出ているもの/出ていないもの(誠実な限界)
| 項目 | GitHubに | 運用上の意味 |
| 4工程・全部品のロジック | ある | 構造ベースの打ち手は確定情報 |
| 採点式・重みスロット一覧 | ある | "どのアクションが独立に効くか"は確定 |
| Grox判定の閾値(quality≥0.4等) | 一部ある | 品質0.4目安・低フォロワーspam厳格は確定 |
| 学習済み"小型"凍結モデル | ある | 動かせるが本番より小型・一時点snapshot |
| 本番の重みの実数値 | 無い | 「いいねの何倍」は断言不能=憶測排除 |
| 本番大型モデル・学習データ | 無い | "なぜ高評価か"を条文で読む形では非公開 |
| AgeFilter等のカットオフ秒数 | 無い | "何時間で古い"は不明(ただしランキングモデルの鮮度表現は最大4800分=80時間でバケット) |
| Groxのプロンプト("良い投稿"の定義文) | 無い | grox.prompts.template・grok_sampler・grox.lm/config はimportのみで同梱なし="何を高品質とみなすか"の文面は非公開 |
結論:コードは透明だが説明可能ではない。「構造」は逆算できるが「倍率」も「Grokへの指示文」も逆算できない。だから本書の打ち手はすべて構造起点で、数値の断言はしない。
本書の網羅状況(正直版):フル精読=README×2/ranking・weighted・author_diversity・oon_scorer/age_filter/run_pipeline/recsys_retrieval_model/recsys_model(全680行)/post_store/grox banger・spam・safety_ptos・reply_ranking。構造把握どまり=grok.py・grox plans/tasks約40・hydrator/source/side_effect個別・candidate_pipeline本体。=運用を決める中核は精読済み、周辺orchestrationは構造把握。1行残らずではないが、判断に効くファイルは潰してある。
Part 8
⑧ X運用 総まとめ(全Partの確定レバー → ミライマ)
結論:裏ワザは原理的に存在しない(ルールでなくAI予測+AIによる本文/画像審査)。残るのは「実際に反応され、Groxに高品質判定される投稿を、初速をつけて、テーマを散らさず、間隔を空けて出す」だけ。
| 確定レバー(出典Part) | ミライマ公式の具体行動 |
| 返信を依頼(P2 reply独立スロット) | URL直貼り禁止。「あなたはどっち?理由も」で二択/賛否/理由要求。リンクは脇役 |
| 多ルート同時(P2 足し算構造) | 1投稿に「返信したい+友達にDMしたい+プロフ見たい」を同居。いいね単独狙いしない |
| 滞在を伸ばす(P2 dwell/連続秒) | 1行目フック→スレッドで読ませる。動画は十分尺(短尺はvqv加点ゼロ) |
| テーマ一貫+初回反応(P3 retrieval複利) | スポーツ×予測から散らさない。狙った層の最初の1反応を取りに行く |
| 初速(P1 push_to_home / P3 post_age) | 出した直後にコアファン即着火→引用/RT/検索での"再注入"の点火に |
| 新規ユーザー/topic窓(P2 OON例外) | W杯6/13に「完結説明型+reply装置型」を集中。Sports明示でtopic面に乗せる |
| Grox品質≥0.4・slop回避(P5 banger) | 具体数字・固有名詞・独自の読みで密度を出す。量産薄い投稿はAIが低品質判定 |
| PTOS規制連想回避(P5 IllegalAndRegulated) | 賭ける/当てる/一攫千金→予想/読み。煽りリプにぶら下がらない(reply先も読まれる) |
| 低フォロワーspam厳格(P5 spam) | シード垢の薄い量産は逆効果。本物の人間的活動で |
| 連投回避(P2 author diversity / P4 Thunder上限) | 1日数発・間隔を空ける。連投は自分の過去投稿も押し出す二重損 |
| ネガ先回り抑制(P2 offset / P5 PTOS) | 炎上っぽい見た目は通報前から沈む。閾値超えで崖落ち |
→ 図解で全体像:index / 運用要約1枚:playbook / 実装詳細:KNOWLEDGE.md
Part 9
⑨ 旧アルゴ(2023公開)との比較 ─ 何がどう変わったか
Twitterは2023年3月に github.com/twitter/the-algorithm を公開済み。両方を読み比べた忠実な差分です。
旧2023の構造(公式repo+当時ブログより)
📄 旧 the-algorithm
候補は約1,500件を複数ソースから:
in-network 約50%(Earlybird検索インデックス/RealGraph)+ out-of-network(
SimClustersコミュニティ埋め込み・TwHIN・
UTEG/GraphJetのグラフ巡回)。
Light Ranker→Heavy Ranker(約4,800万パラメータのNN)の2段。
TweepCred(PageRank系の著者評判スコア)。Visibility Filters・著者多様性・content balance・feedback fatigue・social proof 等の
人間が書いたヒューリスティック多数。Navi(Rust推論)・Product-Mixer。
📄 重みの所在(重要)
旧repoの
ScoredTweetsParam.scala に出る具体数は
ReplyScaleFactor=0.75/
OutOfNetworkScaleFactor=0.75 等の
係数のみ。有名な「いいね0.5/RT1.0/返信13.5/著者が返信したら75/プロフクリック12/動画0.005/ネガ−74」は
コードではなく当時のTwitter公式ブログの表で公表された値(=旧もエンゲージ重み本体はfeature switch外部化)。
※本セッションは旧ブログが403で一次再取得不可。上記は2023公表の周知値として記載。
新旧の差分
| 論点 | 旧 2023(the-algorithm) | 新 2026(x-algorithm) |
| 並べる根幹 | 人間が書いた重み付きルール+多数のヒューリスティック | Grok系transformerが学習で導出。手作りルール「一行残らず廃止」と明記 |
| 特徴量 | SimClusters/TwHIN/RealGraph/TweepCred等、人が設計した数百 | 手作り特徴量ゼロ。行動履歴のIDハッシュ埋め込みから直接学習 |
| 候補取得 | Earlybird+SimClusters+UTEG/GraphJet等の多数ソース | Thunder(in-network即時)+Phoenix Two-Tower(学習retrieval) |
| ランカー | Light→Heavy(〜48M NN)の2段 | Phoenix単一transformer+Candidate Isolation。鮮度を最大80時間でバケット表現 |
| 著者評判 | TweepCred(PageRank)が明示的に効く | 著者評判の手作りスコアは廃止。フォロワー数/認証は直接ブースト係数でない |
| コンテンツ審査 | Trust&Safetyの分類器(NSFW/abuse等) | Grox=Grok VLMが本文+画像を読み quality≥0.4/slop/7安全カテゴリ/低フォロワーspam を判定 |
| 攻略可能性 | ルール固定=逆算で攻略可("reply 13.5倍"が出回った) | ルール無し=決め打ち攻略が構造的に消滅。"実際に反応されるか"だけ |
| 透明性(重み) | コードは外部化だがブログが weight表を平文公開 | 同じく外部化、かつweight表の公式開示が無い=決定数値は実質より不透明 |
| 透明性(基準文) | Visibility基準等が比較的文章化 | "良い投稿の定義"はGroxプロンプトに在るがgrox.promptsは同梱なし=非公開 |
結論(何がどう変わったか):①ルール→AI予測に転換し、決め打ちの裏ワザが原理消滅。②著者評判(TweepCred)・コミュニティ埋め込み(SimClusters)など"人が設計した梯子"が撤去され、純粋に「その人が反応するか」勝負に。③審査が分類器→Grok本体(画像も読む)に格上げ=中身の質が機械評価される。④皮肉なことに攻略不能化と引き換えに、肝心の重み・基準文は2023より読めなくなった(昔はブログが教えてくれた)。運用結論は同じ:小細工でなく"本当に反応され・密度が高く・規制連想を避けた投稿を初速つけて出す"。