X、リプライのスパム検出を追加|判定するLLMの指示文は非公開

[最終更新]

Googleで優先するソースとして追加するボタン

Xの推薦アルゴリズムに9月4日、告知のないまま7つのファイルが加わりました。自分のリプライに自分で返信を重ねる投稿を、LLMが検査する仕組みです。どんな条件で検査に回るかも、判定後に何が起きるかも、コードで読めます。読めないのは、そのLLMに与えられた指示文だけでした。


xAIは2026年9月4日、Xの推薦システムのリポジトリ xai-org/x-algorithm に、リプライのスパム検出フロー multi_step_reply_spam を追加した。自分のリプライに自分でさらに返信する投稿を対象とし、スレッドの起点となる投稿の投稿者のフォロワー数が1,000以上であることなどの条件を満たしたものが検査に回る。判定は識別子 oai-gemma4-26b-2 のLLMが担い、その指示文はリポジトリに含まれない。

スパムと判定されると返信の並び順に使うスコアが0.0となり、通常はセーフティラベル RiskyHighVizReply も付与される。同じコミットで、協調スパム検出の閾値は1,000から5,000へ引き上げられた。ライセンスはApache-2.0。

From: 文献リンクxai-org/x-algorithm(GitHub)

【編集部解説】

告知のない追加だった

9月4日の朝、リポジトリに7つのファイルが加わりました。487行。リプライのスパムを検出するフローです。

READMEの「Notable Updates」は、この日も更新されていません。掲載されているのは8月14日と13日の2項目のままです。9月に入ってからの7回の更新には、可視性ルールの全面的な作り直しも含まれていますが、そのどれも告知欄には載っていません。

変更を知る方法は、コードを直接見ることだけです。オープンソースであるとは、そういう状態でもあります。

3層のうち、見えるのは上と下

追加されたフローは、3つの層でできています。

1層目は、検査にかけるかどうかの絞り込みです。リプライであること、祖先が2段以上あること、直前の投稿が自分自身のものであること、スレッドの起点となった投稿の投稿者のフォロワーが1,000人以上いること。条件はコードにそのまま書かれていて、誰でも読めます。除外理由には low_blast_radius、つまり影響範囲が小さい、という名前が付いています。

3層目は、判定後の処理です。返信ランキングのスコアを0.0にし、投稿にセーフティラベルを付ける。安全弁も読めます。最新のリプライがフラグされていなければ全体を破棄する、他人の投稿へのフラグは取り除く、フラグが1件だけなら破棄する。ラベルのほうは、テストアカウントなどでは付与を見送る分岐があります。

残る2層目、つまり「それはスパムか」を判断する部分は、LLMが担っています。コードが読み込んでいるのは multi_step_reply_spam_system.j2 というテンプレートですが、このファイルはリポジトリに含まれていません。該当箇所には、公開対象から外している旨のコメントが1行だけ添えられています。

条件は読める。処理も読める。判断だけが読めない。

閉じている理由は、説明されている

これを不誠実と読むのは、たぶん正確ではありません。

READMEには「What’s not in this repo?」という節があり、そこで理由が述べられています。投稿の配信に関わるコードを公開すると、それを使ってシステムを出し抜こうとする人が出てくる。そのリスクを下げるため、限られた範囲のファイルを公開していない。挙げられているのは、Groxのプロンプトと、一部のbotmakerルールの2つです。

そのうえで、代替手段も示されています。自分のアカウントや投稿に付いた可視性ラベルを見られる「Under the Hood」を用意し、コードで仕組みを見せ、ツールで結果を見せる。この二段構えで公開性を担保する、という設計です。

スパム対策の判断基準を全部公開すれば、回避手順の説明書になります。判断だけを閉じるという選択には、それなりの合理があります。

ラベルは見えるが、その先はまだ追えない

その二段構えについて、READMEはこう説明しています。利用者は自分のアカウントに付いたラベルをコードと突き合わせ、投稿の可視性がどう影響を受けるかを理解し、必要なら異議を唱えられる、と。

今回のフローで付くラベルは RiskyHighVizReply です。名前も、付与の条件も、コードから特定できます。同じラベルは別の経路でも使われていて、LLMが量産したとみられる投稿に付ける規則が、対処を担うサービスの設定ファイルに書かれています。そちらには30日という有効期限も添えられています。

ところが、このラベルを受け取って表示可否を判断する側、つまり visibility-filtering の中に、参照する箇所は公開されている範囲では見当たりません。付ける側は読めて、効かせる側が読めない。

ラベルまでは追える。その先で何が起きるかは、まだ追えない。突き合わせは途中で止まります。

これは今回の実装に固有の問題というより、「どこまで見せれば見せたことになるか」という線引きが、まだ定まっていないということでしょう。透明性の設計が、運用に追いつく途中の段階にあります。

条件が独り歩きし、判断が置き去りになる

この構造は、情報の伝わり方にも影響します。

9月4日の追加は、公開の翌日にはSNS上で共有されました。コードの画像が添えられ、時期も引用箇所も正確です。ただ要約の段階で、「フォロワー1,000人以上のアカウントへの追いリプはスパム判定される」という形に縮んでいきました。

実際には、1,000という数字はスレッドの起点となった投稿者のフォロワー数であって、リプライを送った相手の数ではありません。そして条件を満たすことは、判定されることではなく、LLMの検査に回ることを意味します。その判断基準は公開されていないので、何がスパムとみなされるかは、外からは分かりません。

読める部分だけで要約すると、読めない部分がなかったことになります。数値が独り歩きするとき定義が失われるのと同じ構造で、条件が独り歩きするときには判断の主体が失われる。読める情報が増えるほど、読めない部分の存在が見えにくくなる、という逆説があります。

8月は数値、9月は判断

8月13日にxAIが公開したのは、ランキングの重みでした。リンクのコピー共有が20.0、いいねが0.5、通報が−234.0。少なくともMeta、TikTok、YouTubeの公式資料では、Xのようにランキング係数を実数値で示した例は確認できません。

その数値は、9月4日の時点でも変わっていません。この1週間で7回コードが更新され、可視性ルールが作り直されてなお、エンゲージメントの重みは1件も動いていない。論点はもう、係数の側にはありません。

代わりに前に出てきたのが、判断の主体です。投稿を見せるかどうかを決めているのは、条件分岐ではなく、指示文を与えられたモデルになりつつあります。そして指示文は、システムを守るという理由で閉じられている。

問いは「どんな重みが付いているのか」から、「誰が、何を基準に判断しているのか」へ移りました。この問いは係数の表では答えられません。

これから開くもの

xAIはREADMEで、この仕組みへの意見を歓迎すると書いています。実際、相互フォローの優遇設定については、A/Bテストの経緯と値の変遷を記した文書がリポジトリに置かれました。何がいつ、なぜ変わったかを外から追える形が、すでに一部で始まっています。

同じ形式が、判断を担うモデルの側にも広がっていくのかどうか。プロンプトそのものを開けないとしても、たとえば判定の傾向や、覆された件数のような輪郭を示す方法はあるはずです。

コードは開かれました。次に開かれるとすれば、それは判断の輪郭でしょう。そこが見えたとき、アルゴリズムの透明性という言葉の意味が、もう一段はっきりします。

【関連記事】

【解説】Xがアルゴリズムの重みを公開|古い数字が流通し続ける理由
8月13日に公開された重みの実数値と、3年前の数値がいまも流通し続ける構造を扱った記事。今回の記事はこの続きにあたる。

X「x-algorithm」を解説|Grok基盤で変わった推薦設計
1月に公開されたリポジトリの内部構造を解説した記事。今回追加されたフローが、何の上に積まれたものなのかが分かる。

xAI「x-algorithm」5月15日アップデート|Xの推薦システムに「Grox」と広告モジュールが追加
5月15日の更新でGroxや広告モジュールが加わったことを報じた記事。Groxが担う3つの役割を具体的に扱っている。

【編集部後記】

同じコミットで、もう一つ数字が動いています。協調スパムを検査する側の閾値が、1,000から5,000へ引き上げられました。片方では網を新しく張り、もう片方では網の目を粗くしている。

どちらも同じ日の、わずか数行の差分です。スパム対策は締めるか緩めるかの一択ではなく、どこを見て、どこを見ないかの配分なのだと分かります。そしてその配分は、外からは告知されません。気づくには、コードを開くしかありませんでした。


【用語解説】

multi_step_reply_spam
2026年9月4日に追加された、複数段にわたるリプライのスパムを検出するフロー。自分のリプライに自分でさらに返信を重ねる投稿を対象とする。

セーフティラベル
投稿やアカウントに付けられる印。可視性の判断や、その後の対処の入力として使われる。

RiskyHighVizReply
今回のフローが付けるセーフティラベルの名称。同じラベルは、LLMが量産したとみられる投稿を対象とする規則からも付与される。

返信ランキング
一つの投稿にぶら下がる複数の返信を、どの順で見せるかを決める仕組み。フィード全体の並び順を決めるランキングとは別系統である。

low_blast_radius
影響範囲が小さいため検査の対象から外す、という除外理由の名称。今回のフローでは、スレッドの起点となった投稿の投稿者のフォロワーが1,000人未満の場合に使われる。

multi_step_reply_spam_system.j2
LLMへ渡す指示文の雛形が書かれたテンプレートファイル。今回のフローはこれを読み込むが、ファイル自体はリポジトリに含まれていない。

Grox
Xの推薦システムのうち、投稿の中身を解析してスパムやカテゴリを判定する部分。今回のフローもここに属する。

botmaker
ラベルを適用する規則を記述するためのルールエンジン。規則の一部は公開されていない。

visibility-filtering
投稿を閲覧者に見せてよいかを判定するサービス。投稿の順番を決めるランキングとは別に設計されている。

Under the Hood
自分のアカウントや投稿に付いた、可視性に影響するラベルの集計を確認できる透明性ツール。パイロット提供中。

Apache-2.0
オープンソースライセンスの一つ。改変や商用利用を認め、特許の扱いについても定めがある。

【参考リンク】

Under the Hood(X)(外部)
自分のアカウントと投稿に付いた、可視性に影響するラベルの集計を確認できるページ。パイロット提供のため全員が使えるとは限らない。

Our Approach to Facebook Feed Ranking(Meta Transparency Center)(外部)
Metaがフィードのランキングを説明する公式ページ。予測モデルと入力シグナルの種類は示されるが、係数の数値は公開されていない。

How TikTok recommends content(TikTok Support)(外部)
TikTokがおすすめの仕組みを説明する公式ヘルプ。考慮する要素は列挙されているが、それぞれの重み付けの数値は示されていない。

Navigating YouTube’s Recommended Videos(How YouTube Works)(外部)
YouTubeが推薦の仕組みを説明する公式ページ。ランキングに使う信号の種類は示されているが、係数の数値は公開されていない。

【参考記事】

task_multi_step_reply_spam.py(外部)
検査対象を絞り込む条件と、判定後にラベルとスコアを書き込む処理。1,000という閾値も、除外理由の名前もこのファイルにある。

classifier_multi_step_reply_spam.py(外部)
LLMにスレッドを渡して判定させる処理と、その結果を絞り込む3つの安全弁。判定に使うモデルの識別子も、このファイルで指定されている。

enforcement_post.yaml(外部)
投稿へのラベル付与を定める規則ファイル。今回と同じラベルが、LLMが量産したとみられる投稿にも使われていることが読める。

param.rs(外部)
ランキングの重みが実数値で書かれた設定ファイル。コピー共有20.0、いいね0.5、通報−234.0が並ぶ。9月4日時点の値。

BIDIRECTIONAL_BOOST_CHANGE.md(外部)
相互フォロー優遇の値が、A/Bテストを経てどう決まったかの記録。日付、割り当てた値、引き下げに至った理由まで残されている。

Googleで優先するソースとして追加するボタン
投稿者アバター
山本 達也 代表社員
合同会社デジタルの窓口 代表。ウェブ解析士。生成AI・サイバーセキュリティ・ 宇宙開発領域を中心に執筆。

おすすめ記事