简而言之与演示
截至2026年初,主流大语言模型生成的文本呈现出很强的统计规律,可以使用传统机器学习模型将其与人类撰写的内容有效区分开来。这或许就是很多所谓 "AI抄袭检测器" 的底层工作原理。
在线演示地址为:https://lyc8503.github.io/AITextDetector/ 。本演示使用的模型并非基于通用数据训练,也未经过严格的优化和迭代。在测试集上,其单句检测准确率约为85%。使用前请通读本文,了解潜在的局限性。
核心代码(草稿)和训练好的模型文件可在GitHub上获取:lyc8503/AITextDetector 。
背景(也就是无用的闲聊)
半年前作者还在学校写论文时,就有关于检测论文是否为AIGC(AI生成内容)的传言。作者测试了知网、万方等平台,还有一些第三方AIGC检测服务,发现它们确实能以相当高的准确率区分手写文本和大语言模型生成的文本。
这激起了作者对AIGC检测实际工作原理的好奇(以及如何绕过它)。但当时作者要处理的事情太多,经过几次失败的尝试后,就把这个想法搁置了。
最终,作者糊弄过了论文,生活继续。但最近,作者在浏览Lofter时,偶然发现整个标签下充斥着低质量、风格严重不符的AI生成同人文。
作者一眼就能看出是AI生成的,因为有些作者甚至在发布前都不清理Markdown格式或AI生成的章节标题,还把文章的一半内容设置成付费阅读。
不过,大多数AI生成的文本更难察觉,它们隐藏在多样的写作风格、不同的提示词中,并不容易一眼看穿。等意识到哪里不对劲时,已经晚了。有些文本几乎无法证明是AI生成的,这让作者变得疑神疑鬼。在读了几篇AI生成的垃圾文章后,作者受够了,决定构建一个AI生成文本检测器。
研究尝试——无果
现在在网上搜索AIGC检测,几乎全是广告。作者在这些噪音中找到了一种叫做 [文本困惑度] 的方法。
这个方法的原理很简单:使用现有的大语言模型来估计每个单词在给定句子中出现的概率。如果几乎每个单词在大语言模型的预测中排名都很高(Top - N),那么这个句子很可能是AI生成的。反之,如果很多单词都在意料之外,那么它更可能是人类撰写的。
听起来很有希望,对吧?但作者花了一些时间尝试这种方法,结果令人失望,有大量的误报和漏报,而且无法设置合理的阈值。此外,还存在实际问题:推理成本高、跨模型泛化能力差、难以在本地部署大模型,以及封闭权重模型难以集成。总体而言,这种方法既不优雅也不可靠。
一次(还算)成功的尝试——scikit - learn SVM
既然网上的资源没什么用,那就回到传统方法。激活scikit - learn!根据其路线图,我们可以直接选择线性支持向量分类器(Linear SVC)和朴素贝叶斯作为分类任务的良好起点。
(悄悄说:这也符合作者的直觉——大语言模型在选词上有可检测的模式,即使是朴素贝叶斯分类器也应该能捕捉到这些模式。作者只是没想到信号会这么强。)
数据生成
传统分类器需要有标签的数据,所以需要人类撰写的文本和确认是大语言模型生成的文本进行训练。
作者从2023年从某个类似福特和河流的平台上抓取的数据中,筛选出2010 - 2022年(ChatGPT出现之前)发布的文章。只过滤掉了参与度极低或非常短的文章,然后随机抽取了近10000篇数千字的文本作为人类撰写的样本。
然后,作者使用大语言模型生成这些文本的章节摘要,再将摘要反馈给大语言模型,让它重新生成完整的文章。这样就得到了大致相同数量的大语言模型生成的样本,这些样本体裁多样,与原始人类内容非常匹配。
但大语言模型API的成本很高,作者不想为一个周末项目花几千美元,所以发挥了创意,利用了多个低成本或免费的API渠道:
- Gemini:使用CLIProxyAPI将Antigravity/Gemini CLI配额转换为API访问权限,只需花20美元左右购买一个AI Pro账户。
- 通义千问(Qwen):qwen - code可以让你逆向工程通义千问Plus API,免费使用。
- GLM - 5:运气不错,OpenRouter当时提供免费的GLM - 5公开测试版(Pony Alpha)。
- Kimi、Deepseek、豆包、GLM - 4.7:在促销编码计划期间注册,首月8.9美元,即可解锁API访问权限。
需要说明的是,这并非推荐做法。这些行为违反了平台的使用条款,可能会导致被封禁。但平台忙着搞营销噱头,根本无暇顾及,而作者也不想付全价。
许多专注于编程的大语言模型API奇怪地按调用次数收费,但可以通过将任务批量处理成大量输入来优化这一点,迫使大语言模型每次调用生成更多内容。
最终,作者使用gemini - 3 - flash生成摘要,使用七个不同的模型(gemini - 3 - pro、qwen - coder - plus、glm - 5、glm - 4.7、kimi - k2.5、doubao - seed - code、deepseek - v3.2)生成了七组大语言模型生成的样本。
训练
在数据生成进行到一半时,作者就迫不及待地开始训练了。
作者让Claude编写分类器代码,它直接把整个原始文本扔进模型,结果准确率达到了可疑的99.45%。Claude没什么用,作者还是自己来吧。
训练时,作者使用中文标点将所有文本拆分成句子,清理非中文/英文字符,然后应用scikit - learn的TF - IDF → LinearSVC。清理掉一些噪音后,句子级别的分类准确率仍达到了约85%!
单个句子携带的信息有限,但每个句子85%的准确率意味着对于一篇较长的文章,可以非常有信心地判断它是否是AI生成的。这个性能远超作者的预期。传统机器学习仍然很厉害,比那些只会问大语言模型 "嘿,这段文本是AI生成的吗?" 的愚蠢在线工具好多了。
完成所有数据处理后,作者尝试训练一个8类模型(人类 + 7种AI),但大语言模型似乎太相似了,可能是相互蒸馏的结果,所以分类效果很混乱,准确率只有约50%。
最终,作者训练了七个单独的二元分类器,并使用多数投票法:如果有≥2个模型检测到某个句子是AI生成的,就将其标记为可疑AI并高亮显示。
所有模型的准确率都超过了85%,F1值超过了80%,相当不错!作者还注意到,AI生成的文本经常会被多个模型标记,所以投票法很有意义。
作者尝试了MultinomialNB和SGDClassifier,但准确率略有下降。BERT有一点提升,但需要太多GPU时间,所以放弃了。作者甚至测试了AutoGluon,但它的二元分类准确率只有53%。
用于网页演示的JS实现
到这一步,作者本可以直接发布代码库,但每次都启动Python太不方便。作者本可以托管一个Python API,但这意味着要维护服务器,这违背了作者严格的无服务器理念。
作者原本的计划是:将模型导出为ONNX格式,通过Wasm中的ONNX Web Runtime进行推理。但Claude偏离了计划,将模型修剪并导出为JSON格式,然后完全用JavaScript实现了TF - IDF + SVM,以便在浏览器中进行推理。
作者在一篇100万字的文本上进行了测试,在机器上大约需要10秒,还可以接受。对于典型的几千字的输入,几乎是瞬间完成。
既然这只是个演示,而且JS方法更透明,作者就保留这个实现。
至于准确率:作者测试了不同的特征限制。最终为了优先考虑性能,保留了50万个特征。以JSON格式存储,文件大小达到了107MB(不过在服务器端压缩后约为38MB)。较小的版本(5万 - 8万个特征)准确率只下降了3 - 4%,但最终的AI检测率差异很大,尤其是在人类撰写的文本上,相对差异达到了±50%,导致误报。所以作者还是选择了50万个特征。
最终准确率下降了约1%。
测试性能
以下所有测试均使用修剪后的网页版本,其性能应与完整的joblib模型相似。
当前逻辑:将输入文本拆分成句子,使用所有7个二元模型进行清理和分类。如果≥2个模型标记某个句子,就将其标记为可疑AI并高亮显示。最终AI得分是标记字符的比例。分类规则如下:
- <50%:人类撰写
- 50 - 70%:可能是人类撰写
- > 70%:可能是AI生成
首先,测试对常见模型(如豆包和Deepseek)的检测率,这两个模型都在训练数据中。提示词为:`给我写一篇3000字的故事`。很容易就检测出来了。
现在测试未见过的模型,泛化能力如何呢?作者测试了Claude Sonnet 4.6、GPT 5.2等,检测率都在70%左右,有些甚至超过了90%,很可靠。
作者还测试了更复杂的提示词,例如提供20章人类撰写的文本,让大语言模型模仿风格并继续创作。检测率略有下降,降至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%,强烈表明这些文本在未披露的情况下使用了大语言模型。
[2026年3月5日更新] 为了进行更严格的测试,作者从Lofter上随机抽取了10000篇高参与度(浏览量 > 5000)、长篇(字数 > 2000)的同人文,这些文章均在2022年之前发布。以60%为阈值,误报率为0.04%;以70%为阈值,误报率为 < 0.01%(几乎为零)。
然后,作者从Lofter安卓端的前20个热门标签(每周榜单)中抓取了所有文章,按长度进行过滤后进行检测,32.22%的文章AI得分超过50%,很可能部分或全部是AI生成的,而且没有一篇文章主动声明是AI生成的内容。
攻击与防御——绕过检测?
好了,已经构建了一个AIGC检测器。现在来测试一些常见的反AIGC检测技巧。
经典翻译方法
谷歌翻译往返翻译(中文→英文→中文):89.9% → 85.0%;有道翻译(中文→英文→中文):89.9% → 79.2%;搜狗翻译(中文→英文→中文):89.9% → 86.0%。检测率略有下降,但仍然能明显检测出来。
大语言模型提示方法
使用 "神奇" 提示词让大语言模型输出不那么 "像AI" 的内容,从一开始就听起来很荒谬!
测试单行提示词:`重写上述文章,尽量减少AI痕迹`:89.9% → 83.0%。作者还尝试了更复杂的提示词,89.9% → 79.3%。有一点改进,但在实际应用中仍然没有意义。
这种检测方法太强大了!如果真的想绕过它,唯一能想到的办法是在大量人类文本上微调大语言模型,或者构建一个庞大的基于规则的系统来精确破坏支持向量机匹配的特征。但这超出了本文的范围,也不确定是否可行,也许还有更好的方法,就留给读者去探索吧。
结语
说实话,作者没想到这个分类任务会这么简单,简单到一个scikit - learn的 "Hello World" 脚本,只需进行最少的迭代和一些硬编码规则,就能构建出一个相当强大和准确的检测器。大部分时间都花在等待大语言模型生成数据上了。
有雄心的读者可以按照这个方法为其他领域训练检测器,比如学术论文AIGC检测。再加上一个炫酷的前端,就可以把这个工具卖给急需的大学生了。
另一个想法是检测AI生成的图像。但由于Stable Diffusion和简单的LoRA微调,视觉风格比文本更加多样化,这个任务会困难得多。作者写完这篇文章后,三分钟热情已经耗尽了,也许下次吧。
最后,作者认为AI生成的娱乐内容不是真正的创意作品。AI生成的文本、图像和音频乍一看可能还不错,但仔细检查就会发现问题——重复、肤浅、可预测,甚至通过词频统计就能检测出来。这种模式从根本上不适合真正的创作,作为读者,作者深感不满。作者开始怀疑大语言模型所谓的 "创意写作" 只是对训练后的数据进行无休止的重组和重复。
但话说回来,"世界应该是怎样" 从来都不等于 "世界实际是怎样"。虽然大语言模型带来了创新和生产力的提升,但滥用和误用现象在各个行业都在不断蔓延。而且,由于大语言模型是经过微调以利用人类感知的,谁知道它们是真的 "理解" 了什么,还是只是记住了模式呢?
每个人都陷入了争论:大语言模型到底是什么?它将如何颠覆行业?AI将把人类带向何方?没有人有答案。
至少作者很高兴在AI时代之前学会了编程。否则,可能意识不到如今那些靠感觉编写的软件有多愚蠢。至于未来?要么生成式AI彻底摧毁人类社会秩序,要么AI泡沫破裂,内存变得免费。不管怎样,对作者来说似乎都还不错,不是吗?