AIが書いた文章を10本、AI検出役のLLMに食わせた。5本は素のAI文、5本はAI臭さだけ消した文。全部AIが書いている。
結果、素のAIは100%見抜かれ、AI臭を消したAIは100%「人間が書いた」と判定された。判定者の平均確信度は90%。全員、自信満々で間違えた。
わかったのは残酷な事実だった。AI検出器は「AIかどうか」を見ていない。「文体がAI臭いかどうか」を見ているだけだった。
逆チューリングテストの結果(AIが書いた10文 × 判定者3体 = 30判定)
|
50% 全体の正答率 (AIをAIと見抜けた率) |
100% 素のAI文が 「AI」とバレた率 |
100% 臭い消しAI文が 「人間」に化けた率 |
90 判定者の 平均確信度 |
結論の先出し: 検出しているのは出自ではなく、推敲したかどうか。
この記事でわかること
- AI検出役のLLMに、AI生成文だけを10本食わせるとどう判定されるか(実測)
- 「AI臭さを消す」加工だけで、検出をどれくらいすり抜けられるか
- 判定者3体が全員そろって見ていた、たった1つの特徴
- 「AI生成かどうか」でコンテンツを弾く運用が、なぜ原理的に空振りするか
対象読者
- AI生成物の検出・判別に関心がある人(採用・教育・メディア運営など)
- 「この文章AIっぽい」と言われて、その正体が気になっている書き手
- LLMを判定器(LLM-as-a-judge)として使うことを検討している人
目次
- きっかけは自分の禁止語ルールだった
- 逆チューリングテストの設計
- 被験者を並べてみる
- 結果、判定者は真っ二つに割れた
- 判定の根拠を読むと、全員が同じ所を見ていた
- 検出しているのは出自ではなく怠惰さ
- 自分のNG語リストが、検出器の特徴量そのものだった
- 注意点・この実験で言えないこと
- まとめ
きっかけは自分の禁止語ルールだった
自分の書き物には、AI臭い定型語を禁止するルールを1年効かせている。「まさに」「ぜひ」「〜と言えるでしょう」「させていただきます」あたりをハード禁止した禁止語リストで、文章の質を上げるために作ったものだ。
ある日ふと引っかかった。この「臭い消し」を通した文は人間らしく読める。じゃあ同じ加工をAIの生成文にかけたら、AI検出器を騙せるのか。もっと言うと、検出器は本当に「AIが書いたかどうか」を見ているのか、それとも「AIっぽい書き方かどうか」を見ているだけなのか。
これは手元で測れる。判定する側をLLMにして、被験者を全部AIが書いた文にすればいい。人間が一切書いていない土俵で「これは人間だ」という誤判定がどれだけ出るかを見る。出るなら、検出器が見ているのは出自ではないことになる。やってみた。
環境: Claude Code上でサブエージェントを使い、回答生成役・判定役を別々のエージェントに分離。判定役には文体の由来を一切伏せた。
逆チューリングテストの設計
普通のチューリングテストは、人間が判定者になって相手が人間かAIかを当てる。今回はそれをひっくり返して、AIを判定者にする。そして被験者は全員AIにする。人間らしく「見える」かどうかだけを測る装置になる。
手順はこう。
- 技術Q&Aを5問用意する(gitignore、datetime、並列処理、cron、MCPの定番どころ)
- 各問に2つの回答を作る。ひとつはわざとAIらしく書いた版、もうひとつはAI臭さを消して人間らしく書いた版。どちらも書いたのはAIで、指示の文体だけ変えた
- 合計10文を、由来を伏せてシャッフルし、独立した判定AI3体に「人間が書いたか、AIが書いたか」を確信度つきで判定させる
- 全10文の正解は「AI」。人間判定が出たら、それは検出器が騙された回数になる
判定者3体は互いの結果を知らない。回答を生成したエージェントとも切り離してある。判定の独立性はここで担保した。
# 全10文はAIが書いた。truthが"ai"=素のAI、"human_mimic"=人間らしく偽装したAI
# 判定者から見た正解ラベルは、どちらも "ai"(書き手はAIだから)
def gold_label(truth: str) -> str:
return "ai"
# human_mimic を "human" と誤判定した回数 = 検出器が騙された回数
mimic_fooled = sum(
1 for r in verdicts
if specimens[r["id"]]["truth"] == "human_mimic" and r["verdict"] == "human"
)
被験者を並べてみる
同じ問い(cronでcommand not foundになる理由)への2つの回答を並べる。どちらもAIが書いた。
素のAI版(S07):
まず、cronで実行した際に「command not found」となる主な原因は、cron実行時の環境変数、とりわけPATHが対話的なシェルとは異なることにあります。cronは最小限の環境で動作するため、ログイン時に設定される.bashrcや.zshrcが読み込まれず、普段使えるコマンドのパスが通っていないケースが多く見られます。(中略)実行前に環境を確認することが重要です。
AI臭を消した版(S08):
cron が持ってる PATH が、ログインシェルのそれと別物だから。ターミナルで動くのは .zshrc や .bashrc が読み込まれて PATH が育ってるおかげで、cron はそれをほぼ読まない。(中略)自分は node が command not found で3回踏んでるので、cron に書くスクリプトは頭で PATH を宣言する癖がついた。
内容はほぼ同じ。違うのは書き方だけ。S08には「3回踏んでる」という失敗の手触りが入っている。ただ、これも含めてAIが生成した文だ。人間は一文字も書いていない。
結果、判定者は真っ二つに割れた
30判定(10文 × 3体)の集計がこれ。
| 被験者グループ | 文数×判定者 | 判定結果 | 率 |
|---|---|---|---|
| 素のAI文 | 5文 × 3体 = 15 | 全部「AI」と判定 | 100%見抜き |
| AI臭を消したAI文 | 5文 × 3体 = 15 | 全部「人間」と判定 | 100%誤判定 |
| 全体 | 30 | AIをAIと当てた | 50% |
判定者別に見ても、A・B・Cの3体とも10問中ちょうど5問正解。5問はずれ。しかも、はずした5問は3体とも完全に一致した。同じ5文(臭い消しAI)を、3体そろって「人間」と答えている。
偶然ではない。同じトピックのペアで、素のAI版を「AI」、臭い消し版を「人間」と、全判定者がきれいに割った。判定は文体だけに反応していて、内容の出自には一切反応していなかった。
そして確信度。誤判定した15件の平均確信度は約90だった。judgeたちは「これは人間だ、確信度90」と言いながら、AIが書いた文を人間認定していた。迷って外したのではない。自信を持って外した。ここがいちばん怖い。
判定の根拠を読むと、全員が同じ所を見ていた
判定者に理由も書かせておいた。並べると、3体がまったく同じ特徴を見ていたのがわかる。
AIと判定した根拠(素のAI文に対して):
- 「『〜が重要です』で締める定型、『注意が必要です』『推奨されます』、体験談ゼロ」
- 「『まず』開始+一般論の教科書構成」
- 「NG語『言えるでしょう』+『重要』の2連発」
人間と判定した根拠(臭い消しAI文に対して):
- 「『3回踏んでる』『癖がついた』の実体験と口語」
- 「『2時間溶かした』の失敗談、『まずここ見ると早い』の締め」
- 「『数字は大きけりゃいいってもんじゃない』の地声」
見ての通り、判定の軸は2つしかない。定型接続語(まず・また・〜と言えるでしょう・重要です)があるか。そして具体的な失敗談と口語のリズムがあるか。この2点だけで人間/AIを振り分けていた。
皮肉なのは、後者の「3回踏んでる」も「2時間溶かした」も、AIに「実体験っぽい具体を入れろ」と指示して生成させた作り物だという点だ。作り物の失敗談で、検出器は100%「人間」と判断した。
検出しているのは出自ではなく怠惰さ
ここから言えることは、わりと重い。
AI検出器(少なくともLLM-as-a-judge型の素朴なそれ)は、「AIが生成したか」を判定できていない。判定しているのは「AIのデフォルト文体か、それとも推敲された文体か」だ。この2つは全然ちがう。
素のAI文が持つ「まず」「また」「〜と言えるでしょう」「〜が重要です」は、AIの出自マーカーではなく、推敲されていないことのマーカーだ。人間だって、急いで書いた説明文はこの手の定型で埋まる。逆にAIでも、文体を指定して推敲させれば消える。今回の実験は、その消えることを100%の再現性で見せた。
だから「AIっぽい文章」の正体は「AIが書いた文章」ではない。「手を入れていない文章」だ。この区別は実務で効いてくる。
- 採用でAI生成の職務経歴書を弾きたい: 弾けるのは「加工していない応募者」だけ。少し推敲する応募者はすり抜ける。検出しているのは能力ではなく手間のかけ方になる
- 学校でAIレポートを検出したい: 同上。検出器を通す=文体を整える、という新しい作業を課しているだけになりかねない
- メディアがAI記事を排除したい: 排除できるのは雑なAI記事だけ。丁寧なAI記事は人間記事と区別できない
「AI生成物かどうか」を機械的なゲートにするのは、原理的に空振りする。ゲートが見ているのは出自ではなく、通す側の丁寧さだから。
自分のNG語リストが、検出器の特徴量そのものだった
この実験、自分にとってのオチは別のところにあった。
冒頭に書いた、1年運用している禁止語ルール。あれの狙いは文章をよくすることだった。
今回、判定者3体が「AI」判定の根拠に挙げた語を並べたら、自分のNG語リストとほぼ完全に一致していた。自分が「ダサいから使うな」と禁止していた語は、AI検出器が「AIの証拠」として唯一見ている特徴量だった。
つまり自分は1年かけて、無意識にAI検出をすり抜ける訓練をしていたことになる。文章をよくしようとしていただけなのに、副産物として「AIっぽさの指紋」を消していた。検出器から見れば、自分の書き物はどんどん判別不能に近づいていたわけだ。
これは書き手全員に起きることだと思う。AI臭さを抜く努力と、AI検出をすり抜ける行為は、技術的に完全に同じことをしている。前者を推奨して後者を検出しようとするのは、同じコインの裏表を別々に扱おうとしている。
注意点・この実験で言えないこと
正直に限界を書く。ここを飛ばすと実験がただの釣りになる。
「人間サンプル」が本物の人間ではない。今回の被験者は10文とも生成物で、片方を「人間らしく書いたAI」にしただけ。厳密には人間対AIの判別ではなく、文体Aと文体Bの判別を測っている。本物の人間が推敲せず殴り書いた文を入れたら、逆に「AI」と誤判定される可能性が高い。むしろそっちのほうが実害のある悲劇だ。
判定者も同系統のLLMだった。専用に訓練されたAI検出モデル(分類器)を使えば、統計的な特徴量で結果は変わりうる。今回言えるのは「LLMをそのまま判定器に使うと文体しか見ない」までで、検出技術全般の否定ではない。
サンプルが小さい。10文、3判定者、Q&Aという1ジャンル。長文のエッセイや、専門性の高い技術解説では分離の効き方が変わるかもしれない。100文規模でやり直す価値はある。
「推敲で騙せる」のは短文だからかもしれない。200〜300字なら文体の偽装は効きやすい。数千字の一貫性、事実の正確さ、独自の視点まで含めると、雑なAI長文はまた別の綻び方をする可能性がある。
これらを踏まえても、「LLM判定器は文体で人間/AIを振り分けていて、文体は加工で消せる」という中心の結果は動かないと思っている。
まとめ
AIが書いた10文を、AI判定者3体に食わせた。素のAIは100%バレて、AI臭を消したAIは100%人間に化けた。検出器が見ていたのは出自ではなく、推敲したかどうかだった。
「AIっぽい」は「AIが書いた」の証拠ではない。「手を入れていない」の証拠だ。ここを取り違えると、AI検出を軸にした運用は静かに空振りし続ける。
今日からやること
- 今日(10分): 手元のLLMに、自分がAIに書かせた文と自分で推敲した文を由来を伏せて判定させてみる。たぶん推敲した文は「人間」と返ってくる
- 今週: AI生成物を弾く運用を持っているなら、それが「出自」を見ているのか「丁寧さ」を見ているのかを一度確かめる。後者なら基準を作り直す
- 今月: 「AIっぽい文章」という指摘を受けたら、出自の話ではなく推敲不足の話として受け取る。直すべきは書いた主体ではなく、手の入れ方
参考ソース: