尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

降AI神器实战:把AI生成的技术文档过审率拉满的踩坑记录

降AI神器实战:把AI生成的技术文档过审率拉满的踩坑记录 上周赶项目交付材料熬了三个晚上攒的AI辅助生成需求文档拿去评审被合规岗直接打回说AI内容占比超标3倍根本没法走归档流程。 急得我翻遍了开发群的私藏资源最后摸出的那套降AI神器组合折腾一下午直接过了检测今天把踩过的坑全记下来。一开始我图省事用最笨的办法改同义词替换把“支持”换成“可承载”把“运行”换成“跑通”再调换下前后两个句子的顺序。 测完直接傻了AI检测率只从92%降到87%基本等于没动。 后来才反应过来现在主流的AI内容检测模型根本不是抓文本表层的相似度是抓生成时的token分布特征。 大模型生成内容的时候每一个字的输出概率都是平滑过渡的几乎不会出现人类写东西时那种“突然跳步、插个无关的个人经验、卡壳绕弯子”的情况业内叫语义熵值太均匀。 网上那种“改几个同义词就过检”的老黄历放在2024年根本没用。我自己用Python写了个小脚本先对长句做分句打乱替换通用技术术语成我们团队内部常用的口语化别名不动核心参数和逻辑只改表层特征import jieba import random import re # 自定义替换词库全是团队内部常用的非标准表述 REPLACE_DICT { 微服务架构: 微服务那套架子, 接口调用: 发请求调接口, 服务雪崩: 服务直接挂成多米诺, 灰度发布: 小流量切流 } def process_long_text(text, min_sent_len20): # 先按标点分句 sentences re.split(r([。!?]), text) processed [] for i in range(0, len(sentences)-1, 2): sent sentences[i] sentences[i1] if len(sent) min_sent_len: processed.append(sent) continue # 长句拆成多个子分句 sub_sents re.split(r([,]), sent) if len(sub_sents) 4: # 随机调换非核心分句顺序保留第一个子句的核心信息 core_head sub_sents[:2] rest sub_sents[2:] random.shuffle(rest) new_sub core_head rest new_sent .join(new_sub) else: new_sent sent # 替换通用术语 for k, v in REPLACE_DICT.items(): new_sent new_sent.replace(k, v) processed.append(new_sent) return .join(processed)跑了一遍脚本把全文过了测出来检测率68%比手动改的效果好太多。 结果我脑子抽了临时加了个逻辑把所有的“的地得”三个词性的助词做随机替换试图进一步打乱特征。 当时跑出来的文本读起来特别怪比如“服务雪崩的场景下我们要快速地断开无效请求”被改成“服务雪崩地场景下我们要快速的断开无效请求”完全不符合中文语法。 我当时没觉得有问题直接拿去测结果检测率直接干到94%比原始的AI生成内容还高。 后来查资料才反应过来现在的检测模型早就把“不符合人类书写习惯的对抗性扰动”当成强AI特征了你越改的不通顺越容易被判定是AI生成的对抗样本。 赶紧把那个脑残逻辑删掉老老实实从人类写作的独有特征入手优化。我整理的降AI神器核心逻辑别再用傻办法改文本了这里说一个很少有人提到的冷知识点人类写技术内容的标点分布和大模型生成的内容差异极大。 我统计了自己过去3年写的12万字技术博客逗号和句号的比例是2.1:1平均每100个字会出现0.7个括号用来加备注偶尔还会用破折号插点碎经验。 但我翻了10篇纯GPT-4生成的技术文档逗号句号的比例接近3.3:1100个字里括号的出现概率不到0.1几乎从来不用破折号。 大模型不是不会生成括号是训练集里大部分公开的技术文档都很少用括号加私人备注模型学出来的分布自然就偏了。 基于这个点我又写了第二个脚本自动在每3个段落的间隙插入我自己攒了好几年的私人踩坑碎碎念全是我自己在不同项目里遇到的边角料问题不可能出现在任何大模型的训练集里import random # 私人踩坑语料库全是专属个人的项目经验全网独一份 PERSONAL_CORPUS [ 去年双十一踩过一模一样的坑当时运维的告警短信直接被挤爆, 别问我怎么知道这个坑的上次实习生瞎改参数把线上用户头像全弄没了赔了用户好几个月会员, 顺带提下这个逻辑我19年在老东家踩过当时查了三天三夜根因, 说出来你们可能不信之前有次这个配置写错整个机房的公网出口直接被运营商封了半小时 ] def insert_personal_noise(text, interval3): paras text.split(\n\n) new_paras [] for idx, para in enumerate(paras): new_paras.append(para) if (idx 1) % interval 0: # 随机选一条语料改成普通的括号备注形式插入 noise random.choice(PERSONAL_CORPUS).strip() new_paras.append(f{noise}) return \n\n.join(new_paras)这段脚本跑下来我直接往文档里插了二十多条专属私人经验的备注既不影响正式阅读又能把独属于我的文本特征打满。之前试过网上流传的所谓“乱码插空格”大法完全没用现在的检测模型预处理阶段会直接过滤所有非可见字符、全角半角空格甚至会把你替换的谐音词先映射回标准表述再做推理这种十年前的伪原创套路现在连查重系统都骗不过更别说AI检测了。 还有人说把内容截图再OCR转一遍纯纯多此一举OCR的过程只会引入更多识别错误你还要花时间校对最后出来的内容特征和你直接改的没区别等于浪费俩小时生命。 我自己调完脚本的插入权重从0.3拉到0.6保留核心技术表述不变的前提下尽可能打乱句子的特征分布这时候出来的内容读起来已经完全像我自己平时写的东西了。改写完之后我习惯性地丢到团象AI检测里跑一遍确认检测率降到阈值以下再往下走。果不其然最后剩那几个高风险高亮片段全是我刚才漏改的参数说明部分占比刚好卡在13%的位置差一点达标。 我干脆直接把那几段全删了换成我之前在项目组内部共享过的接口文档片段连语序都没改那部分内容我纯手工写了快两年前前后后迭代了十几个版本根本不可能有AI生成的特征。 最后整完再扫一遍连之前残留的几个AI喜欢用的“综上所述”“值得一提的是”这类连接词全删掉换成我平时爱用的“顺带说下”“注意”这种口语化的过渡。折腾完这套流程我发现所谓的降AI神器根本不是什么能一键出结果的黑盒工具核心逻辑全是往文本里注入只有你自己能生成的独属特征。 最后全量测完AI生成率直接掉到7%稳稳低于合规要求的10%阈值。 别觉得这个东西是歪门邪道我自己算过现在做ToB项目很多文档要写几十页的需求说明、架构设计全靠手工写太耗时间用AI先出初稿再用这套方法改成完全符合自己写作习惯的内容效率至少翻三倍。 我把整套脚本扔给组里的同事试了下他上周用AI写的应急预案改完之后连他自己都分不清哪部分是AI写的初稿哪部分是后面改的。 昨天把最终版文档交上去合规那边一秒过连个反馈邮件都没发。刚才翻之前的测试样本发现有个用GPT-4写的架构设计文档我改完之后拿去给我同事看他还问我是不是前天熬夜肝出来的。
返回列表