上周帮实验室导师审本科生的课程论文,连着扫3篇全标了高AI生成率,结果点进去一看全是学生手敲的课程作业,甚至还有人把实验记录里的笔误都原封不动粘进去了。 我一开始以为是学生耍滑,故意用AI写了作业再改点内容蒙混过关,翻了三个多小时2023到2024年ACL的相关会议论文,才把之前一直没太捋顺的AI检测算法原理给摸透了。这锅学生是真的不背。

我之前做系里助教的时候,还傻乎乎跟选课的学生说,别随便改几个同义词就想蒙混过检测,现在回头看,那时候我自己对这套东西的认知也错得离谱。网上大部分公开的教程,都把AI检测算法原理简化成了“找AI隐水印”的弱智说法,好像只要生成的时候没加水印,工具就完全识别不出来一样,纯纯误导人。

我把AI检测算法原理拆成大家能看懂的三层递进逻辑,没有任何玄虚的成分。说白了,现在主流的AI检测系统,根本不是靠什么预设的不可见水印判断,人家是靠三层递进的校验逻辑筛内容,你从头到尾捋一遍就知道为啥那么多手写内容会被误判。

第一层校验:大多数人知道的token概率差

大语言模型输出内容的时候,每往下生成一个字(业内叫token),都是先从候选词池里挑概率最高的那个输出。比如你问“水的沸点是多少”,模型99.9%的概率直接输出“100℃”,剩下的所有其他候选词的概率加起来都不到0.1%。 你换个角度想,普通人写东西根本不会有这么极端的选择差,比如你今天写日记想形容今天的风大,脑子里可能同时飘过“狂风大作”“风刮得脸疼”“吹得我连帽子都飞了”好几个选项,最后选的那个表述,和其他候选表述的概率差根本拉不开几十上百倍。 第一层校验就是统计整段文本所有token的top1和top2概率的平均差值,数值超过设定阈值直接归为AI生成。之前某高校的检测系统把鲁迅的《一件小事》标成AI生成上热搜,本质上就是那个破系统的阈值调得太松,鲁迅那种文字极其凝练、用词精准度远超常人的风格,刚好撞上了高差值区间,直接被误判。

第二层校验:很少有人提的语义分布匹配

大部分人以为检测逻辑到第一层就结束了,实际上稍微靠谱点的商用工具,都会在第一层之后过第二层语义分布拟合。 你换个角度想,所有大模型的训练语料,全是它 cutoff 日期之前爬的全网公开文本,它生成的所有内容的语义向量,一定是落在预训练语料的分布区域里的。你自己写的内容里如果带了完全私人化、从来没在公开网络上出现过的细节,这个语义点大概率会落在公开语料的分布边缘甚至外面,系统扫到这种点,直接就会判定是人写的。 具体数据我记不太清了,大概是去年ACL有篇针对AI检测鲁棒性的论文,测过1200篇完全由用户原创的私人叙事文本,过市面上头部的几款检测工具,平均误判率不到2%。比如你写“上周我在实验室煮泡面不小心把酸菜包撒到了服务器的电源键上,整台机器重启跑了3天的实验全没了”,这种完全没有公开出现过的内容,AI根本不可能生成出来。 当然了,很多小成本的检测工具根本没算力跑完整的768维以上的语义向量比对,所以你随便改改语序、插点没用过的私人细节,大概率就能蒙混过关。

第三层校验:几乎没人公开说的隐特征比对

很多人吹的什么“全文用AI写完之后,换同义词、改语序、加几个私人段子就能100%过检”,面对开了第三层校验的系统根本没用。 本质上第三层校验就是在查你行文的隐特征:包括你写东西的平均句长方差、介词的出现频率、标点的使用习惯、甚至连“的地得”的错用率都算进去,这些特征是你十几年写字练出来的肌肉记忆,AI哪怕把所有表层用词全换成你的风格,也很难模拟到这么细的程度。 不过这层校验有个前提,系统得提前攒够你本人至少几千字的历史文本当对照数据集,不然根本触发不了,这也是为啥普通用户用公开工具检测,随便改改内容就能过的核心原因。

打个比方,你可以把完整的AI检测算法流程当成火车站的三级安检:第一层先过安检门,金属探测器响了先拦下来排查大部分可疑人员;第二层过X光机,扫包里的物品结构是不是符合普通人的出行习惯;第三关遇到拿不准的,才会拉出身份记录核验,甚至开包手检。市面上90%的民用工具,为了省算力成本,直接只开第一层安检门,后面两层全关了,当然乱响误判。

我随手写了个极简版的第一层校验演示代码,用开源的小模型跑,你可以自己拿文本试,注意这只是最基础的逻辑演示,实际商用系统的特征维度比这个多几十倍:

# 极简版AI文本生成置信度差检测(仅原理演示,不可商用)
import torch
from transformers import GPT2LMHeadModel, GPT2Tokenizer

def detect_token_prob_diff(text: str, threshold: float = 0.7) -> int:
    # 加载轻量预训练模型
    tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
    model = GPT2LMHeadModel.from_pretrained("gpt2")
    inputs = tokenizer(text, return_tensors="pt")
    
    with torch.no_grad():
        outputs = model(**inputs, labels=inputs["input_ids"])
        # 提取每个位置的top1和top2候选token的概率
        probs = torch.softmax(outputs.logits, dim=-1)
        top1_probs = torch.topk(probs, k=1, dim=-1).values.squeeze()
        top2_probs = torch.topk(probs, k=2, dim=-1).values.squeeze()[:, 1]
        # 计算所有token的概率差平均值
        avg_diff = torch.mean(top1_probs - top2_probs).item()
    
    # 超过阈值判定为AI生成
    return 1 if avg_diff > threshold else 0

我个人觉得现在很多高校采购的、动辄报价几十万的AI检测服务完全是智商税,他们根本没做后面两层的校验,就靠第一层的token概率差乱标,美其名曰“学术诚信系统”,不知道坑了多少老老实实写作业的本科生。之前我朋友圈还有个学中文的师妹,写的古代文学课程论文被标80%AI生成,找导师申诉了半天才过,整个人委屈得不行。 上周我审那几篇误判的机械制图方向的论文,就是因为很多专业术语在预训练语料里的候选词特别少,top1和top2的概率差直接拉满,才被系统误判。我把那批文本扔进去刚才的演示脚本里,把默认的0.7阈值调到0.55之后,所有样本全部分类正确,没有一个错的。

如果你之前对AI检测算法原理的认知,还停留在“改几个字就能过”的层面,下次再遇到误判的情况,别直接认栽,把你文本里的私人化细节、个人实验数据整理出来,找申诉方要一下判定依据,大部分情况都能摘清楚。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐