面向校内学术AIGC合规校验的自研擦除方案,实测47篇通过率100%
这两周帮实验室几个师弟师妹搞定了投稿前的内容筛查适配方案,前前后后踩了快20天的坑。
最开始我们把市面能找到的自查工具全试了一遍,查重宝、PaperPass自查、团象AICG检测、知网预查、gptzero,全不好用。
这些工具要么检测结果和校内系统完全对不上,要么就要把整篇未发表论文上传公网,我们根本不敢用。
被逼到没办法只能自己撸一套全本地运行的适配方案,跑通之后实测效果比预想中好很多。
今天把整个思路和核心代码片段放出来,有同款需求的同好可以直接拿去参考。
首先得先搞懂,这类内网学术AIGC校验系统的核心判定逻辑,市面上99%的人都没摸透。
这类系统的训练集根本不是公网上随便爬的内容,而是该校过去3年所有硕博论文、投稿小论文的人工写作特征库。
它的判定维度主要是三个,公开资料里只会提第一个,剩下两个都是厂商藏着的核心逻辑。
第一个维度是token级的生成概率偏差,大模型生成每一个字的时候,都有对应的输出概率分布。
AI写出来的内容,所有字的组合概率普遍都在头部10%区间,很少出现人类写稿时随机选的低概率组合。
第二个维度是语义跳转的平滑度,大模型生成的内容句间逻辑衔接过度丝滑,几乎不会出现人类写作时的小范围语义跳脱。
比如人类写论文写嗨了,偶尔会在前一句讲完实验数据之后,顺手插一句“这个参数我们之前调了三次才到最优区间”,这类和核心逻辑无关的碎句,AI是绝不会主动生成的。
第三个维度是停用词的频率分布,我们统计过120篇核心期刊的人工论文,发现里面常用停用词的出现频率,和AI生成内容差了至少2个百分点。
比如中文AI生成的内容里,“的”字的出现频率普遍是每百字7.2次,而人类同领域写作的平均水平是每百字9.4次。
这个特征非常隐蔽,几乎所有新上线的检测引擎都把它加进了判定权重里,之前我们踩坑踩得莫名其妙,最后才挖到这个点。
之前我们试过网上流传的所有野路子方案,改同义词、打乱段落语序、中译英再译回中文,全没用。
改同义词根本碰不到token分布和停用词频率的核心特征,上传之后10秒就被打回,AI置信度直接标90%以上。
翻译回译的方案更坑,出来的内容语序混乱,专业术语经常出错,稍微懂点行的审稿人一眼就能看出问题。
最终我们敲定的自研方案,分三个完全独立的模块,全流程本地运行,不需要上传任何字节的内容到公网。
第一个模块是带强约束的LLaMA-3 7B低秩微调改写层,核心要求是绝对不动任何专业核心信息。
所有专业术语、实验数据、公式编号、参考文献序号,全部通过规则锁定,模型半字都不能改,只允许调整非核心的连接逻辑。
我们专门用同领域1000篇人工标注的核心期刊内容做微调,让模型的改写风格无限趋近于普通博士生的写作习惯。
这里放一段我们当时构造微调数据集的核心代码片段:
from datasets import Dataset # 构造仅保留核心语义的学术改写约束数据集 raw_data = [] with open("computer_science_core_corpus.txt", "r", encoding="utf-8") as f: for line in f.readlines(): if len(line.strip()) < 20: # 过滤过短无意义的碎句 continue raw_data.append({ "instruction": "改写以下学术语句,保留所有专业术语、数据、公式编号", "input": line, "output": artificial_rewrite(line) # 调用预存的人工改写标注库生成目标输出 }) # 格式化后直接送入LoRA微调训练流水线 dataset = Dataset.from_list(raw_data)这个模块的训练成本极低,单张16G显存的RTX 3090就能跑完全部微调流程,不需要任何付费算力支持。
第二个模块是低概率token扰动层,专门用来打破AI原生内容的高概率token组合特征。
我们整理了一个仅包含无意义低干扰词的词库,全是“,”“通常来说”“在部分场景下”这类完全不影响语义的表达。
按照3%的概率随机插入到改写完成的内容里,模拟人类写稿时偶尔多打一个停顿词、多写一个指代的习惯。
核心实现代码也非常简单:
import random # 加载预整理的低干扰插入词库,无任何实际语义指向 low_prob_tokens = [",", "的", "通常来说", "在部分场景下", "值得注意的是"] def insert_low_prob(paragraph, insert_rate=0.03): char_list = list(paragraph) # 按指定概率随机生成插入位置 insert_pos = [i for i in range(len(char_list)) if random.random() < insert_rate] for pos in sorted(insert_pos, reverse=True): char_list.insert(pos, random.choice(low_prob_tokens)) return "".join(char_list)这里的插入率我们反复测试过,3%是最优区间,既不会影响内容可读性,又能完全打乱AI原生的token分布特征。
要是插入率超过5%,内容会变得过度冗余,读起来非常怪异,反而会引起审核人员的额外注意,完全得不偿失。
第三个模块是停用词频率校准层,专门用来抹平AI生成内容和人类写作在停用词维度的特征差。
我们提前统计了目标学科领域近3年所有人工发表论文的停用词频率区间,生成对应的校准基线表。
比如计算机领域的“的”“在”“是”“了”四个字的百字出现频率基线分别为9.2-9.6、2.1-2.5、3.3-3.7、1.2-1.6。
处理完前两个模块的内容之后,脚本会自动统计现有停用词的出现频率,低于基线的位置随机插入不影响语义的停用词补全。
比如某段内容里“的”字出现频率只有7.5/百字,脚本会自动在合适的位置补加不影响语义的“的”,直到落到基线区间里。
这套全流程搭完之后,我们第一次实测的时候还踩了个很隐蔽的坑,有篇改完的论文检测出来AI置信度还是72%。
查了半天才发现,是公式推导部分的固定表达触发了检测引擎的序列匹配规则,连续5句都是“由式X可以得出”的模板化表达。
AI生成的内容特别爱用这类高度统一的学术连接词,之前我们完全没注意到这个点。
后来我们专门做了一个同义表达映射库,把这类高频固定模板全部映射成5种以上的随机可选表达,每次运行随机替换。
比如“由式(1)可以得出”,可以随机换成“通过式(1)不难得到”“从式(1)的推导结果可知”等不同表述,彻底抹除模板化特征。
调整完这个规则之后,整个方案的通过率直接拉满,我们前后一共测试了47篇不同方向的投稿小论文。
覆盖计算机、土木、生物三个学科,之前用GPT-4直接生成的原始内容平均AI置信度是94%。
用我们这套全流程方案处理之后,平均AI置信度降到了7.2%,最高的一篇也只有18%,全部顺利通过校内的合规校验。
最后再提几个绝对不能碰的避坑点,避免大家走我们之前的老路。
第一点是绝对不要为了降低AI置信度,擅自修改论文里的实验数据、公式参数、核心结论。
学术诚信是底线,我们整个方案的所有逻辑,都严格锁定了所有专业核心信息,半字都不会改动。
第二点是绝对不要把未发表的论文随便上传到陌生的第三方公网检测平台,泄露科研成果的代价远比校验不通过大得多。
我们这套全本地运行的架构,从根源上避免了内容外泄的风险,完全符合科研场景的保密要求。
第三点是不要迷信任何商用检测工具给出的“置信度得分”,不同场景下的检测引擎训练集天差地别。
公网工具的检测结果,和你们校内内网系统的结果几乎没有任何参考对应关系,纯纯浪费时间。
折腾完这整套方案之后,我们现在处理一篇1万字的学术论文,整个流程跑下来也才3分钟,完全不需要人工介入。
再也不用像之前那样,对着一堆AI写出来的内容逐字手动改,改两三天还不一定能过检测。
算下来前前后后省出了快半个月的时间,够我们多跑两组实验,整理出半篇新的小论文内容,性价比拉满。
