セマンティックIDとは?投稿に付く「6段の住所」
あなたのポストには、「6段の住所」がこっそり振られています。誰が読んで、どう決めているのか——読んでいるAIの正体は、少し意外なものでした。
Xの公開アルゴリズム(xai-org/x-algorithm)を読み解くシリーズ、第3回です。今回もコードで確認できた事実を軸に書きます(解釈を書くところでは、その都度そう明記します)。
前回のおさらい: フォロー外の投稿を拾うPhoenixは、巨大な「盤」の上で動いていました。すべての投稿はコマとして盤に置かれ、あなたも行動履歴から盤に置かれ、あなたの近くのコマが候補になる——そして投稿コマの置き場所を決める目印が「セマンティックID」だと予告しました。
今回はその中身、盤の「番地」の話です。概念だけだと難しいので、今回は1本のポストに最初から最後まで付き合ってもらいます。
主役はこのポスト:
「今日の自作ラーメン🍜 鶏ガラから4時間煮込んだスープ」+完成写真2枚
フォロワー50人の、開設3ヶ月のアカウントが投稿したとしましょう。このポストがどう住所をもらい、どうフォロー外に届くのかを追います。
住所の正体: 6段、各段は0〜255
セマンティックIDの形式は、公式文書にはっきり書いてあります。
「各投稿を、6段階の残差量子化コード(各段階は0〜255)に変換する」
https://github.com/xai-org/x-algorithm/blob/main/phoenix/reference/README.md?plain=1#L124-L126
つまり1つの投稿につき「183-7-250-12-96-41」のような、0〜255の数字を6段連ねた番号が1つ(この例なら183が1段目、7が2段目…)。各段256通り×6段なので、住所の組み合わせは理論上、256の6乗=約281兆通りです。
前回、盤をチェスに例えました。チェスの盤は8×8で、マスの番地は「E4」の2文字で書けます。セマンティックIDは、それを6段に深くしたもの。281兆マスの盤の番地です。
実際の中身はただの数字6個ですが、意味としてはこういう絞り込みになっています。
ラーメンポストの住所(イメージ):
1段目「食べ物・料理」→ 2段目「自炊・レシピ」→ 3段目「麺類」→ 4段目以降でさらに細かく…
※後述しますが、本物の区割りは非公開なので、この区名はあくまで理解のためのイメージです。また、2段目以降は「県ごとの市リスト」ではなく全投稿共通の一覧から「前の段からのズレ」に一番近いものを選ぶ方式です。数字であること、絞り込み構造であることはコードから確定しています。
大事なのは、住所の材料に「人気の数字」が入っていないこと。フォロワー数も、いいね数も表示数も、計算には使われません。一方で、材料は本文+画像+引用元に加えて、実は投稿者の表示名と@ハンドルも書類に含まれます(次のステップ1で見ます)。つまり住所を決めるのは「何を書いたか+誰の名前で書いたか」であって、数字の大きさではありません。
どう計算されるのか: 3ステップ
計算の手順そのものが公開されています。ラーメンポストを流し込んでみます。
ステップ1: 投稿を「1枚の書類」に整形する
本文と画像が1つの並びにまとめられます。書類の先頭には投稿者の表示名と@ハンドルが置かれ、ラーメンポストなら「投稿者名+本文テキスト+写真1+写真2」が1枚の書類に。画像は本文中の位置を保ったまま差し込まれ、記事(Article)のタイトルやカード情報も対象です。
引用ポストの場合は、引用元の本文と画像も「Quoted post:」として一緒に綴じられます。誰かのラーメン店紹介を引用して「これ自作で再現してみた」と書けば、あなたのコメントと元ポストの内容の両方が1枚の書類になる、ということです。動画には文字起こし(transcript)を添える口があります。
https://github.com/xai-org/x-algorithm/blob/main/phoenix/reference/mm_encoder.py#L97-L124
ステップ2: AIが読んで、盤の座標にする
この書類をAIが読み、1,024個の数字の並び(ベクトル)に変換します。人間の言葉に無理やり直すと「自炊の話・ラーメン・レシピ共有・手間をかけた達成感・写真は料理のアップ」といった特徴の束を、数字1,024個で表現したもの。これが前回話した「1,024次元の盤」の座標そのものです。
そして、読んでいるAIの正体がコードに書いてあります。
Qwen3-VL-Embedding-8B。アリババ開発の、誰でもダウンロードできる公開モデルです。しかも公式文書に「改造なしの素のQwen。内部の独自モデルではない」と明記されています。xAIにはGrokがあるのに、投稿を読む係は外部の公開モデル(の埋め込み版)だった——今回いちばん意外だった事実です。
https://github.com/xai-org/x-algorithm/blob/main/phoenix/reference/mm_encoder.py#L18-L25
さらに、このAIに渡される指示文まで公開されています。
「Represent this X post for retrieving relevant X posts by content, topic, sentiment, or interest groups」
(意訳: このX投稿を、内容・トピック・感情・興味グループで関連投稿を検索できるように表現せよ)
注目は「sentiment(感情)」が明記されていること。同じラーメンの話でも、
「4時間煮込んだ。最高の一杯ができた🍜」(達成感)
「4時間煮込んだのに失敗した。何が悪かったのか誰か教えて」(落胆・質問)
この2つは違う住所に置かれうる、ということです。何について書いたかだけでなく、どんな感情で書いたかも住所の材料になると、指示文レベルで宣言されています。
なお、AIは書類を丸ごと読むので、画像が何枚あるか・長文かどうかといった「型」の特徴も住所にうっすら滲みます。ただし指示文が求めているのは、あくまで内容・トピック・感情・興味グループの表現です。動画の長さのようなメタ情報や「どの種目で反応されたか」は、住所とは別枠でモデルに渡ります(第2回の「形式」の整理と同じです)。
ステップ3: 座標を住所に丸める(6段階の絞り込み)
1,024次元の座標を(設定によっては小さな変換を1枚挟んだ上で)、6段の住所に変換します。使うのは「残差量子化」という手法で、名前は硬いですが、やっていることは住所の絞り込みそのものです。
1段目: 盤全体を256の「都道府県」に分け、一番近いものを選ぶ
2段目: そこからのズレを、また256の「市区町村」に分けて選ぶ
3段目: さらにズレを「町」で絞る
…これを6回繰り返す
https://github.com/xai-org/x-algorithm/blob/main/phoenix/reference/sid_assign.py#L23-L35
コードを見ると本当にこの通りで、「一番近い区画を選ぶ→残りのズレを次の段へ」を6周しているだけです。こうしてラーメンポストは「183-7-250-12-96-41」(数字は例)という番地を受け取ります。なお、投稿から番地が振られるまでの正確なタイミングは、公開コードからは確定できません(第2回で書いた索引の話と同じです)。
ここまでの3ステップを1枚にまとめるとこうなります。
「先頭が同じ=内容が近い」の正体
この絞り込み方式には、重要な性質が自動的に生まれます。住所が大分類→小分類の順で決まるので、内容が近い投稿ほど、住所の先頭部分が一致するのです。
ラーメンポストを基準にすると、こうなります(区名はイメージ):
- 他の人の「自作つけ麺」ポスト → 3段目まで一致(食べ物-自炊-麺類)
- 「自作パスタ」ポスト → 2段目まで一致(食べ物-自炊)
- 「ラーメン店の食べ歩きレポ」 → 1〜2段目が一致(食べ物までは同じ)
- 「選挙のニュース解説」 → 1段目から違う
住所の一致が深いほど、盤の上で近くにいる。「東京都-渋谷区-…」と「東京都-新宿区-…」の関係です。
前回紹介した公式文書の一文——「同じトピックの投稿はIDの前置部分を共有するため、見たことのない投稿にも汎化する」——の種明かしがこれです。
モデルは「この住所(の先頭)の投稿は、こういう人に反応される」を学習しています。ここで主役のラーメンポストに戻ります。投稿主はフォロワー50人。ポストの実績はゼロ。それでも、
「食べ物-自炊-麺類」地区の投稿は、自炊系の写真をよく拡大して見る人・レシピをブックマークする人に反応されてきた
という対応関係(イメージ)を、モデルは学習を通じて使えるようになります。公式文書が「見たことのない投稿にも汎化する」と説明しているのが、まさにこの性質です。だからこのポストにも、実績ゼロのままフォロー外の読者の検索に浮上する経路が開けます。個々の投稿を過去に見ていなくても、住所の先頭を共有する構造を通じて学習結果が汎化する——第2回で「型の実績」と呼んだものの実体は、この汎化です。
逆の構図も考えられます(ここは仕組みからの推測です)。どの地区にも「反応する読者層」が育っていない住所——例えば内輪の挨拶や、文脈のない独り言——に建った投稿は、住所の実績が効かず、フォロー外への扉は開きにくいはず。前回の「扉」の話は、住所の言葉で言い直せるわけです。
補足: 住所が同じなら、大手と同じように伸びるのか
ここで気になるのが「じゃあ大手アカウントと同じ内容を投稿したら、同じように伸びるの?」という疑問だと思います。答えは——入口は人気の数字では閉じられていません。でも、結果は同じになりません。
住所の材料に数字が無い、という意味で入口は広く開かれています(ただし前述の通り書類には投稿者名も入るため、厳密に「誰でも同一」ではありません)。そして第2回で書いた通り、盤の上の最終的な置き場所は「住所+投稿者情報」で決まります。読者たちがよく反応してきた投稿者は、学習の結果、その読者たちの近くに置かれやすい。同じ住所でも、反応実績を積んだアカウントの方が、より多くの読者の「近所」に入りやすいわけです。
さらに候補に入った後はランキングの勝負です。ここは読者ごとの「反応する確率」の予測で競い、読者の履歴・投稿者情報に加えて、いいね数などのエンゲージメント数も材料として渡されます。こうした実績情報が予測に影響しうる——というのが、入力の構造から見た自然な解釈です。
つまり、大手と新人が同条件で勝負する構造にはなっていません。ただし、フォロワー数に応じて機械的に加点するルールは公開コードに見当たりません。フォロワー数自体はランキングモデルへ渡る入力の1つに含まれていますが(どう使うかは学習側)、「フォロワー数×固定の加点」のような単純な作りではなく、投稿者情報・読者の履歴・反応実績といった複数の入力をモデルが学習して予測する構造です(それぞれの寄与の内訳までは、外からは分かりません)。
それでも——住所(型の実績)は、実績ゼロの新人にも開かれた入口です。フォロワー50人のラーメンポストにフォロー外の検索へ浮上する経路があるのは、この入口のおかげ。そこから先の勝負は、届いた読者が実際に反応してくれるかどうか、つまり中身で決まります。
自分の投稿の住所は見られるのか
結論: 見る手段はなく、公開されている材料だけでは再現もできません。
住所はXの画面に表示されず、外部から取得できる公開手段も知られていません。そして自力で計算しようにも、決定的なピースが1つ非公開です。「256の都道府県はどこで区切られているか」の一覧表(コードブック)——本番で使われている区割りの実物は、リポジトリに含まれていません。
面白いのは、住所を作る道具立ての主要部分が公開されていることです。読むAI(Qwen)は公開モデル、指示文も公開、区割り表を訓練するコードも、住所を振るコードも公開。つまり「郵便番号を振る主要な仕組みは公開されているが、本物の郵便番号簿は非公開」という状態です。
なので、公開コードで「自分専用の住所空間」を作って仕組みを実験することはできますが、本番のXがあなたのラーメンポストに振った住所そのものは、外からは知り得ません。
住所の裏の顔: 「近い住所の連発」は数えられている
セマンティックIDにはもう1つの使い道があります。こちらは入ったばかりの新しい配線で、2026年8月17日の更新でカウント処理が追加され、8月19日の更新でランキングモデルへ渡す配線が完成しました。
タイムラインの並びを作るとき、「同じ住所(上の1〜3段)の投稿が、ここまでに何件出たか」「直前に出たのは何位か」をカウントして、ランキングモデルに渡す仕組みです。
https://github.com/xai-org/x-algorithm/blob/main/home-mixer/scorers/ranking_scorer.rs#L661-L680
具体的に言うと、あなたのタイムラインの1画面に「食べ物-自炊-麺類」地区の投稿が既に3件並んでいたら、4件目のラーメンポストは「同じ地区の4件目です」という札を付けてランキングに出される、ということです。
数えているのが「住所の上の段の重複」であること、そしてこの数値が採点リクエストに詰められてランキングモデルへ送信されることは、コードから確定です。この数字をモデルがどう使うかまでは学習に委ねられていますが、わざわざ数えて渡すのは、同じ型の投稿が並びすぎるのを制御するためと見るのが自然です。
投稿する側の目線では、こういう含みがあります。似た内容の投稿を量産すると、それらは「近い住所」を共有しやすくなります。1人の読者のタイムラインに自分の類似ポストが複数届いたとき、2本目以降には「同じ地区の◯件目」の札が付く。型に乗ることは武器ですが、同じ型の連発もまた、住所から見えている——ということです。
分かっていること・分からないこと
分かっていること
- 全投稿に6段の住所(セマンティックID)が振られる。各段0〜255、組み合わせは約281兆通り
- 住所の材料は投稿の中身(本文・画像・引用元・記事タイトルやカード情報・文字起こし)+投稿者の表示名・@ハンドル。フォロワー数やいいね数などの数字は材料に入らない
- 読んでいるAIはQwen3-VL-Embedding-8B(アリババ開発の公開モデル、改造なし)
- 指示文は「内容・トピック・感情・興味グループ」での検索用と明記。感情も住所の材料
- 6段階の絞り込み(残差量子化)のため、内容が近い投稿は住所の先頭が一致する
- 訓練コード・割当コードは公開。ただし本番のコードブック(区割り表)は非公開
- 2026年8月17日・19日の更新で、「同じ住所の重複」を数えてランキングに渡す配線が追加された
分からないこと
- 本番のコードブックの中身(どんな区割りになっているか)。本文中の「食べ物-自炊-麺類」のような区名は、仕組みを説明するためのイメージ
- 自分の投稿に実際に振られた住所(公開されている材料からは取得できない)
- 「同じ住所の重複」カウントを、ランキングモデルが実際にどう重み付けしているか
- 各設定は公開コードの値であり、本番では異なる可能性
まとめ
- 全ポストは「281兆マスの盤の番地」に置かれる。材料は中身+投稿者名で、人気の数字は一切入らない
- 読むのはQwen(公開モデル)。内容・トピック・感情・興味グループが材料と指示文に明記
- 住所の先頭一致=内容が近い。実績ゼロの新規投稿でも「住所の地区の実績」でフォロー外の読者に浮上できる
- 入口は開かれているが、結果は平等ではない。置き場所とランキングには反応実績が効く(大手の有利は機械的な加点ではなく学習由来。なおフォロワー数もランキングへの入力には含まれる)
- 住所を作る主要な仕組みは公開、本番の番号簿(コードブック)は非公開。自分の住所は見られない
- 近い住所の連発は数えられている。型は武器にもなるが、同じ型の連続はランキング側からも見える
フォロー外への扉を開く鍵は、結局「どの住所に投稿を建てるか」——内容が中心です。人気の数字ではなく。
——ということで。いや、難しかったですね。
候補集めの段階で、すでにこれだけのロジックが入っているということです。そして集められたあとは、Thunderの候補と混ぜられてランキング付けされる。
ここで集められたから確実におすすめに載る、というわけではないですが、スコア付けの前に「どうやって集められるか」を知ること。それは決してムダにならないと思います。
難しいとは思いますが、なんとなく覚えておいてください。
次回は、フォロー外ルートのもう1人の住人、SimClusters(シムクラスター)。最新AIのPhoenixの隣で、2020年製の仕組みがなぜ今も現役なのか。「界隈の地図」の話です。
参照(行番号付きリンク。開くと該当行がハイライトされます)
セマンティックIDの公式記述(6段階・各0〜255):
https://github.com/xai-org/x-algorithm/blob/main/phoenix/reference/README.md?plain=1#L124-L126
読み込みモデルと指示文(Qwen3-VL-Embedding-8B・1,024次元):
https://github.com/xai-org/x-algorithm/blob/main/phoenix/reference/mm_encoder.py#L18-L25
投稿の整形(引用元・画像位置・文字起こし):
https://github.com/xai-org/x-algorithm/blob/main/phoenix/reference/mm_encoder.py#L97-L124
残差量子化(6段階の絞り込み)の実装:
https://github.com/xai-org/x-algorithm/blob/main/phoenix/reference/sid_assign.py#L23-L35
住所スナップショットの形式(sid_0〜sid_5の6段):
https://github.com/xai-org/x-algorithm/blob/main/phoenix/reference/sid_assign.py#L60-L70
近い住所の重複をカウントする処理(2026年8月17日・19日の更新で追加):
https://github.com/xai-org/x-algorithm/blob/main/home-mixer/scorers/ranking_scorer.rs#L661-L680
そのカウントをランキングモデルへの採点リクエストに詰める箇所:
https://github.com/xai-org/x-algorithm/blob/main/home-mixer/scorers/vm_ranker.rs#L194-L204
エンゲージメント数(いいね・リプ・表示数など)が採点リクエストに入る箇所:
https://github.com/xai-org/x-algorithm/blob/main/home-mixer/models/candidate.rs#L210-L215
「同じトピックはIDの前置部分を共有」の公式解説:
https://github.com/xai-org/x-algorithm/blob/main/phoenix/README.md#how-retrieval-works
この記事のもとになったX記事
Xで公開した第3回の記事を、サイト用に読みやすく再構成したものです。
ふくふく文鳥