踩坑3周,我在实验室内网搭了个零公网请求的论文AIGC筛查本地系统
搞AIGC内容本地筛查的这三周我人都麻了之前先后试了GPTZero、Originality.ai、团象AIGC检测、Crossplag、Copyscape、PaperPass旗下的AI检测全不好用。这些工具要么强制要求把全文上传公网服务器要么对理工科论文的公式部分误判率高到离谱完全满足不了我们内网涉密场景的使用需求。我们实验室的涉密论文库完全物理断网所有产出的学术内容绝对不允许出内网之前采购的重复率校验系统根本没有覆盖AIGC内容筛查的能力。之前组里抽查毕设的时候抓到过好几个学生用大模型写的实验章节靠人工核对根本查不过来攒了小半年的预算本来想采购商用本地部署系统。结果问了一圈符合内网部署要求的商用系统单年授权费都要十几万我们这种小课题组的年度算力预算才8万根本掏不起这个钱只能硬着头皮走开源方案二次开发。最开始选底座的时候图省事直接拿了开源的roberta-base微调用公开的AIGC数据集跑测试出来的效果看着还行一上我们自己的论文样本直接崩了。我们拿100篇纯人工写的、包含大量公式推导的研一课程论文做测试误判率直接冲到了38%将近四成的人工内容都被标成了AI生成完全没法用。翻了半个月顶会论文最后参考了ACL 2024上《DetectLLM: A Dual-Branch Framework for Academic LLM-Generated Content Detection》的方案定了双分支的核心架构。第一分支走人工特征硬校验不需要调用任何大模型算力直接从文本里提取困惑度、重复NGram占比、句长分布方差、专业标点使用频率4个核心维度。import torch from transformers import GPT2LMHeadModel, GPT2Tokenizer def calc_perplexity(text: str, model, tokenizer) - float: inputs tokenizer(text, return_tensorspt, truncationTrue, max_length512) with torch.no_grad(): outputs model(**inputs, labelsinputs[input_ids]) return torch.exp(outputs.loss).item()我把预训练好的GPT2-small权重提前下到本地跑这个特征的速度极快1万字的文本10毫秒就能出结果完全不占GPU资源。这个分支出的结果先做一轮初筛困惑度低于60的文本直接标记高风险能过滤掉70%以上的纯AI生成的内容直接给后续大模型推理减负。第二分支走语义特征软校验用Qwen-7B做基础底座专门针对学术论文的专业术语、公式上下文、实验逻辑链做特征对齐。最开始我图方便直接用网上爬的10万条公开AIGC数据做训练集微调完出来的模型对带Latex公式片段的内容敏感度极高随便两三个公式就被标成AI生成。后来组里5个人分了一周时间手动标了过去3年实验室产出的2100篇人工撰写的硕博论文以及用不同大模型生成的同主题2100篇AI内容凑了4200条1:1的标注数据集。最开始微调的时候忘了开梯度检查点跑第一个epoch的时候直接报CUDA显存溢出3090的24G显存直接被占满连远程桌面都直接断开。RuntimeError: CUDA out of memory. Tried to allocate 186.00 MiB (GPU 0; 23.69 GiB total capacity; 22.14 GiB already allocated)后来在模型加载参数里加了gradient_checkpointingTrue直接把训练时的显存占用压到16G以内连batch size都不用从8降到2一周不到就跑完了3轮全量微调。微调完之后我们拿之前标注的100篇疑难样本做测试其中50篇是人工写的、包含大量公式和半文言古文引述的论文片段50篇是用不同大模型生成的、加了很多人工修改痕迹的AI内容。最终测试结果显示误判率直接降到了2.3%漏判率也只有2.1%比市面上绝大多数商用的检测工具表现都要好当时整个组都差点欢呼出来。模型推理部分一开始直接用原生的transformers流水线跑单篇1万字的论文推理耗时要17秒赶上学生毕设季几十个人同时提交任务后台直接排了几百个请求卡到半小时才出结果。后来换成vLLM做连续批处理推理支持同一时间批量处理多个请求不用等上一个请求完全跑完再处理下一个性能直接提升了一个量级。python -m vllm.entrypoints.openai.api_server \ --model ./finetuned-aigc-detector-7b \ --gpu-memory-utilization 0.85 \ --port 8000 --tensor-parallel-size 1因为我们实验室只有单张3090 24G显卡我把显存利用率阈值设到了0.85刚好可以放下整个7B量化模型和vLLM的KV缓存后续长时间跑也不会出现OOM报错。优化完推理性能之后同一时间能处理12个用户提交的筛查任务单篇万字论文的推理耗时直接压到2秒以内完全满足课题组几十个人同时使用的需求。部署的时候我们特意把所有的预训练模型权重、训练数据集、推理服务全放在物理断网的内网服务器上防火墙直接封了出站的所有公网端口连DNS请求都出不去。后续我们做了个轻量的Web前端直接对接实验室现有的论文管理系统用户上传word、pdf格式的论文之后后端自动转成纯文本走筛查流水线全程没有任何数据流出内网。为了避免有人恶意提交超大文档跑满GPU资源我们还加了任务队列的优先级控制导师提交的审核任务优先级最高学生提交的普通筛查任务默认走后台异步队列。另外我们还做了很多商用工具根本不会给你开放的自定义配置功能支持把特定作者的全部过往内容加入白名单筛查的时候直接参考该作者的专属写作特征。所有被系统标记为高风险的内容都会自动推送到实验室教学秘书的后台支持人工复核标记标记后的样本会自动加入训练集不断迭代优化模型的准确率。上周我们专门拉了之前采购商用工具的时候存的100份漏判/误判疑难样本做了一轮多方案的对照测试出来的结果直接把组里的人都惊到了。检测方案漏判率纯AI内容误判率人工内容单篇万字耗时商用本地工具A19%27%12s商用本地工具B12%21%18s我们自研的方案2.1%2.3%1.8s这个结果出来之后我们直接把之前签的商用工具年授权合同给退了省下来的几万块预算刚好可以买两块4T的固态存后续的标注数据集还能加一块P40显卡做备份服务。现在这套系统在实验室跑了快两周已经筛了300多篇毕设论文目前还没出过一次误判漏判的情况之前人工筛查的工作效率直接提升了10倍都不止。接下来我们还打算做几个优化迭代先用AWQ量化把7B模型压缩到3B参数量把模型体积压到6G以内这样普通的x86服务器不带独立显卡也能跑起来。等量化版本调通之后我们打算把这套完整的方案打包成一键部署包发给几个同系没有算力资源的兄弟实验室用完全不用他们掏一分钱的授权费。后续还打算加一个手写体OCR的扩展分支对接上实验室的扫描设备直接把手写的纸质实验记录本识别成文本做AIGC筛查覆盖更多内网内容合规校验的场景。回头看这三周踩的坑感觉完全没必要花几十万买那种商用闭源的本地部署系统有算力有标注数据的小团队完全可以自己搭一套更适配自身场景的方案。现在这套系统所有的代码我们都传到了实验室内部的Git仓库里后续谁有新的需求直接提PR迭代就行完全不用被商用工具的更新节奏卡脖子。