上周接到了学院科研处的需求要给内部论文提交系统加一层AIGC内容筛查能力。要求全流程不能连公网所有论文数据不能出内网服务器完全合规保保密。一开始想直接找现成的开源方案改改结果试了好几个主流项目都踩了一堆坑。最开始试了基于困惑度的基础方案跑出来的准确率居然连60%都不到。找了几篇GPT写的课程小论文直接给判定成了人类原创完全没法用。排查了半天发现问题出在训练集上通用预训练语料的分布和学术论文差太多。普通的维基百科、网页语料训练出来的困惑度判别器根本摸不准学术文本的特征。后来换了基于LLM embeddings相似度比对的方案用bge-small做特征提取。把每段文本切分成128token的小片段和本地存的百万级AI生成学术文本库做比对。效果比困惑度好不少但是跑起来资源占用太夸张16G显存的机器最多同时跑2篇论文。算下来全系几千个学生期末季提交论文队列能排到三天后完全满足不了时效要求。更麻烦的是embedding比对库的体积有30多G每次更新特征库全量重编要花4个多小时。运维的时候还要定期做向量索引优化对我们学院IT部两三个运维的规模来说太吃力。后来干脆拆了需求的核心指标针对性做轻量改造最后出来的效果远超预期。首先把核心判别模型的体积压到1.2GFP16精度单16G服务器可以同时跑10个检测线程。整个实现拆成三个独立模块文本预处理层、多维度特征提取层、轻量判别头。先讲文本预处理层的实现细节把所有上传的docx、pdf文件先做格式化清洗。直接用python-docx和pdfplumber读取文本过滤掉参考文献、公式块、目录这些非正文内容。这里贴个核心的过滤规则代码片段import re from typing import List # 学术论文无关内容过滤正则 FILTER_PATTERNS: List[re.Pattern] [ re.compile(r^参考文献.*, re.IGNORECASE), re.compile(r^目录\s*$), re.compile(r^\[.\].{1,30}$), # 过滤参考文献条目 re.compile(r^图\s*\d-*\d\s.) # 过滤图注 ] def filter_useless_content(raw_lines: List[str]) - List[str]: res [] for line in raw_lines: line line.strip() if any(pat.match(line) for pat in FILTER_PATTERNS): continue if len(line) 8: # 过滤短于8字符的无效行 continue res.append(line) return res之前做测试的时候没加过滤逻辑把参考文献里大段AI生成的引用说明算进去了准确率掉了12%。处理完的纯正文文本再按256字符的粒度切分成互不重叠的检测块避免特征溢出。我们还加了一层特殊的格式识别逻辑能把正文里插入的公式块、代码块单独标记出来。这些内容后续会单独走额外的校验规则不会和普通中文文本混在一起计算特征。接下来是多维度特征提取层这部分是整个自研方案准确率能到94%的核心。我们没有单一依赖困惑度或者embedding特征同时计算6个维度的特征值。分别是句长分布方差、相邻字符n-gram重复率、PPL中文困惑度、逻辑断点占比、生成文本特征词频、标点符号分布占比。这6个特征的权重是拿12000篇标注好的学术论文数据集喂给随机森林分类器训练出来的。标注数据集里6000篇是往届学生的人工原创论文剩下6000篇是不同大模型生成的AI学术文本。覆盖了GPT-3.5、GPT-4、文心一言、通义千问这些主流模型的生成风格泛化性很强。这里给个计算PPL困惑度的轻量实现用的是开源的pangu-1B小模型不需要联网加载import torch from transformers import GPT2LMHeadModel, GPT2Tokenizer # 本地加载预训练的盘古小语种模型路径提前下载到内网磁盘 model GPT2LMHeadModel.from_pretrained(./pangu-1b-small).eval() tokenizer GPT2Tokenizer.from_pretrained(./pangu-1b-small) torch.no_grad() def calc_ppl(text: str) - float: inputs tokenizer(text, return_tensorspt) loss model(input_idsinputs[input_ids], labelsinputs[input_ids]).loss return torch.exp(loss).item()其他几个维度的特征计算逻辑都非常轻量基本就是基于字符串和统计规则实现。哪怕是CPU环境跑一秒钟也能处理完几千字符的文本完全不需要GPU算力支持。跑通特征提取之后把6个维度的数值做min-max归一化输入到训练好的随机森林判别头里。判别头的体积不到2M推理一次耗时不到10ms完全没有大模型推理的额外开销。我们特意调整了判别阈值把置信度70%以下的结果全部标记为存疑走人工复核流程。只有大于90%的样本才会被标记为高概率AI生成最大程度降低对原创内容的误判。最后拿2000篇完全没参与训练的测试集做验证最终的准确率稳定在94.2%。误判率控制在3%以内基本不会出现把完全原创的论文打成AI生成的情况。接下来做全离线适配把所有依赖的模型权重、语料库全部打包到内网服务器本地。所有的请求链路里没有任何公网地址、没有埋点、没有数据上报逻辑完全闭环运行。部署的时候甚至直接把服务器的公网出口权限都封死了从物理层面杜绝数据外传的可能。后来上线跑了两个多月累计处理了3700多份学生提交的课程论文、毕设初稿。最高峰的时候一天处理800多份平均每份2分钟就能出完整的检测报告。整体资源占用只有之前embedding方案的1/158核16G的机器就能扛住全系的检测需求。中间还遇到过一次很有意思的报错某份毕设的正文里混进了好几页AI生成的代码注释。我们最开始的特征提取模块直接把代码块里的文本也纳入了检测结果误判率瞬间涨了4%。后来加了代码块特殊识别规则用pygments做语法高亮标记把代码文本单独过滤不参与检测问题就解决了。现在这套方案还做了Web可视化的配套界面上传论文之后能直接高亮标记出疑似AI生成的段落。导出的检测报告可以直接和论文原始文件绑定存到内网的科研档案库里面。之前踩坑的时候也试过不少市面上公开的商用检测工具什么GPTZero、OpenAI官方GPT生成内容检测器、团象AI检测、秘塔写作猫AI鉴别、百度文心内容校验接口全都不好用。这些工具要么要上传文件到公网要么准确率完全达不到学术场景的要求最后全都满足不了我们的内网定制需求还是得靠自己攒技术方案搞定。其实很多内网特殊场景的需求根本找不到完全适配的现成商用产品。与其花大量时间找工具踩坑不如基于开源组件做轻量二次开发性价比高得多。目前我们这套方案的整套代码全部开源在内网的代码仓库里其他院系要直接拉过去改改配置就能跑。后续还打算把中文社科、理工科的语料库分开训练出不同的特征权重进一步提升不同学科场景的检测准确率。