本文へ移動
Xアルゴリズム解体新書

検証

誤解の訂正

数字そのものは正しく引用されていることが多いのですが、意味の取り違えが広く定着しています。ひとつずつ、コードと突き合わせます。

14

  1. 01誤り

    リンクコピー1回で+20点入る。

    係数20が掛かるのは「この閲覧者がリンクコピーしそうな確率」であって、実際にコピーされた回数ではありません。確率3%なら寄与は0.6点です。

    スコア計算の実体は score.unwrap_or(0.0) * weight の一行で、score に入るのはPhoenixが出した予測確率です。実測のエンゲージメント数が係数に掛かる経路はコード上に存在しません。

    ranking_scorer.rs:447

  2. 02誤り

    通報1件でいいね468件ぶんが消える(-234 ÷ 0.5 = 468)。

    割り算が成立するのは、両方が同じ「回数」に掛かる場合だけです。実際はどちらも予測確率に掛かるので、通報の確率0.01%なら寄与は-0.023点にしかなりません。

    X自身がparam.rsのコメントで、通報の基礎発生確率はいいねの1000分の1以下であり、係数を大きくしないとランキングに影響できないと明記しています。係数の大きさは重要度ではなく、確率の低さを補正するためのスケールです。

    param.rs:279

  3. 03誤り

    大量通報を集めればアカウントを潰せる。

    推薦は閲覧者ごとに個別計算されるため、悪意ある通報は主に「その通報者に似た人」の画面にしか効きません。

    同じコメントに、ホームタイムラインで配信された投稿上の行動しかカウントされないとも書かれています。グループチャットでURLを共有して直接踏みに行った行動は、ランキングに一切入りません。

    param.rs:279

  4. 04半分正しい

    ブックマークが最強のシグナルだ。

    26項目に固定の係数はありません。ただしAIの予測ヘッドとしては存在し、閲覧者の行動履歴シグナルにも含まれ、投稿のブックマーク数もモデル入力に載っています。

    CLIENT_TWEET_BOOKMARK は予測ヘッドのindex 36として定義されていますが、ranking_scorer.rs の terms 配列(26要素)にブックマークの項はありません。「直接の点数はないが、間接的には効いている」が正確です。

    recsys.proto:266

  5. 05条件つき

    新人アカウントは全体的に優遇される。

    優遇は1リクエストにつき1件だけです。条件を満たす投稿の中から1件を選び、16位相当の点数まで引き上げます。掛け算のブーストではありません。

    実装は effective[best_idx] = effective[best_idx].max(target) の1行で、targetは降順ソート後の16番目のスコアです。条件は返信でない・リポストでない・著者フォロワー1000人以下・表示1000回未満・上位85%以内の全部です。

    author_cold_start.rs:306

  6. 06半分正しい

    リプライを増やせば伸びる。

    フォロワーには届きます。ただしフォロー外への拡散という意味では構造的にゼロです。

    フォロー外へ配るPhoenix Retrievalの投入判定で、isReply と isRepost は入口で無条件に除外されます。さらにスコア前のOONRetweetReplyFilterでも、フォロー外のリポスト・返信は改めて落とされます。

    phoenixRankAllCandidateProcessor.strato:443

  7. 07誤り

    シャドウバンでスコアをこっそり下げられている。

    点数を下げる仕組みはコードに存在しません。あるのは「フォロー外の面から除外する」という出し分けです。

    Visibility Filteringが返せるのは Allow / Drop / Interstitial の3値だけです。Downrank・Tombstone・Avoid はクライアント側のenumに定義こそありますが、それを生成するVFルールはリポジトリ内に1本もありません。

    mod.rs:159

  8. 08誤り

    相互フォローなら何を投稿してもブーストされる。

    対象はオリジナル投稿だけです。相互フォローでも、返信とリポストにはボーナスが付きません。

    ブースト条件は、返信先IDがない・リポスト元IDがない・相互フォロー著者である、の3つがすべて真の場合に限られます。また同時に走る滞在ブーストは既定値0.0で、完全なno-opです。

    ranking_scorer.rs:180

  9. 09誤り

    フォロワーになってもらえば、投稿は確実に届く。

    48時間の年齢制限、閲覧者のミュートキーワード、他人のブロック関係、既読判定は、いずれもフォロワーにも効きます。

    AgeFilterにはフォロー免除がなく、作成時刻が読めない投稿も安全側に倒して落とします。MutedKeywordFilterも免除がなく、課金購読者の画面からも消えます。しかも通知はなく、著者側から確認する方法もありません。

    age_filter.rs:19

  10. 10誤り

    滞在してもらえたかどうか(二値)が重要だ。

    二値の滞在ウェイトは0.0です。効いているのは連続値の滞在秒数で、1秒あたり+0.004です。

    DwellWeight の既定値は0.0、ContDwellTimeWeight が0.004です。連続値は0〜30秒でクリップされるため、30秒滞在で+0.12点が上限になります。逆に滞在しなかった場合は-0.02が入ります。

    param.rs:357

  11. 11誤り

    プロフィールクリックを取りにいくと効く。

    プロフィールクリックのウェイトは0.0で、標準の点数計算への直接の寄与はゼロです。

    ProfileClickWeight の既定値が0.0のため、予測ヘッドが存在してもスコアには乗りません。効くのは投稿経由の著者フォロー(+4.0)のほうで、プロフィールを開かせること自体ではありません。

    param.rs:338

  12. 12誤り

    良い投稿は時間をかけてじわじわ伸びる。

    48時間を過ぎた投稿は候補集合から完全に消えます。フォロワー向けの棚も、フォロー外の棚も、類似検索も、上限は同じ48時間です。

    AgeFilterのMAX_POST_AGEが48時間、Thunderのpost_retention_secondsが172800秒、SimClustersのANN_MAX_POST_CANDIDATE_AGE_HOURSが48で、3つの独立した仕組みが同じ壁を持っています。過去の投稿を掘り起こす経路は実装されていません。

    config.rs:36

  13. 13誤り

    同じタイミングに強い投稿があると、自分の投稿の点数が下がる。

    候補同士は互いを参照できない設計なので、同じバッチに何が入っていてもスコアは変わりません。順位で負けることはあっても、点数そのものは影響を受けません。

    Attentionマスクで candidate_self_mask が自分自身の位置だけに限定され、候補間の参照が構造的に遮断されています(候補分離)。RoPEも右アンカーで、全候補が同じ位置番号を共有します。

    ranker_attention_utils.py:52

  14. 14条件つき

    過去に伸びた実績があるアカウントは、投稿も伸びやすくなる。

    投稿のいいね数・返信数・リポスト数・表示数は、公開configではモデル入力として無効化されています。効くのは信用スコアによる保護と、フォロワー数を条件にする枠だけです。

    enable_engagement_counts の既定値がFalseで、読み出し箇所も到達不能な旧経路です。生きているfeature-prep側に該当する語は1つも出てきません。一方、user-cred 54以上やフォロワー2.5万超は自動ラベルからの保護として明確に効きます。

    recsys_model.py:268