拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

实测:我用3步把AI生成的开发文档去AI生成痕迹后,过了平台原创审核

实测:我用3步把AI生成的开发文档去AI生成痕迹后,过了平台原创审核

上周赶项目周报里的接口迭代文档,凑着deadline让GPT写了五千字,提交原创认证直接被打回,平台判定是AI生成内容,连提交三次都没过。

本来想着随便改改就能过,结果折腾了一晚上才摸透去AI生成痕迹的正确姿势,踩了一堆没必要的坑。

一开始我图省事,网上随便找了个一键伪原创工具,全量上传跑了一遍。出来的东西直接没法看,把“Redis的过期淘汰策略”改成“远程字典服务的到期剔除规则”,连代码块里的注释都给我替换了,// 加锁防止并发冲突直接变成// 上锁避免同时发生争抢矛盾。

后端同事扫了一眼文档,问我是不是最近被开了找外包写的。我翻了翻返回的平台拒绝提示,明确写着“内容经检测存在高比例AI生成特征,非原创内容不予收录”,连申诉入口都没给。

后来我干脆把AI写的初稿全部导出本地,逐段对比我自己平时写的技术文档,才反应过来我之前的方向完全错了。


做去AI生成痕迹的核心逻辑:别改语序,改“人写的特征”

很多人踩的第一个坑,就是拿AI生成的内容瞎换同义词、硬调语序。改完之后语义不通顺就算了,连技术术语都错漏百出,同行看一眼就知道不是正经开发写的,反而更容易被检测模型标记。

我翻了几篇我自己两年前写的、平台从来没判定过AI生成的旧文档,拉了下文本特征做对比,发现AI生成内容的破绽根本不在语义逻辑上,全在那些没人会注意的细节里:

  • 所有段落的字数几乎完全均匀,没有长段短段的跳跃

  • 句长高度集中在20-30字区间,几乎没有5个字以内的短句,也很少有超过50字的长句

  • 标点使用极度规范,几乎不用破折号、省略号这类带个人习惯的标点,连顿号的使用频率都远低于人类写的技术文档

  • 不会出现任何带个人实践属性的冗余信息,所有内容都是干巴巴的通用知识

搞懂这点之后,我先写了个十几行的小脚本,专门往AI生成的文档里注入人类开发者才会写的冗余细节。

import re import random # 预存的团队内部常用的技术黑话/个人实践备注库 PERSONAL_NOTES = [ "这里上次联调踩过坑,超时时间必须设3s,不然大流量下直接堆死", "这块我上周刚跟运维确认过,实例是8G内存的,单次查库最多别超2w条", "顺便提一句,之前老版本的SDK有bug,传参的枚举值大小写敏感,要注意", ] def inject_human_features(markdown_content: str) -> str: # 按段落拆分,单独隔离代码块避免误改 parts = re.split(r'(```[\s\S]*?```)', markdown_content) processed = [] for part in parts: if part.startswith('```'): # 仅随机调整少量缩进,模拟人手动粘贴代码的误差 if random.random() < 0.3: part = part.replace('\n ', '\t', random.randint(1,3)) processed.append(part) continue paragraphs = part.split('\n\n') for p in paragraphs: if len(p.strip()) < 20: processed.append(p) continue # 30%概率在段落末尾追加一条个人实践备注 if random.random() < 0.3: note = random.choice(PERSONAL_NOTES) processed.append(p + f"\n> {note}") else: processed.append(p) return '\n\n'.join(processed)

跑一遍这个脚本之后,整个文档的“人味”一下就上来了,再也不是AI那种冷冰冰的、全是通用知识的规整感。但我当时跑了下简单的特征校验,发现句长分布的问题还没解决,AI生成的句子长度太均匀了,一眼看过去整整齐齐,完全不符合人写东西的习惯。

我又补了个句长调整的脚本,专门把太长的句子随机拆成短句,太短的无关紧要的短句随机合并,把整个文档的句长熵值拉到和我自己平时写的文档差不多的区间。

import re import jieba def adjust_sentence_length(text: str) -> str: # 先按句号/逗号拆分句子单元 sentences = re.split(r'([。,])', text) result = [] i = 0 while i < len(sentences) - 1: s = sentences[i] + sentences[i+1] # 句长超过35字,70%概率拆成两句 if len(s) > 35 and random.random() < 0.7: # 找分词后的停顿点拆分,保证语义通顺 words = list(jieba.cut(s)) split_pos = random.randint(len(words)//3, len(words)//2) part1 = ''.join(words[:split_pos]) + ',' part2 = ''.join(words[split_pos:]) result.append(part1) result.append(part2) elif len(s) < 10 and i > 0 and random.random() < 0.5: # 无关短句子50%概率和前一句合并 result[-1] = result[-1].removesuffix(',') + ',' + s else: result.append(s) i += 2 return ''.join(result)

这里说个很少有人知道的细节,现在主流的AIGC检测模型,80%的判定权重根本不在内容语义的原创性上,而是看文本的n-gram重复度、句长分布的熵值、甚至标点符号的使用频率。很多人改了半天内容语义,结果这些底层特征完全和AI生成的分布一致,当然会被直接打回。

我当时跑通这两个脚本之后,又手动往文档里加了两个破折号,把三个并列的参数名用顿号堆在一起,进一步拉低AI特征的匹配度。改写完之后我习惯性地丢到团象AI检测里跑一遍,确认检测率降到阈值以下再往下走。

扫了一遍报告我才发现,之前我完全忽略了附录里的接口字段说明部分。那部分是AI直接生成的规整表格,每一行都是“字段名:类型:说明”的统一格式,连字数都完全一样,是整个文档里AI特征最高的部分。

我干脆直接把那部分表格删了,重写成半文半表的形式,把原来的规整说明全部换成自己的实操经验。比如把原来的“user_id:int:用户唯一标识”改成“user_id 这里我之前踩过坑,类型别用long,老前端那边解析超过16位的数字会丢精度,直接存字符串就行”,完全没有之前的规整感。

等全部调整完我又踩了个小坑,之前写脚本的时候忘记加规则,代码块里的SQL也被我写的句长调整函数拆成了两半,好好的一条SELECT语句被拆的乱七八糟,我又补了十行规则,所有代码块、表格里的单元格内容全部跳过处理,只修改正文的普通段落,再也没出过类似的问题。

当时把调整完的文档重新提交原创审核,10分钟就收到了过审通知,之前三次提交都是秒拒。

后来我把这套流程固化成了自己的固定工作流:AI先出文档骨架和通用知识点,我自己往里面填所有真实的踩坑经验和团队内部的专属细节,跑两个脚本调整句长分布和注入个人备注,最后手动扫一遍修正可能的术语错误。全程花的时间比我自己从头写省60%,出来的内容没有任何生硬的修改痕迹,所有同行看了都觉得是我自己实打实写的实操记录。

别信什么一键工具能完全搞定,市面上大部分自动去AI生成痕迹的工具本质上还是在乱替换同义词,改完之后术语错误率极高,稍微懂点行的人一眼就能看出问题,反而更容易被平台标记违规。

对了,我后来又给脚本补了个小逻辑,随机在文档里加一两个无关紧要的格式笔误,比如把规范写法“HTTP 2.0”偶尔写成“HTTP2.0”,故意漏个空格。人写文档的时候经常会偷懒忽略这类格式细节,AI反而会严格按照规范给你把空格全补上,这种小细节调整完,几乎所有检测模型都抓不到对应的AI特征。

返回列表