🕵️ TF-IDF+線形SVMでLLM生成文を8割当てた個人プロジェクト — 「古典」がAI検出で今も強い理由と限界
深層学習もLLMも使わず、scikit-learnのTF-IDF+LinearSVCで中国語Web小説のAI生成文を精度84〜89%で検出した個人プロジェクト。7モデルの二値分類器+多数決という設計、未知モデルへの汎化、そして著者自身が明記する限界を読む。
AI生成文の検出器と聞いて思い浮かべるのは、LLMでLLMを見破る系の大掛かりな仕組みだと思う。GPTZeroみたいな。それがTF-IDFと線形SVM——scikit-learnで書ける20年前の道具立て——で文単位84〜89%の精度が出た、という個人プロジェクトがHNで話題になっていた(215ポイント・157コメント)。
作者はlyc8503という中国語圏の個人開発者。動機が良くて、Lofter(中国のファンフィク投稿サイト)にAI生成小説が氾濫しているのに嫌気がさした週末プロジェクトだ。学術論文ではないので数値はすべて自己申告だが、コードもブラウザで動くデモも公開されている。
設計で一番うまいのは「双子データ」
検出器の質は分類器より学習データで決まる。ここの工夫が本題だと思う。
人間側のサンプルは、ChatGPT以前(2010〜2022年)のWeb小説約1万本。この期間ならAI混入がないことが時期的に保証される。AI側のサンプルは、その各章をgemini-3-flashで要約し、その要約から7つのモデル(gemini-3-pro、qwen、glm×2、kimi、doubao、deepseek)に本文を再生成させたもの。同じ題材・同じ筋書きの人間版とAI版という「双子」ができるので、分類器は内容ではなく文体の癖を学ばざるを得ない。HNでもこのデータ生成が一番称賛されていた。
分類側は正直に泥臭い。8クラス分類(人間+7モデル)は約50%で失敗——モデル同士の文体が似すぎている——ので、モデルごとの二値分類器を7個並べて多数決(2票以上でAI判定)に切り替えている。ちなみにperplexity系の手法は先に試して、誤検知の多さとモデル間汎化の悪さで捨てたそうだ。
# 骨格はこれだけ。特徴量は最大440万次元
pipeline = make_pipeline(
TfidfVectorizer(...),
LinearSVC(),
)
数字の読みどころは精度ではなく偽陽性
文単位84〜89%という精度は、正直それだけなら「ふーん」だ。読みどころは2つ別にある。
ひとつは未知モデルへの汎化。学習に使っていないClaude Sonnet 4.6(71.9%)やGPT-5.2(73.3%)の生成文も7割超で検出した。モデル固有の癖ではなく、LLM出力に通底する何かを拾っている示唆だ。翻訳往復や「AI臭を消せ」プロンプト程度のパラフレーズでは79〜86%に落ちる程度で回避しきれなかったという。
もうひとつが偽陽性の制御。pre-2022の作品1万本に対し、判定閾値を上げると偽陽性は0.04%〜実質ゼロまで下がる。「人間を誤ってAI認定する」ことの害——HNではクラスの3分の1をAI疑いで落とした教授の実話や、英語非ネイティブが不利になる問題が挙がっていた——を考えると、検出器の実用性は精度よりこちらで決まる。
そして著者は限界も明記している。これは中国語Web小説というドメイン限定の検出器で、汎用データでは学習していない。この正直さ込みで、良いエンジニアリングの記事だと思う。
「原理的に無理」と「実用十分」の間
HNの議論は毎度の二派に割れていた。テキストの情報量では最新モデルの検出は原理的に不可能に近づく、という悲観派。低労力のAIスロップを機械的にふるい落とすなら85%で十分、という実用派。
自分は後者寄りで、鍵は用途の高低だと思っている。学生の処分のような高ステークスに検出器を使うのは今も間違いだ。でも「投稿サイトのフィードからスロップを減らす」低ステークスのふるいなら、偽陽性を絞った古典MLは軽くて速くて説明可能で、しかも自前で学習し直せる。ドメインを絞れば古典が効くのは、スパムフィルタの時代から変わっていないんですよね。
日本語圏には同種の「自作してみた」記事がまだ見当たらない。日本語Web小説やnote記事で同じ双子データ方式を回したら何%出るのか。scikit-learnで済むなら、これは週末に試せるサイズの疑問です。