
编辑把稿子退回来批注栏里只有一行字“自然一点别一股AI味。”问题是我那篇还真没让AI代写但回头一读确实中了招——满篇“首先…其次…最后”每个自然段都恨不得来一句“值得注意的是”。为了不再被这句评语噎住我花了两天晚上做了一个本地小工具起名叫“中文去AI味自查器”。它的用法很简单把一段中文文本粘进去脚本会返回一个AI味指数、若干个高亮风险句以及针对每一句的修改方向。它不做“是不是AI写的”这种审判只做“这段文字读起来像不像一个活人写的”这种体检。适合所有用AI辅助写作、又要交付自然文本的人也适合那些自己写出来的东西越看越像发言稿的老实人。后面我会把检测逻辑、代码骨架和实测过程全部分享出来也包括误报和漏报的坑。1. 为什么现在连“AI味”都成了可检测的坏毛病1.1 AI写作普及后文本腔调的同质化过去一年我审过不少稿子公众号推文、项目周报、活动总结、课程作业凡是经过生成式AI润色过的几乎都是同一副面孔。开头必是“随着……的发展”中间段落里藏着“值得注意的是”“不可否认的是”这种自带强调感的短语结尾再用“总而言之”“综上所述”收束一下。不是不能这么写而是所有文本都这么写时读者会明显感到一种“工厂流水线”的味道。这种同质化不是错觉。我拿自己手头百来篇文档做过粗略统计AI辅助写出来的文本里“首先”的出现频率大概是人写文本的3倍“提升、加强、推动”这类抽象动词的出现频率更是高到离谱。我身边很多编辑朋友现在练出了一个技能看到“赋能”两个字就直接把稿子打回。这已经成了圈内默认的“AI标记词”。这也是我想做自查器的直接原因。既然AI味有固定的语言特征那理论上就能把它们拆出来做成规则。第一步不是训练什么高级模型而是先把肉眼最容易发现的毛病锁死。1.2 “AI味”是语言模型的“平均语态”为什么大模型写出来的东西总带一股“平均感”这要从它的生成逻辑说起。语言模型做的是概率预测——在给定前文的情况下挑选下一个词。训练语料中越是常见的搭配越容易被推高概率于是模型天然倾向于说出“大家都在那么说的话”。所以AI生成文本本质上是在模仿所有语料的平均风格。这就好比你问班里的同学“怎么才能提高成绩”最安全的回答一定是“需要努力学习”而不是某个人说“我要每天背20个单词”。前者永远正确但没有任何信息量也没有任何个性。AI文本大量使用连接词、抽象名词和四平八稳的长句不是因为这样写更好而是因为这样写“最不容易出错”。这也解释了为什么AI味可以被检测因为绝大多数模型生成的内容都有强烈的统计偏好。你把“首先其次最后”连在一起看正常人手写文本很少这么密集AI却觉得这是骨架。清楚了这一点就会明白去AI味不是要消灭长句也不是要禁用所有书面语而是要打掉那些“概率最高却毫无信息量”的表达。1.3 自查器的定位给文本做“腔调体检”一开始我想做一个二分类模型输入文本输出“是AI写的/不是AI写的”。但做到一半我放弃了。原因是市面上已有的AI检测器都面临同一个问题它会误伤人类作者而且不会告诉你哪句话有问题。一个学写作的新手用“首先、其次、最后”来结构化难道就一定是AI代笔吗不见得。所以我换了思路不做安检机做体检报告。自查器的输出不是“有罪/无罪”而是“这句读上去很程式化”“这句缺少具体信息”“这句连接词太多”。至于要不要改、怎么改用户自己判断。这个思路决定了后面所有技术选型——我需要可解释的规则而不是一个说不清理由的深度模型。2. 第一版自查器的三个检测维度词频、句式与信息密度第一版我没上任何模型纯规则加词库。核心是三个维度词频层面的“高频套话”、句式层面的“机械节奏”、语义层面的“信息空转”。三个维度算完再合并成总分。2.1 词频黑洞连接词、抽象动词与万能名词词库是所有规则里最有性价比的部分。我手动整理了三类高频词准确说不是“违禁词”而是“看起来在讲道理实际什么都没说”的词。首先是逻辑连接词。像“首先、其次、再次、最后、总之、综上所述、值得注意的是、不可否认的是”。这些词本身没问题但AI文本里它们密度太高。我写过一个正则去匹配“随着……的发展”中间允许插入0到12个任意字符否则像“随着项目的进一步推进和发展”这种变体就抓不到。其次是抽象动词包括“提升、加强、推动、落实、强化、赋能、助力、打造、构建”。这类词的问题在于语义太宽主语和宾语都虚。你问“提升什么怎么提升提升到什么程度”句子完全无法回答。最后是万能名词像“能力、水平、质量、意识、体系、机制、模式、路径”。这些词单看不碍事但一旦跟抽象动词组合就会变成“提升能力水平、健全机制模式、优化路径体系”这种连环空心字。词库建成后我会算一个“每千字套话命中次数”。注意不能用总命中次数来做判断否则长文天然吃亏。比如一段500字的文字里出现10个“首先其次”跟一段5000字里出现10个“首先其次”严重程度完全不同。2.2 句式指纹句子长度、标点密度与排比结构光看词不够AI文本的句子节奏也非常稳定。我统计三个指标平均句长、句长标准差、单句逗号数量。人写东西时句子长度变化很大可能一句只有5个字下一句就40个字。但AI生成的中文文本句子长度大多集中在25到40字之间像用尺子量过一样。它很少写“谁干了什么”这种气口很短的句子因为这需要作者有明确的表达意识和节奏感。逗号密度是另一个信号。AI倾向于把各种信息用逗号拼进一个句子里结果一句话常常三个逗号以上。例如“在这个充满机遇与挑战的时代背景下我们必须要清醒地认识到只有通过不断地创新与实践才能实现可持续的发展。”这种句子信息量不大但气特别长读起来像腹式呼吸。排比结构我也做了检测。AI不知道什么时候该停特别喜欢把两个甚至三个相同结构的短语连续怼出来“从产品到服务从技术到管理从内部到外部”。思路是用正则匹配“从X到X”的重复模式或者检测连续三个逗号分隔的同长度短语。这种“整齐划一”放在口语里几乎不可能出现所以在句法层面是很强的加分项。2.3 语义空转关键词命中之外的信息密度检查词频和句式能抓表面问题但抓不住“字面很通顺内容全空转”的句子。比如“进一步加强团队建设”和“推动业务高质量发展”这两句既有抽象动词又有万能名词规则肯定能命中。可有些AI文本会把套话包装得柔和一些“我们要重视每一个细节把工作做得更扎实。”这句话词库未必命中语义上依然是空的。所以我加了信息密度检查抽取出句子里的命名实体、数字、引号内容、书名号内容以及所有“具体名词”。如果一句话跑完实体识别之后只剩“我们要、实现、提升、水平、价值”这些泛化词就判定为“空转句”直接加分。举个对比“进一步提升数据质量” → 没有数字没有实体没有动词细节空转句。“把客户投诉量从3月的1.8次降到0.5次” → 有时间有数字有具体对象信息密度高。用jieba做词性标注就能拿到大部分实体不需要太复杂的模型。实在不行只检测数字、引号和常见组织名也可以覆盖大量场景。信息密度这一项弥补了前面两个维度的盲区。2.4 把这些特征变成一张可解释的计分卡三个维度算完后我需要合并成一个可读的分数。我采用的不是简单相加而是非线性方式每个维度先算“每千字命中次数”再通过一个系数映射到0到100的区间最后加权合并。各维度权重如下检测维度权重说明套话词频30%连接词、抽象动词、万能名词命中情况句式机械度35%句长方差、逗号密度、排比结构信息空转35%缺乏数字、实体、具体动作的空洞句比例之所以给句式和信息密度更高的权重是因为词频可以被刻意回避但节奏和空洞感很难在短时间内装出来。人的语言有自己的呼吸频率AI没有。最终的AI味指数我按这样的标准展示60分以上“明显AI味”40到60分“可疑”40分以下“基本自然”。我还要单独输出“每千字命中次数Top5词”方便用户一看就知道问题出在哪。分数是给人看的不是用来审判的所以证据链必须放在分数前面。3. 搭建一个足够好用的自查流程有了检测规则剩下的是工程化。我不指望这个工具能像商业软件一样成熟但至少要能在命令行里用起来能读文件能输出报告。3.1 工具链选择为什么用Python加规则而不是直接接大模型很多人第一反应是“你直接叫GPT帮你判断不就行了吗”不行。原因有三个第一大模型判断有随机性同一个句子让它评价三次可能结果都不一样。规则引擎是确定性的同样输入永远同样输出这对自查来说很重要因为你要拿两个版本做对比如果判断本身不稳定对比就没有意义。第二本地脚本可以离线运行不用把稿子内容发给第三方省事也省隐私。第三规则引擎可解释能直接指到“哪个词、哪句话”出了问题。大模型只会告诉你“这句话像AI”但说不清为什么对修改稿件的帮助有限。当然规则引擎也有天花板后面我会讲怎么用模型补一刀但初版必须从规则开始。3.2 核心代码骨架代码本身不长核心是四个函数加载特征词库、统计套话命中、分析句式节奏、计算信息密度。我贴一个简化的骨架不是完整产品但跑起来足够用。import re import jieba import jieba.posseg as pseg from statistics import mean, stdev # 特征词库可按需扩展 FEATURE_WORDS { connective: [首先, 其次, 再次, 最后, 总之, 综上所述, 总而言之, 值得注意的是, 不可否认的是], abstract_verb: [提升, 加强, 推动, 落实, 强化, 赋能, 助力, 打造, 构建], abstract_noun: [能力, 水平, 质量, 意识, 体系, 机制, 模式, 路径, 价值], } CONNECTIVE_PATTERNS [ r随着.{0,12}的发展, r进一步.{0,6}(提升|加强|推动|促进), r在.{0,8}背景下, ] def count_hits(text, words): cnt {key: 0 for key in words} for key, lst in words.items(): for w in lst: cnt[key] text.count(w) for pat in CONNECTIVE_PATTERNS: cnt[connective] len(re.findall(pat, text)) return cnt def sentence_stats(text): sentences re.split(r[。!?], text) sentences [s for s in sentences if len(s.strip()) 0] lens [len(s) for s in sentences] if len(lens) 2: return {avg_len: 0, std_len: 0, comma_per_sentence: 0} commna_count sum(s.count() for s in sentences) / len(sentences) return { avg_len: mean(lens), std_len: stdev(lens), comma_per_sentence: commna_count, } def info_density(text): sentences re.split(r[。!?], text) empty_count 0 total 0 for s in sentences: s s.strip() if not s: continue total 1 has_num bool(re.search(r\d, s)) has_quote bool(re.search(r[“”\\], s)) words pseg.lcut(s) has_entity any(flag in {nr, ns, nt, nz} for _, flag in words) if not (has_num or has_quote or has_entity): empty_count 1 return empty_count / total if total else 0然后把这些结果汇总成“每千字命中次数”和综合指数。代码不算复杂但已经覆盖了我前面讲的三个维度。实际使用中不需要追求一次到位规则词库可以慢慢膨胀今天加几个词明天加几个句式工具才会越来越贴合你自己的写作习惯。3.3 分段打分与风险句标红如果只对整个文本算一个分很容易被平均效果骗过去。一篇5000字的文章可能只有两段AI味特别重其余部分都还行总分会卡在“可疑”区间反而掩盖了具体问题。所以我的脚本会先按自然段切开再按300到500字的窗口滑一遍相邻窗口之间重叠50字避免句子被从中间截断。每一窗口独立计算得分得分超过55的窗口会被标记为“风险段”。然后在风险段里进一步提取单个句子按“命中套话数量空转值”排序把得分最高的句子作为“优先处理句”输出出来。这样做的好处是报告不再是一句笼统的“你的文章偏AI化”而是“第3段到第4段之间风险分78其中‘值得注意的是’出现了2次‘赋能’出现了1次信息空转比例达到50%”。定位越精确改起来效率越高。3.4 报告结构分数之外更要给改写线索输出报告我做成三块总分整篇文章的AI味指数。段落风险分布标出每个自然段的得分用表格展示哪些段落是重灾区。风险句清单每一句命中特征的内容加上一个“人工建议”。关键在第三块。我不会做全自动改写因为机器改出来的句子仍然可能带AI味。我给的只是方向。比如“删除开头‘首先’直接说事”“把‘值得注意的是’替换成你手头的数据”“把这句话从三个逗号拆成两句”。方向比成品重要因为只有作者自己知道他想表达什么。以下是报告输出的示例结构段落分数风险特征第1段82连接词x4空转句2处第2段45句长std略低第3段72抽象动词x3信息密度低风险句示例“随着项目的不断推进我们要进一步加强团队协同能力。” 建议删掉“随着”直接写项目当前到了哪一步“加强协同能力”换成具体动作比如“每天上午同步十分钟进度”。这种报告对新手友好对老手也不啰嗦。4. 实战用自查器把一段典型AI稿改成能看的东西规则和流程都做完了接下来要用真实文本验证它到底有没有用。4.1 一段典型AI稿的检测结果我随便编了一段极具代表性的AI味文本几乎每个模型在生成“项目总结”时都会说这种话首先随着项目的不断推进我们必须要进一步提升整体的团队协同能力。其次通过深度分析数据能够更好地发现潜在问题并及时调整策略。总而言之只有不断加强学习才可以在未来的竞争中立于不败之地。这段文字扔进自查器结果AI味指数88。其中连接词命中4次抽象动词“提升、加强、加强”命中3次“随着……的发展”命中1次句式标准差低到接近0信息空转比例100%。从句子连通性上讲它没有错但读起来像一面光滑的墙找不到任何抓手。问题非常典型它没有一个时间点、没有一个具体项目、没有一个数字、没有一个真实发生过的动作。整段话全部是“含动词但无动作”的表述。4.2 逐条干预替换、删减、用具象细节针对上面的诊断我做了三件事。第一删掉“首先、其次、总而言之”这一组骨架连接词。这里要特别说明不是绝对不能有连接词而是不需要“起承转合全靠连词”。真实写作中段落之间的关系可以靠内容自然衔接也可以靠时间顺序、因果顺序来推进。删完之后我发现这段话的结构还在甚至更清楚因为读者被迫去看你实际说了什么。第二把“随着项目的不断推进”这种背景句整个去掉。它没有提供任何事实。顶替它的是项目当前状态“这周项目进入第二阶段原定15号上线的模块提前了两天。”有状态有日期有结果读者立刻知道发生了什么。第三把“提升团队协同能力”落到实处。我改成“之前各小组各改各的文档这周改成每天上午十分钟同步邮件里只留结论。周五复盘时发现重复做的原型减少了三版沟通成本明显降了下来。”这一句里出现了“每天上午十分钟”“周五复盘”“三版原型”全是具体信息没有一个抽象动词。改后文本是这周项目进入第二阶段。原定15号上线的模块提前了两天但各小组的文档之前各改各的导致很多内容重复。我们改成每天上午开十分钟同步会邮件里只放结论。周五复盘时发现重复做的原型少了三版沟通顺畅了不少。重新检测指数降到28。改后的文本并不是什么范文但它终于像一个做事的人在说事而不是一台机器在总结规律。4.3 改完再测分数下降不代表文章变好别高兴太早。我后来尝试过更极端的方式把句子拆得碎碎的强行不用任何书面连接词结果指数确实降到个位数但读起来像在记流水账句子之间全是断的。分数降了文章反而更差了。这说明一个很要命的问题降分不等于变好。真正的好文本应该是有逻辑骨架但骨架藏在内容下面不靠套话硬撑。我后来给自己定了一个更实在的验收标准写完一段话自己用正常语速读一遍凡是读起来要换三口气才能念完的句子一律拆开。凡是连自己都不知道在说什么的抽象句子一律删掉重写。自查器只是帮我抓出“可疑目标”最终决定权在耳朵和嘴巴。5. 误报与漏报真实写作里最扎手的两个问题规则系统的死穴是语境缺失。同一个“首先”在小学生作文里是结构意识在公文里是固定格式在AI稿里可能就是偷懒。要是只认字面特征必然误报。5.1 公文、翻译腔与AI腔的边界我拿了几篇政府工作报告和学术论文去测结果惨不忍睹指数全部飙到70以上。原因不复杂这类文体本来就有固定的套话传统比如“要坚持稳中求进工作总基调”这种句子字面特征跟AI腔高度重合。你要是按通用规则去算它自然会被误伤。应对方式是加“文体预设”。用户选定文本类型后词库权重会做调整。公文类会降低对“加强、推动、建设”的惩罚因为这些词在该文体里是规范表述而不是AI偷懒。学术类会更看重“本文旨在”“综上所述”这类框架句的密度但不会仅凭几个框架句就判重。翻译腔是另一类容易误报的情况。很多外文译介文本也习惯用“值得注意的是”“需要指出的是”这其实是欧化句式的残留不完全是AI味。但从可读性角度讲翻译腔同样会让读者疲劳所以我的工具对这种情况的处理是照常提示但建议文案会写成“这句话读起来偏翻译腔试试把它改成中文口语的语序”。同样是提示准确度更高。5.2 学习型写作者被误伤怎么办更麻烦的是正在学习写作的人。一个刚学议论文的中学生老师教他要用关联词于是他规规矩矩地写“首先、其次、最后”这不能说明他有AI味只能说明他在跟着模板走。我的处置方式是让报告变成“举证”而不是“宣判”。不只给一个分数而是把命中的句子全部列出来让用户自己判断“这句话我为什么这么写”。如果用户觉得某个特征词是Ta的习惯用法可以把该词加入“个人白名单”下次计算时自动跳过。后来我还加了个“口语缓冲器”如果文本里出现“说白了、其实、老实说、我觉得”这类强人味标记即使前面的规则命中不少总分也会适当往下调。因为真正由AI生成的内容很少会主动使用这种带明显主观立场的口语词。这个技巧不是我的原创但实测下来相当管用。5.3 刻意“降AI率”和真正去AI味是两回事现在网上有大量“降AI率工具”核心思路是把文章改乱通过打乱标点、插入错别字、同义词替换来骗过检测器。说实话我都试过。改完确实能骗过一部分AI检测器但出来的文本完全不能看要么语句不通要么逻辑断裂。这不是去AI味是制造新的灾难。我的立场是自查器不是为了“瞒过机器”而是为了“读起来像人话”。这两个目标大部分时候一致但本质上不一样。打乱文本结构也许能骗过检测器但骗不过读者。去AI味最终要解决的是读者的阅读体验不是检测系统的阈值。所以我不会做对抗性混淆我只做文体修正。6. 下一步的计划和用完后的清醒话初版规则引擎已经让我应付了大量日常改稿需求但它的天花板很明显面对真正复杂的文本词库和正则总会有覆盖不到的地方。接下来的思路已经想好了。6.1 后续升级规则粗筛加模型细排我的计划是继续用规则引擎做“粗筛定位”因为它的可解释性和速度无可替代等定位到风险句之后再用本地小模型做“细排改写建议”。比如规则识别出“我们要切实加强部门协作”是空转句就把这句话交给一个小参数的语言模型让它生成三个更具体的替代句返回给用户选择。用户确认后再替换这样既保留人的判断力又能借助生成能力打开思路。这样做还有一层原因纯规则容易机械纯模型容易失控。两者结合规则保证能找到“病灶”模型负责给“治疗方案”最后的人做“手术”。我目前测试下来用7B左右的本地模型已经能给出不错的改写建议而且不需要联网速度和隐私都兼顾。6.2 踩过的坑语料版权、频率失真与阈值漂移开发过程中有几次教训值得记录。第一次是构建词库时我想统计“哪些词在AI文本里高频出现”直接拿一本长篇小说全集去跑词频。结果小说里某些作者个人偏好的词汇被统计成“AI高频词”放进词库后导致检测结果跑偏。后来我明白提取特征必须用“AI语料里常见、人写文本里少见”的差分词而不是单纯看频率否则就是把文学风格当成AI味。同时受版权保护的语料不能随便拿来跑统计这个坑必须绕着走。第二次是频率失真问题。同样的“首先”在AI生成的开头里出现了但在学术论文的章节结构里也会出现。同一个词在不同领域里的“风险阈值”完全不一样所以后来我坚持做文体预设而不是一个词库打天下。第三次是阈值漂移。语言是活的今天大家觉得“赋能”很AI可能过两年它成了正常词汇或者反过来新的热门词又开始被AI滥用。这意味着词库不能一劳永逸至少每个季度要更新一轮。我把词库做成了外部JSON文件方便随时改不需要动主程序。6.3 工具只是拐杖真正要练的是“删繁就简”用这个工具半年以后我最大的改变不是检查AI味越来越熟练而是写初稿的时候就开始注意那些坑。现在我给自己定了两条简单的纪律一段话里最多保留一个逻辑连接词每写一段必须出现至少一个具体的事实锚点比如时间、数字、人名或者地点。这两条不是自查器教会我的但它用一次又一次的“风险句标记”逼着我养成了习惯。最后再说一句实在的工具能帮你抓出那些露出AI马脚的句子但决定文字有没有人味始终是坐在屏幕前的你自己。别把“去AI味”当成一个躲检测的任务当成一个“把事说清楚”的练习你的文章自然会有写作者该有的温度和坑洼感。