起因挺无聊的。有段时间老觉得自己写的东西读着别扭,说不上哪不对,就是有股"AI 味"。加上现在网上中文文章里 AI 的占比肉眼可见地涨,就想,不如自己写个东西,至少发博客之前能过一遍。

现成的我也用过,腾讯朱雀那种。给个分数,你要问它为什么,它答不上来,黑盒。我想要的是能指着某一句说"这句像 AI"。所以最后还是自己训了一个。

模型不大,chinese-roberta 打底,一百来 MB。我没让它纯自己学,另外塞了一批能说清楚的特征,像破折号、冒号、括号里注名词、markdown 表格、几个套话词,还有句子长短的起伏。编码器一条路,特征一条路,最后拼起来判。

数据是最费劲的。能直接下的中文"人 vs AI"语料没多少,基本靠拼。人这边有 HC3、SemEval 的中文、中文维基,还有我自己一份份攒的真人技术博客和公众号;AI 那边有开源模型生成的、GPT-4 的、也有拿本机模型现造的。切的时候按生成器留、按领域留,不这么切,数字好看但没意义。

做下来最深的感受:架构不重要,数据对不对口才要命。最早我只用问答数据训,同分布上准确率九成五,自己都乐了,结果换一篇技术博客去测,直接歇菜。后来补了同领域、同来源的样本,跨生成器才起来。

还有个发现挺反常识。都说括号里解释名词、破折号是 AI 特征,我拿真人技术博客和 AI 的比,真人括号其实更多,因为要注原文名和年份,破折号也不少。真正稳的是套话密度、排比,还有句子长短太均匀。

除了分类,我加了一路叫"话语脚手架"的东西,专盯报幕句、对比句式、结尾的总结收口。有些文章词面洗得挺干净,行文的架子还在,人能感觉到,普通分类器却看不出来。拿它去测我自己那篇 7900 XT,一段一段能指出问题在哪。

中间坑了一个。工具在长文上老把结果判成 AI,逐段拆开又都是人。查了半天,是滑窗写法的问题:直接切 token 的时候,把句首句尾的特殊符号也切掉了,模型拿到的是残缺输入。改成按字符切窗、重新 tokenize 才正常。这种 bug 不蹲一晚上真找不出来。

代码在 GitHub:ZelyStaric/Simple_Chinese_Text_Ai_Detector 。脚本、特征、实验记录都在里面,数据和模型没传,一是大,二是版权。

最后说句实在的,AI 检测就是个移动靶,去味工具一直在更新,今天抓得到明天未必。当参考可以,当唯一依据不行。对我来说,能帮我把一篇文章挑出几处毛病,就够本了。