用经典机器学习检测 AI 生成文本
介绍不依赖 LLM 的文本真伪检测方法,用传统 ML 算法成本低廉且效果可靠,适合内容审核场景。
介绍不依赖 LLM 的文本真伪检测方法,用传统 ML 算法成本低廉且效果可靠,适合内容审核场景。
本文是一份实验性机器翻译,可能含有错误。如有不清楚之处,请参考原文的中文版本。我正在持续改进翻译。
截至 2026 年初,主流 LLM 生成的文本表现出强烈的统计规律,可以用传统机器学习模型有效地与人工撰写的内容区分开来。我怀疑许多所谓的"AI 抄袭检测工具"实际上都是这样工作的。
在线演示:https://lyc8503.github.io/AITextDetector/
这个演示中使用的模型没有在通用数据上训练,也没有经过严格的优化或迭代。它在测试集上的单句检测准确度约为 85%。使用前请阅读本文,了解潜在的局限性。
核心代码(草稿)和训练好的模型文件可在 GitHub 上获得:lyc8503/AITextDetector
大约半年前,当我还在学校写论文时,就已经有关于检查论文中 AIGC(AI 生成内容)的传言流传开来。我测试了几个平台——CNKI、万方以及一些第三方 AIGC 检测服务——发现它们确实能以相当的准确度区分我手写的文本和 LLM 生成的文本。
这激发了我对 AIGC 检测实际工作方式(以及如何绕过它)的好奇心。
但那时我要忙的事太多了——沉迷于无线电、Minecraft、东方——经过几次失败的尝试后,我搁置了这个想法。
最终,我糊弄过了论文,生活继续。但最近,当我在浏览 Lofter 时,我发现整个标签页都被低质量的、完全不符合设定的 AI 生成同人文淹没了。
我怎么能一眼看出它们是 AI 生成的呢?好吧,有些人甚至懒得清理 Markdown 格式或 AI 生成的章节标题就直接发布——然后他们把文章的一半放在付费墙后面 😓
不过,大多数 AI 生成的文本更难被发现——它们隐藏在各种写作风格、不同的提示词和不那么明显的地方。等你意识到有些不对劲时,已经太晚了。有些文本几乎不可能证明是 AI 生成的,这让我很偏执。在吞下了太多 AI 生成的垃圾后,我终于受不了了。停止浏览 Lofter——是时候打开 VS Code 了!
是的,这就是我如何重新启动我的周末项目想法的——构建一个 AI 生成文本检测器……
现在互联网上搜索 AIGC 检测时,充斥着广告。每个结果都是另一个论文-AI-改写服务。那时我翻过噪音,找到了一个叫文本困惑度的东西。
这个想法很简单:使用现有的 LLM 来估计给定句子中每个单词出现的概率。如果几乎每个单词在 LLM 的预测中排名很高(Top-N),该句子可能是 AI 生成的。相反,如果许多单词都出人意料,它更可能是人工撰写的。
听起来很有希望,对吧?我花了一些时间尝试这种方法,但结果令人失望——有大量的假正例和假负例,无法设置合理的阈值。而且,还有实际问题:推理成本高、跨模型泛化差、难以在本地部署大型模型,封闭权重模型难以集成。总的来说,这种方法既不优雅也不可靠。
失败的尝试——被一堆软广告"教程"骗了
由于在线资源无用,回到老派炼金术。
Scikit-learn,启动!按照它的 Roadmap,我们可以直接选择 Linear SVC 和 Naive Bayes 作为我们分类任务的良好起点。
(窃窃私语:这也符合我的直觉——LLM 有可检测的选词模式;甚至朴素贝叶斯分类器应该能识别出来。我只是没想到信号会这么强。)
老派炼金术传统分类器需要标记数据——所以我们需要人工撰写的文本和确认的 LLM 生成文本用于训练。
我的方法:我从我在 2023 年从某个类似福特和河流的平台上抓取的数据中提取数据,筛选出 2010-2022 年间发布的文章(ChatGPT 前)。我只过滤掉了互动非常低或很短的文章,然后随机抽样了近 10,000 篇多千字的文本作为人工撰写的样本。
然后,我使用 LLM 为这些文本生成章节摘要,将摘要反馈给 LLM,并让它重新生成完整的文章。这给了我大约相同数量的 LLM 生成样本,在流派上多样化,并与原始人类内容密切匹配。
理论上是这样。但 LLM API 很贵,我不打算为一个周末项目花费数千美元。所以我发挥创意——并且利用了多个低成本或免费的 API 渠道:
Gemini:使用 CLIProxyAPI 将 Antigravity/Gemini CLI 配额转换为 API 访问——只需支付 ~$20 的 AI Pro 账户
Qwen:qwen-code 让你可以反向工程 Qwen Plus API——免费
GLM-5:幸运的时机——OpenRouter 提供免费 GLM-5 公开测试版(Pony Alpha)
Kimi、Deepseek、Doubao、GLM-4.7:在促销编码计划期间注册——$8.9 首月,API 访问已解锁
免责声明:这不是推荐。这些行为违反了平台的 ToS,可能会导致你被禁止。但这些平台忙于营销炒作,无暇顾及,我也不打算全价购买。
许多专注于编程的 LLM API 奇怪地按调用次数收费,但我们可以通过将任务批量输入到大规模输入中来优化这一点,强制 LLM 每次调用生成更多内容。所以……
你是说我用了价值 2000 美元的 300 多百万 Gemini tokens,按全价计算?!
最终,我使用 gemini-3-flash 生成摘要,并使用七个不同的模型(gemini-3-pro、qwen-coder-plus、glm-5、glm-4.7、kimi-k2.5、doubao-seed-code、deepseek-v3.2)生成七组 LLM 生成的样本。
在我进行到数据生成的中途时,我按捺不住,开始进行训练。
我让 Claude 写分类器代码,它天真地把整个原始文本倾倒到模型中——达到了可疑的 99.45% 的准确度……真的吗?
Claude 没用。我自己来干。对于训练,我使用中文标点符号将所有文本分割成句子,清理非中文/英文字符,然后应用 scikit-learn 的 TF-IDF → LinearSVC。清理掉一些噪音后,句级分类仍然达到了约 85% 的准确度!
即使这个有漏洞的第一个版本也达到了 88% 的准确度(后来优化到 85%)
单个句子携带信息有限,但 85% 的句级准确度意味着对于一篇较长的文章,我们可以高度确信地判断它是否是 AI 生成的。这个性能远超我的预期。老派 ML 仍然很强大——远比那些只是问 LLM"嘿,这篇文本是 AI 生成的吗?"的愚蠢在线工具要好得多。
完成所有数据后,我尝试了训练一个 8 分类模型(人工 + 7 个 AI),但这些 LLM 似乎太相似了——可能是互相蒸馏的——所以分类很混乱,准确度只有约 50%。
多分类结果——显然不可分离。也许我的模型不好,但算了,不重要
最终,我训练了七个独立的二元分类器,并使用多数投票:如果 ≥2 个模型检测到句子,就将其标记为 AI。
所有模型都达到了 85% 以上的准确度和 80% 以上的 F1——相当扎实!我还注意到 AI 生成的文本经常被多个模型标记,所以投票非常有意义。
我试过 MultinomialNB 和 SGDClassifier,但准确度略有下降。BERT 给了点小提升,但需要太多 GPU 时间——放弃了。甚至测试了 AutoGluon,它不知怎的仅管理 53% 的二元准确度。就不深入了。
在这一点上,我本可以直接发布仓库并声称大功告成。但每次都启动 Python 太不方便了。我本可以托管一个 Python API,但那意味着服务器维护——违反了我严格的 Serverless 哲学。
我的原始计划:将模型导出到 ONNX,通过 Wasm 中的 ONNX Web Runtime 进行推理。但当我问我的硅仆 Claude 帮忙时,我没有明确说明——它越界了,修剪并将模型导出为 JSON……然后用 JavaScript 完全实现了 TF-IDF + SVM,用于浏览器推理。
嗯……实际上不是个坏主意。我在 100 万字符的文本上测试了它——在我的机器上花了约 10 秒,可以接受。对于典型的几千字符输入,速度很快。
好吧,既然这只是一个演示,而且 JS 方法更透明,我会保留这个略显愚蠢的实现。(怪 Claude,不是我。)
至于准确度:我测试了不同的特征限制。最终优先考虑性能并保留了 500k 个特征。存储为 JSON,它是一个庞大的 107MB(虽然在服务器端 gzipped,它约为 38MB)。较小的版本(50k–80k)仅损失 3–4% 的准确度,但最终 AI 检测率变化很大——特别是在人工文本上,有 ±50% 的相对差异,导致假正例。所以我坚持使用 500k。
最终准确度下降:约 1%,如下所示:
下面所有测试都使用修剪的网络版本,其性能应与完整的 joblib 模型相似。
当前逻辑:将输入文本分割成句子,使用所有 7 个二元模型进行清理和分类。如果 ≥2 个模型标记句子,它被标记为可疑 AI 并高亮显示。最终 AI 分数是被标记的字符所占的比例。分类:
首先,在 Doubao 和 Deepseek 等常见模型上测试检测率——两者都在训练数据中。提示词:为我写一个 3000 字的故事。轻松被抓住:
Doubao Seed Code:93.0%
现在在未见过的模型上测试——泛化怎么样?
Claude Sonnet 4.6:71.9%
我测试了几个不在训练中的其他模型(MiMo-V2、Doubao-Seed-2.0、GPT-4o)——都在约 70% 处检测到,有些甚至 >90%。相当不错。
还测试了更复杂的提示词——例如,输入 20 章人工撰写的文本,并要求 LLM 模仿风格并继续。检测率略微下降到 67.8%(但记住,我们也在复杂提示词上训练过)。由于篇幅限制,结果未显示。
然后我从我的订阅列表中选了 10 部完整的网络小说(2022 年前)——不同的流派、作者、时代,并且可能不在训练数据中。
它们的 AI 检测率为:22.7%、24.2%、25.0%、24.5%、19.0%、13.7%、29.1%、4.9%、27.3%、19.2%——都在 30% 以下。我还抽样了随机 Lofter 同人文;因为它们更随意,检测率通常低于 10%。但当我输入我怀疑是 AI 生成的文本时,检测率飙升至 83.4%,强烈表明使用了 LLM 而没有披露。
[2026 年 3 月 5 日更新]为了进行更严格的测试,我随机抽样了 10,000 篇高互动(浏览次数 >5000)、长篇幅(字数 >2000)的 Lofter 同人文,全部发布于 2022 年之前。它们的 AI 检测率分布(使用 7 模型投票,≥2 票):
使用 60% 作为阈值 → 假正率:0.04% 使用 70% → 假正率:<0.01%(实际上为零) 上面 60% 的四篇文本都是合集索引,不是实际的故事——由于链接过多而被标记。
即使在 50% 的阈值,假正率也仅为 0.33%。
然后,我抓取了 Lofter Android 前 20 个热门标签(周榜单)的所有文章,按长度过滤,并运行检测:
32.22% 的文章得分 >50% AI——可能部分或全部是 AI 生成的……还有人类吗??而且,没有一篇主动声明是 AI 生成的内容。
"法末劫时,,,"——一个群友
好吧,我们已经构建了一个 AIGC 检测器。现在该构建一个反检测器了。
不,开玩笑。我没那么无聊。
但让我们测试一些常见的反 AIGC 检测技巧:
谷歌翻译往返(CN→EN→CN):89.9% → 85.0% 有道翻译(CN→EN→CN):89.9% → 79.2% 搜狗翻译(CN→EN→CN):89.9% → 86.0%
略微下降,但仍然被明确标记。
使用"魔法"提示词让 LLM 输出看起来更不"AI"——从一开始就听起来很荒谬!
测试单行提示词:重写上述文章以最小化 AI 风味:89.9% → 83.0%
还尝试了更复杂的提示词:89.9% → 79.3%
略有改善,但在实践中仍然毫无意义。
这种检测方法太强大了!(flag
如果我真的想绕过它,我唯一的想法是在大量人工文本上微调 LLM,或构建一个庞大的基于规则的系统来手术式地破坏 SVM 匹配的特征。但这超出了本文的范围。不确定它是否有效。或者也许有更好的方法——留给读者作为练习。
现在,是时候闭幕碎碎念了。
我坦白地说没有预料到这个分类任务会这么简单——简单到一个 scikit-learn"Hello World"脚本,只需最少的迭代和一些硬编码的规则,就能产生一个相当强大和准确的检测器。大部分工作只是等待 LLM 生成数据……
有雄心的读者可以按照这种方法为其他领域训练检测器——比如说,学术论文 AIGC 检测。添加一个炫目的前端,你就有了一个可以卖给绝望大学生的工具。如果你赚钱了,别忘了捐一点。
另一个想法:检测 AI 生成的图像。但随着 Stable Diffusion 和易于微调的 LoRA,视觉风格远比文本多样——这个任务会困难得多。而且写完这篇后,我三分钟的热情已经耗尽了。也许下次吧。
最后,关于 AI 生成内容的一些话:我不认为 AI 生成的娱乐内容是合法的创意作品。就像 AI 编码工具产生臃肿、难以维护的代码一样,AI 生成的文本、图像和音频初看起来不错,但经不起仔细检查——重复、肤浅、可预测到连字频统计都能抓住。这种模式从根本上不适合真正的创作,作为读者,我深感不满意。我开始怀疑 LLM 所谓的"创意写作"只是一堆后训练数据被无限地重新组合和反刍。
但话又说回来,"世界应该是这样"从来都不等于"世界就是这样"。虽然 LLM 带来了创新和生产力提升,但滥用和虐待正在各个行业无情地蔓延。而且由于 LLM 经过微调以利用人类感知,谁知道它们是否真正"理解"什么,或只是记忆模式?在修补了无数像"3.9 还是 3.11 哪个更大"或"我应该步行还是开车去 50 米外的洗车房"这样的无尽 bug 后,我们真的能说模型理解世界吗?
大家都陷入了辩论:什么是 LLM?它将如何颠覆我的行业?AI 会把人类带向何方?没人有答案。
至少我很高兴我在 AI 时代之前学会了编程。否则,我可能不会意识到今天的感觉驱动代码有多愚蠢。至于未来?要么生成式 AI 把人类社会秩序砸得粉碎,要么 AI 泡沫破灭,内存变得免费。无论哪种方式,听起来都不错,不是吗?
本文采用 CC BY-NC-SA 4.0 许可证。
作者:lyc8503,文章链接:https://blog.lyc8503.net/en/post/llm-classifier/ 如果这篇文章对你有帮助或有趣,可以考虑给我买杯咖啡¬_¬ 欢迎在下方用英文评论 o/