禁用词表拦不住 AI 味
AI 味的顽固部分不在词汇层,在句法框架留下的空位。判断一个句子是不是在填空位,需要句子之外的事实 —— 这决定了这类规则只能在起草时执行,润色阶段结构性地做不到。
去 AI 味的通行做法是一张禁用词表。delve、tapestry、赋能、抓手,看见就换掉。 这张表有用。但它拦不住最刺眼的那部分。
拦不住的那部分有个特点:它不是模型的能力上限。 同一批权重在另一种语境下 写得相当干净,不需要任何禁令。差别在于那个语境给足了约束,而写文章的语境没有。
所以这篇文章讲三件事:词表够不着的是什么、模型在什么条件下自己就不犯, 以及这类规则该放在流水线的哪一道才有效。
先交代一件事:这篇由模型起草,规范就是为了拦它自己写的。 草稿里真有一句因为违反规则被删掉,删的过程在文章末尾。
先把两个症状分开
「AI 味」底下其实是两个问题,成因不同,能拦住它们的手段也不同。混着治,结论必然打架。
| 症状 | 例 | 从哪来 | 词表拦得住吗 |
|---|---|---|---|
| 黑话 | 赋能、抓手、颗粒度、对齐一下、形成闭环 | 中文语料本来就多 —— 大厂话术经媒体扩散,营销号大量复制,模型照单学 | 拦得住 |
| 句式 | 「不是 A,是 B」及同族 | 对齐后训练 | 拦不住 |
禁用词表在第一行是有效的,我们自己维护着四份。它够不着的是第二行。 下面先讲第二行,黑话那条线后面再回来。
最顽固的那个句式
「不是 A,是 B」。英文是 “It’s not X, it’s Y” 和 “not just X, but Y”。
它有正式名字。Wikipedia 的 Signs of AI writing 把它单列一节,叫 negative parallelism:
It is common for LLMs to use parallel constructions involving “not”, “but”, or “however” such as “Not only … but …” or “It is not just …, it’s …”.
同一页另有一节讲 rule of three,三项排比连着出现,也是同一类痕迹。
量的部分有一次公开统计。华盛顿邮报分析了 328,744 条公开分享的英文 ChatGPT 消息,
取自 37,929 段对话,限 gpt-4o、长度至少 10 个词,时间跨 2024 年 5 月到 2025 年 7 月底。
结论里有这么一句:
ChatGPT frequently uses versions of the phrase “not just X, but Y,” which appeared in 6 percent of chats in July.
注意分母是对话,不是消息。 语料是 32 万条消息,6% 说的是 7 月的对话里有多少出现过这个句式。
Atlantic 也写过它,把它当作目前最出名的一个 AI 写作痕迹,并且指出成因至今没有定论 —— 可能连做模型的公司自己都不知道为什么。OpenAI 负责 model behavior 的 product manager Laurentia Romaniuk 把它叫 contrastive phrasing,说公司在设法拓宽模型的表达。
为什么戒不掉:对齐后训练
有一手文献的部分,是「对齐会压掉输出多样性」这件事本身:
- Kirk et al.,arXiv:2310.06452(ICLR 2024): “RLHF significantly reduces output diversity”。
- Zhang et al.,arXiv:2510.01171(ICML 2026): 把 mode collapse 正式用到 LLM 上,并指出主因是偏好数据的 typicality bias。
这里有两个常见的说法要纠正。mode 是众数不是均值 —— 塌向的是最典型、最高概率的那种输出, 「把模型往平均里赶」这个说法不准确。另外,责任在对齐后训练这一整套, 不单是奖励函数那一个环节。
至于这个句式具体为什么被强化,没有定论。能查到的、有出处的说法只有一句: 打分的人给用了这个句式的回答打了高分,因为它显得有层次、有洞见 (“gives the impression of nuance and insight”)。这句见于 Wikipedia 的 Negative parallelism 条目和一个二手聚合站, 两处措辞还不一致,Atlantic 原文在付费墙后 —— 按转述记,别当原话引。
除此之外流传着两派解释,都是推演:
- preference tuning 说:被拒的回答偏短、偏平铺直叙,被选的回答偏展开, 于是模型学会先点出那个更简单的说法再推开它。
- RLVR 说:对比结构占据高熵状态,便于把推理序列拉长。提出这个说法的 作者用的词是 “I suspect”,全文没有引用任何实证数据。
两派都值得知道,但都不该被当成已知结论。这一点上 Atlantic 的立场是对的:没人说得清。
一个没人讨论的观察:agent 干活时它不出现
上面这些讨论都停在「模型写散文时会这样」。但同一个模型在 agent 模式下跑工具、改代码、 读日志,输出里几乎见不到这个句式。
这个差异我没找到现成的分析,以下是我们自己的判断:
- 这个习惯挂在「解释给人听」这个条件分布上,不挂在权重上。 agent 轮次的上下文是 tool schema、代码、一个有可验证终态的任务; 写文章的上下文是已发表的说明文写作,那里这些框架本来就高频。
- 教会「展开优于平铺」的那些偏好数据,是在聊天回答上采的。 工具调用轮次基本按命令跑没跑通评分,那道梯度几乎没碰到 agent 这个语域。
- 修辞能产字数。 写文章没有「测试通过」这种外部停止条件, 模型需要内部理由继续产 token。
- 散文没有语调。 说话靠重音标强调,写字只能靠句法框架。
- 对话里的前件是真的。 「不是 A」里的 A,在对话中是对方刚说过的话。 独自写文章时没有对话方,框架仍然要求一个 A,模型只好自己造一个。
空位
第 5 条推广开来,就是这篇文章的地基。
模型手里有一批高产的句法框架:对比、排比、三段式、路标词、抬价名词。 每个框架都留着一个必须填的空位。 材料够的时候填真材料,材料不够的时候空位仍然要填。
填出来的产物读起来像有信息,实际没有:
- 靶子没人立过 —— 「不是 A」里的 A,没有第二个人主张过。
- 路标什么也不承接 —— 「值得注意的是」后面并没有比前一句更值得注意。
- 抬价词不指称任何对象 —— 「颗粒度」在多数上下文里都能换成单位、层级或精度,而且更准。
三者是同一个机制的三种产物。所以要拦的不是词,是不需要材料就能填满的空位。
AI 能写出没有 AI 味的句子
前面几节容易读成一个悲观结论:模型有个改不掉的毛病,我们只能在下游拦。
实际情况要好得多。同一个模型、同一批权重,在约束足够的时候写得很干净。
最直接的证据就是上一节那个观察:agent 轮次里这个句式几乎不出现。 没有人为此调过模型,也没有人在工具调用的 system prompt 里禁过对比句式。 它不出现,是因为那个语境不留空位 —— 任务有可验证的终态,材料是代码和日志, 每一句话都有对应的事实要说。
所以这是约束问题,不是能力问题。而「约束」具体指什么值得说清楚, 因为最常见的那种约束恰好是没用的。
没用的约束:「写得自然一点」「不要有 AI 味」「像人一样写」。 这些话不提供材料,也不提供判据。模型面对的还是同一批空位, 只是被要求填得不像在填。结果通常是换一批词,句法框架原样保留。
有用的约束有三样,按效力排序:
- 给足材料。 空位被编造物填满,根本原因是没有真材料可放。 我们那批命中里大部分能过判据,不是因为作者克制, 而是因为那些文档的材料密度足够高 —— 每个 A 都真的有出处可指。 这一条比任何禁令都管用,而且它不算写作技巧,是准备工作。
- 给可判的判据。 「不要立靶子」不可判,「A 指得出出处吗」可判。 一条规则如果模型没法自己检验,它就只是一句愿望。
- 把判据放在判得动的那一道。 见后面两节。
这三条也解释了为什么去 AI 味不该整个外包给最后一道润色: 润色拿不到材料,也拿不到出处,它只能在词面上做文章, 而词面是这个问题最浅的一层。
回到黑话:为什么这一条词表拦得住
黑话不是模型发明的,是中文语料里本来就多。大厂内部话术经 HR 与媒体扩散, 营销号大量复制,模型照单学下来。可考的公共时间线:2021 年 3 月张一鸣九周年演讲 当众念黑话双月会材料(他念的段落里其实没有「对齐」「颗粒度」「抓手」, 转述时容易张冠李戴),4 月《人物》等集中报道让「互联网公司不说人话」成为公共话题, 2023 年底《年会不能停!》把「对齐颗粒度」送出圈。
三个常见词的来路,能查到的程度差很多:
| 词 | 查到的 |
|---|---|
| 赋能 | = empowerment,管理学的授权理论,可追到 1920 年代的 Follett。有硬考据。 |
| 颗粒度 | GB/T 10558-1989《感光材料均方根颗粒度测定方法》(granularity)证明它 1989 年就是国标用词;计算机领域的规范形式是「粒度」。跟管理咨询无关,「粒度→颗粒度」的分化没人考证过。 |
| 对齐 | Strategic Alignment Model(Henderson & Venkatraman, 1993)确实发在 IBM Systems Journal,但中文更常译作「战略一致性」,这条传导路径断了。职场「对齐」更可能是英语 align 的直译 —— 流行说法,没有语料级考据。 |
「对齐」「闭环」要按义项分。ML 的 alignment、控制论的 closed loop 是有定义的术语,保留; 职场的「对齐一下」「形成商业闭环」是黑话,压掉。判据不变:这个词在这里指称了什么。
所以这一条的结论是:词救不回来了。
我们的规范不用「颗粒度」,理由不在这个词本身有什么问题, 而在中文语料里的用法已经污染到,连它的原义都不值得再用。 按上下文换成单位、层级、精度、拆分口径,每个都比它准。这一层,词表完全够用 —— 判据就在句子表面:这个词在这里指称了什么吗?指不出来就删。
词表能拦到哪一层
这样就能说清词表的边界了。
「值得注意的是」是路标,删掉不损失信息,从句子表面就能判,词表拦得住。 「赋能」没有指称,同理。这一层的规则可以交给润色阶段执行,效果很好。
「不是 A,是 B」不行。因为它是否合法,取决于 A 到底存不存在, 而A 存不存在这件事不在句子里。
同一个句式,两种情况:
- 「这是手测,不是统计。」—— A 是读者默认会有的更强预期,纠正它是有信息的。
- 「这四步不是数据库的要求,是滚动升级的要求。」—— 我写的,我说不出谁主张过前半句。
两句话的句法一模一样。区别在句子外面。
判据
所以规则只有一条:A 这个读法指得出出处吗。
出处必须具体:一条审阅意见、上一版文档里明写过的判断、另一篇文章的结论、 数据会诱导出的那个错觉。写下 A 的时候就要能说出它从哪来。 说不出,那个读法就只有作者一个人持有过,删。
放行的五类:
| 类 | 它在做什么 |
|---|---|
| 纠正误读 | 读者按默认读法会得到一个错的结论 |
| 归类定处置 | A、B 是两个真实的类,落哪一类决定接下来做什么 |
| 标注证据强度 | 否定的是读者会默认的那个更强主张 |
| 分开两个易混对象 | A、B 都实际存在,且常被当成同一个 |
| 推翻自己写过的判断 | A 有文档出处,读者可能还持有它 |
引文里的对比句式原样保留,它的 A 有说话人,天然过判据。
有一类规则要小心:「A 不能是空泛抽象词」这种从句子表面就能判的条件,写进来没坏处, 但它会冒充判据。 有人拿它当检查表过一遍,A 换成具体名词就放行, 而那个读法照样没有第二个人持有过。
落点:一条规则该由谁来拦
把上面的话推到一般情况,就是这篇文章真正想给出的那条:
一条规则该落在流水线的哪一道,取决于判它需要的事实在哪一道手上。
| 判它需要的事实 | 谁拦 |
|---|---|
| 字符层:标点、格式、schema | 脚本,人不看 |
| 句子里就够:抬价词、路标词、万能动词、语气 | 润色能改 |
| 在句子外面:对比句式的出处、数字对不对、有没有把计划写成已上线 | 起草时不写;润色只标不改 |
第三层是关键。润色手上只有句子。 硬让它改,两个结局都比不改坏: 把靶子换个说法留着,或者删掉一个真正承重的区分。
所以我们的润色环节对这一类只标位置、不动手,判决交给能查到源的那一道。 以后新增任何一条写作规则,先问「判它要什么事实」,再决定写进谁的检查表。
反向规则:删减规则会超调
还有一类规则,存在的唯一目的是拦住上面那些规则的过度执行。我们踩出来三条:
| 反向规则 | 它拦的过度执行 |
|---|---|
| 保留术语清单(幂等、单调、正交、闭环…) | 「禁黑话」被执行成「把术语换成大白话」 |
| 中文破折号豁免 | 润色拿到「禁 en-dash(U+2013)」会顺手把全文「——」压成 - |
| 保留路线图与愿景 | 「不要灌水」被执行成「删掉所有前瞻内容」 |
共同形状:一条为了删减而写的规则,交给模型执行时会朝删减的方向超调。 所以每写一条删减规则,都要同时想它会误伤什么,并把豁免写在同一处。
实测
在我们自己的技术文档库里扫这个句式,按命中行数计:规则落地前 370 行, 写完当天那两篇之后 387 行(数字随写作增长,所以复算时要说清扫的是哪个 commit)。
反直觉的结果是:大部分过得了判据。 那些 A 侧真的有出处 —— 退役模型留下的脏数据、 上一篇文档明写过的判断、审计报告里的读法陷阱。所以这条规则没有拿去回溯清洗全库, 它只在起草那一道生效。
规则上线当天写的一篇长文命中 10 处,逐条过判据之后留 7 删 3。 留下的那 7 处,出处能指到具体文件、提交和 PR 编号。
删掉的 3 处都是作者自己立的靶。其中一处是为了给某一节起个开场 —— 句法框架留了 A 的空位,作者就填了一个没人持有过的读法。
站在谁的肩膀上
我们的润色环节直接用了两个开源 skill,都是 MIT:
- blader/humanizer(作者 Siqi Chen)—— 英文稿用它。它是一份 35 条模式的清单,思想来源是 Wikipedia 的 Signs of AI writing, README 里写明了。本文前半段对这个句式的认识,最初就是从它来的。
- KKKKhazix/human-writing —— 中文稿用它。独立的中文 skill,不是前者的翻译。
中文圈把「去 AI 味」讲清楚的一个入口是 B 站的 《为什么 AI 写的东西一眼就能看出来?我做了个去AI味技能》 (UP 主网络小白_Uncle城,2026-08-19 发布,截至 2026-09-02 约 91 万播放)。UP 主让 12 款模型写同一篇 《TCP 三次握手》科普稿,逐句统计:12 篇里 10 篇开头趋同,三段式合计 302 次, 破折号单篇最高 22 个,「不是 A 而是 B」被他排在最烂句式第一名。
一点要说清楚:这些数字是作者自己的实验结果,不是第三方研究。 另外视频里演示的那个「humanizer 四层自检」是他在工具里现场用一段 prompt 生成的同名 skill, 跟上面那个 blader/humanizer 是两个项目,只是重名。
这篇自己的成绩
用一条正则扫这篇文章,命中 15 行。逐条过判据:
- 7 处是在指名或引用这个句式(包括上面那两个正反例句),提及不是使用,不算。
- 8 处是真的在用,A 各自指得出出处。最典型的是「注意分母是对话,不是消息」—— 那个误读有出处:语料是按消息数报的,6% 却是按对话算的。
- 删掉 1 处:「它是起草闸,不是清理工具」。前半句已经把话说完了, 否定那半句删掉信息量不掉,属于次级检查里那种冗余,删。 它现在只以引文形式活在上面那 7 处提及里,所以 7 + 8 加不出 16。
那条正则还漏了几处同族(跨句的、跨行的、「不算 A,是 B」这种变体),逐一看过都过判据。 脚本只负责定位,判决还是人给的 —— 英文篇那边同理,只是英文没有一条正则能罩住这个族。
还有一处踩了自己的另一条规则:文章要指名 en-dash 这个字符, 而规范禁止它出现在正文里。最后写成码位 U+2013,没有摆字形。
这个残留量说明了开头那句话:约束给到位,模型写得出没有 AI 味的句子。 不是零命中,是每一处都能说清为什么留。
上面这句本身也是一次使用,而且过得了判据:它的 A ——「那应该是零命中」—— 是你读到前一句时真会有的预期。规则从来不是要句式绝迹, 是要每一次出现都有人能说出那个 A 从哪来。
由 Henry Lin 提示,Opus 5 撰写。