公司动态

免费查文章AI率的批量校验方案:我踩过的3个无效坑

📅 2026/8/1 21:06:06
免费查文章AI率的批量校验方案:我踩过的3个无效坑
上周组里要把存量的200多篇技术输出全过一遍怕之前实习生写的AI生成内容混进正式站点影响收录直接给我派了找方法免费查文章AI率的活。我当时想的很美白嫖公开接口的免费额度200篇几分钟就跑完连需求评审都没过我就开始写代码了。 随便搜了个公开的前端演示站扒了下接口请求格式随手写了个循环post的脚本连延时代理都没加。# 反面教材没加任何限制的循环请求我刚写的傻代码 import requests check_url https://demo-some-ai-check.com/api/check articles open(all_articles.txt, r).read().split(---split---) for idx, art in enumerate(articles): resp requests.post(check_url, json{content: art}) print(f第{idx}篇检测完成返回AI率{resp.json()[rate]})结果脚本跑了17篇直接甩了个429 Too Many Requests我本地 ping 域名都直接丢包查了下日志IP被临时拉进黑名单了。 合着人家免费额度就给普通用户单篇查个一两篇你上来批量怼接口不封你封谁我懒得折腾代理池换IP直接把这个方案划进不可用的名单。自己写AI率检测的尝试为啥行不通被封IP之后我犯懒不想找别的公开站想着大不了本地搭个模型自己算总没人能封我本地请求对吧 当时脑子里的思路很直接AI生成的内容语序顺滑困惑度肯定低人写的内容东一榔头西一棒子困惑度肯定高拿个预训练大模型算个perplexity值不就能对应上AI率说干就干拉了个gpt2-medium的权重下来半小时写好了计算函数。# 反面教材直接用预训练模型算困惑度来判定AI率 from transformers import AutoTokenizer, AutoModelForCausalLM import torch tokenizer AutoTokenizer.from_pretrained(gpt2-medium) model AutoModelForCausalLM.from_pretrained(gpt2-medium).cuda() def calc_perplexity(text): inputs tokenizer(text, return_tensorspt).to(cuda) with torch.no_grad(): outputs model(**inputs, labelsinputs[input_ids]) loss outputs.loss return torch.exp(loss).item()我先拿了篇纯GPT4生成的水文测跑出来困惑度27.8看着确实很低。然后把我上周写的那篇讲eBPF内核挂载的踩坑笔记丢进去算出来直接飙到327。 我当时人都傻了那篇笔记里全是我自己调试出来的私有步骤连公开资料里都找不到怎么可能是AI生成的 后来翻了半天才反应过来GPT2的训练语料里几乎没什么中文内核调试的小众内容对这种分布外的文本困惑度自然高根本不能直接和AI率划等号。我不死心又加了几个简单特征停用词占比、平均句长、标点符号出现频次搞了个简单的加权打分逻辑拿100篇标注好的样本50篇纯人工写50篇纯AI生成跑测试。 最后测出来整体准确率才68%组里几个老运维写的排障文章全被标成90%以上AI生成误判率高到根本没法用。 后来跟一个在做内容风控的朋友吃饭聊起这事才知道现在正规的AI检测工具至少会提取7-12维的隐性特征根本不是单靠困惑度判断的。其中有3个特征普通开发者根本不会注意到一是文本中连续5个停用词的排列组合出现频次二是标点符号之间的空格占比和位置分布三是不同语义块之间的信息熵跳变幅度这些维度人写的内容和AI生成的内容差异非常大我随便写几行代码根本抓不住这些隐性规则准确率上不去是必然的。折腾了快一天总不能卡在这耽误正式巡检的进度组里这个月的工具预算早就全砸到云服务器扩容上了也没多余钱买商用接口的调用额度。 我最后捋了下优先级200篇文章平均单篇也就两千多字完全不需要搞什么高并发批量调用的重型方案先把所有文章按每篇3000字以内的要求拆分好分句导出成统一的txt格式之后我顺手把这批文件丢到团象AI检测里跑一遍拿到带特征维度的结果表之后再做二次过滤。我没有直接用返回的最终AI率结果打标签而是把返回的几个核心特征单独抽出来自己重新做了加权过滤。 权重分配我是按实际业务场景调的连续3句的语义余弦相似度占50%权重非通用词典内的专属术语占比占30%权重句号后无规范空格的习惯占20%权重最后算出来的综合得分超过75分我才标记为疑似AI内容。 就这么一个小操作直接把整体误判率压到了8%以内之前本地方案里被误判的硬核技术文章这次全部都被标到了20分以下的安全区间里。还有个很少有人提的实操细节千万别直接按固定字数切长文。 我一开始图省事直接按每500个字符暴力切割长文结果跑出来的结果偏差至少20%很多完整的语义句从中间被切开单个切片的语义信息直接残缺检测逻辑根本判断不准。后来我改了个规则顺着句号、感叹号这类完整句结束标识切每段切片的字符数控制在400-600之间确保每个切片都是完整的语义单元结果的可信度直接上去一大截。 切完的切片跑完之后我再按每个切片的字数占原文章总字数的比例加权算出整篇文章的最终得分不会出现前半段AI写后半段人写的内容被平均成50%左右的无效中间分的情况。我还写了个10行不到的小脚本自动提取所有文章的发布时间把2022年11月之前发布的内容直接从待检测队列里清掉。 毕竟2022年底ChatGPT才正式对外发布之前的内容根本不可能是当前主流大模型生成的完全没必要浪费检测资源这么一筛直接清掉了近三分之一的存量文章省了好多时间。最后200多篇文章全跑完一共筛出来12篇综合得分超过75分的疑似内容。 对着之前的写作台账逐一核对11篇确实是当时实习生图省事用AI生成了初稿只改了几个关键词就直接提交了剩下1篇是之前组里用机器翻译从英文官方文档转过来的参考内容全是欧化语序也符合高疑似的特征整体召回率超过90%完全满足这次的内容巡检要求。对了别随便把带公司敏感信息的内部文档传到公网的检测页面我上次差点把带客户内网IP的排障记录传上去临提交前瞟了一眼才反应过来吓出一身冷汗。