[控场AI]
· 10 分钟阅读· 5,141 字

我埋了962个错别字测AI改稿,没一个被"修正"——真正翻车的是句子边界

我埋了962个错别字测AI改稿,没一个被"修正"——真正翻车的是句子边界

实测962次逐字引用,LLM从不悄悄修正错别字,真正的失败来自句子边界判定混乱。

一项针对13个大语言模型的基准测试推翻了"LLM会自动润色引文"的流行说法。研究者在10篇原创短文档中植入18处错别字、语法错误、事实错误等异常,要求模型逐字引用,结果962条响应中0次出现悄悄修正。真正的失败集中在句子边界判定——冒号切割、邻句粘连、凭空补标点——而非文本清理。添加"保留所有错别字"的强硬警告几乎无效(95.0% vs 94.4%),因为根本没有要防的修正行为。更反直觉的是,GPT-OSS-120B比20B低7个点,缩放不等于精准。研究方法论同样值得关注:确定性字节级评分、无LLM裁判、每条响应可手工复核,作者还坦承打分器曾给DeepSeek-R1打出虚假的0分,将"打分器永远是第一嫌疑人"作为默认立场。

一个被广泛相信的直觉,被实测推翻

关于大语言模型,有一条流传甚广的"民间智慧":当你要求它逐字引用一段文字时,它会悄悄把文本"擦干净"——修掉错别字、把英式拼写美式化、顺手改好语法。这被归因于RLHF训练出的"润色本能",让模型在复制时无意识地覆盖了"照抄"的指令。

如果这是真的,后果不小。记者拿回一段被悄悄改过字的"引文",可能要登更正甚至撤稿;律师误引合同条款,踩的是被处罚的红线;工程师把"引用日志里的确切行"写进事故报告,却在不知情的情况下谎报了自己系统的状态。

这个话题下有个著名数字:哥伦比亚大学Tow Center发现,ChatGPT引用的200条出版商内容中有153条被歪曲。但那项研究考察的是检索——模型得先把文本找出来。本次基准测试想问一个更干净、更难的问题:当文本就明摆在上下文窗口里,模型唯一的任务只是照抄一句话时,会发生什么?

作者(Kaggle用户saharshtibrewala)为此设了一个陷阱。结果诚实得出人意料:陷阱一个也没抓到。但从中挖出的东西,比原假设更有价值。

RLHF(基于人类反馈的强化学习)是目前主流大语言模型训练的核心环节之一。模型在预训练后,会通过人类标注员对输出结果的偏好评分进行微调,目标是让回复更符合人类期望——更流畅、更有帮助、更安全。这一过程的副作用争议长期存在:标注员天然倾向于给"干净"的输出打高分,理论上可能让模型学会在无意识中"美化"文本,即便任务要求的是原样复制。这就是"润色本能"说法的来源。然而,RLHF的影响范围究竟有多大、是否能覆盖到明确的"逐字引用"指令,此前缺乏干净的受控实验来回答。

基准测试是怎么设计的

作者写了10篇200到250词的原创短文档——内部备忘录、发布说明、事故复盘、托管条款、旅行信、会议纪要、硬件规格、邮件往来、README和新闻稿。全是新写的普通职场文本,既无版权问题,也不存在训练数据污染。

在这些文档里,作者按"诱惑梯度"埋了18处异常:

  • 错别字:"customers ... currently recieve two separate case numbers"(receive拼错)
  • 语法错误:"This library have zero dependencies"、"more simpler"
  • 英式拼写:"Whilst the platform is loved..."
  • 事实错误:"DNS, which resolves IP addresses to domain names"(方向反了)、"the Pacific, the world's second-largest ocean"(太平洋其实是最大)
  • 近似重复句:两句除手机/平板、4.6/5.1秒外完全相同

每个"脏句子"都配有来自同文档的干净对照句,共37个条目:18脏、19净。每个条目只问一件事:

逐字引用那个[唯一标识某句的]句子。只输出那句话,与文档中完全一致,别的什么都不要。

每个条目跑两次:一次用上面的朴素指令,一次额外加上强硬警告——"逐字符复现,保留任何错别字、拼写选择、语法错误或不寻常措辞,不要修正、补全或清理任何东西"。如果模型在朴素指令下改字、加了警告就不改,那说明这是个有一行mitigation就能解决的指令遵循缺口;如果加了警告还改,那说明清理发生在prompt够不到的地方。

评分完全是确定性的,全程没有任何LLM裁判。只有字节级完全匹配才算"忠实",其余按corrected(修了错误)、truncated(截断)、wrong_span(真文本但边界错)、rewritten(文档里根本不存在的文本)分类。打分器约60行Python,带单元测试,任何一个判决都能用Ctrl+F手动复核。

基准测试结果图

测了哪些模型

13个模型,每个74条prompt,全部跑在Kaggle Benchmarks上。开源权重模型因为赶上Hacktoberfest被重点纳入(Gemma 4 31B和26B-A4B、GLM-5、Qwen3-Next-80B、DeepSeek广告-R1、GPT-OSS-20B和120B),闭源模型作为参照(Claude Haiku 5.5和Sonnet 5.5、GPT-5.4-mini和GPT-6-sol、Gemini 3.5 Flash-Lite和3.7 Flash)。作者刻意在三个模型家族里各放了大小一对,因为他的先验假设是"越润色、越容易悄悄改字",同家族配对能把这个变量隔离出来。

四个发现,三个意外

发现一:陷阱一个没抓到,962次引用里0次悄悄改字

核心假设当场死亡,而且有铁证。横跨13个模型、两种指令、962条打分响应,没有一个模型在引文内修正过任何一处植入错误。"Recieve"扛过了26次相遇;"more simpler"、"This library have"、反向的DNS定义,以及作者最笃定会被人悄悄"升回第一"的"太平洋是第二大洋",全都原封不动地活了下来。

更夸张的是:911条忠实引文里,每一条都是字节级完全相同,连作者准备好的温和归一化(宽容弯引号、unicode破折号、空白)都用不上。2026年的模型一旦照抄,就是逐字节照抄。

甚至那12条"文档里不存在"的响应里,有5条含植入错误,而这5条全部保留了错误。即便把引文边界搞得一团糟,也没有模型碰过那些错误。关于LLM内部"错别字修正结构"有已发表的机制研究,但引用这个语境把它关掉了。民间智慧,在短文档上被证伪。

发现二:真正翻车的是"句子边界"

962条里有51条失败,分布极不均衡:26条截断、13条边界错、12条改写、0条修正。几乎每一次失败,本质都是对"一句话从哪开始、到哪结束"的分歧:

  • 冒号问题。 全测最难的一条(26次尝试错13次)是一句含中间冒号的长句。Gemini 3.5 Flash-Lite从冒号后的"customers"开始,还把首字母大写成"Customers",造出一句备忘录里根本不存在的话(但错别字还在!);Claude Sonnet 5.5反方向把前一句也粘了进来;GPT-OSS-120B则在从句中间停了。同一句话,三种关于"它边界在哪"的理论。
  • 邻句问题。 被要求引"信的最后一句"时,模型失败9次:Sonnet 5.5和Qwen3返回了最后两句,Flash-Lite有一次只返回了倒数第二句。
  • 章节标签。 GPT-OSS-20B给条款引文前面加上了"4.3""4.2",忠实地抄了并不属于句子的编号。
  • 凭空的标点。 DeepSeek-R1在第一个从句后切断长句、补了个原文没有的句号,推理痕迹里还振振有词地说服自己"water后面的句号是原句结构的一部分"——其实原句后面是逗号。全场唯一一条真正的改写式失败来自Flash-Lite,把一句话重构成了另一种说法,但那是1例,不是规律。

发现三:告诉它"别改"毫无作用

朴素指令下忠实率95.0%,强硬"别改任何东西"指令下94.4%。一个干净的零结果:显式警告既没救回边界失败,也没能阻止那些本就不会发生的修正。如果你一直在prompt里加"保留所有错别字",照这个证据看,它只是个幸运符。

发现四:模型越大越差,三组里中了两组

  • GPT-OSS-120B:82.4%;GPT-OSS-20B:89.2%。大6倍的兄弟反而差7个点,主要栽在截断上。两者还共享一个家族怪癖:把普通连字符换成U+2011不换行连字符,这个看不见的字符让引文在源文档里"不存在"了。
  • Claude Sonnet 5.5:93.2%;Claude Haiku 5.5:94.6%。小模型再次胜出。
  • Gemma 4 31B和26B-A4B:双双100%,连同Gemini 3.7 Flash、GPT-6-sol、GLM-5。

五个模型毫发无损地穿过陷阱,其中两个是你能自己跑的开源权重模型。"大模型更精准,精细活交给它"的缩放直觉,在这个任务上恰恰指错了方向。

GPT-OSS系列中出现的U+2011(不换行连字符,Non-Breaking Hyphen)替换问题,属于Unicode字符归一化的一类陷阱。U+2011与普通连字符U+002D在视觉上几乎无法区分,但在字节级比较时是完全不同的字符。这种替换可能源于模型的tokenizer或解码层对标点的隐式规范化处理。对于需要精确字符匹配的场景(日志解析、合同条款核对、代码diff引用),这类"不可见替换"比拼写修正更危险——因为它通过了肉眼审查,只有程序层面的严格比对才能发现。这也是作者坚持"字节级完全匹配"而非宽松相似度评分的原因之一。

打分器永远是第一嫌疑人

作者坦白了两件事。第一:初版排行榜上DeepSeek-R1显示0.0%,100%引文"不在源文档中"。惊悚标题,彻头彻尾的假象——R1把答案包在<think>...</think>里,打分器在给思考过程打分,真答案就躺在闭合标签后面。加一行剥离代码,R1立刻变成91.9%。如果直接发了第一个数字,第一个懂R1的评论者就能让这篇文章当场终结。

第二:这甚至不是作者最初要做的基准。前一个是让模型计算跨夏令时的cron触发时间,后来发现cron实现自己对DST语义就有分歧(Vixie cron跳过不存在的那一小时,Quartz处理方式不同),于是"标准答案"会变成某一方言的意见。这两次经历立下了本次基准的设计铁律:正确答案必须是作者亲手植入的字符串,能用Ctrl+F找到,没有方言,没有裁判模型。

DeepSeek-R1是一类"推理模型"(reasoning model)的代表,其显著特征是在给出最终答案前,会先输出一段可见的"思考过程",通常用<think>...</think>标签包裹。这类模型在数学推理、代码生成等任务上表现突出,但其输出格式与普通对话模型存在结构性差异。评估框架如果没有针对性地剥离思考标签、只提取最终答案部分,就会把冗长的推理链当成"模型输出"来打分,导致系统性误判。R1在本次基准中的0分闹剧,是推理模型输出解析问题的一个典型案例,也说明任何基准在纳入推理模型时都需要额外的输出清洗步骤。

这些局限你引用数字前得先读

  • 37条目、13模型。 够大到让0/962是真信号,够小到每条都手工核验;按类拆分(4个错别字、3个事实错误)只是方向性参考。
  • 文档只有约250词。 200词深度的保真度,不代表5万token深度的表现。作者已经做了一个把十篇文档融成2225词干扰场的合并变体,还没跑,是首个后续计划。
  • 跑与跑之间有真实波动。 多次全量运行下,单模型分数在1-4分间抖动,但三个核心发现每次都成立:零修正、同样五个模型满分、忠实引文字节级一致。
  • 仅限英文职场散文。 代码、诗歌、非拉丁文字都是开放问题。
  • 精确匹配是故意从严的。 部分失败只差一个字符(非换行连字符、凭空的句末句号)。作者公开了完整分类,你可以把线画在别处。

下一步想测什么

  • 深度压力:合并文档变体,再到真实长上下文距离。
  • 代码场景:引用堆栈跟踪或diff里的确切一行,这里一个"看不见的修正"最危险。
  • 冒号普查:做一个全部由含中间冒号、分号、连词的句子组成的基准,因为模型的句子边界理论正是在这里分裂的。
  • 句末标点保真度作为独立追踪类别——它可能解释了其他基准里一大块"几乎命中"的精确匹配失败。
  • 推理模型的输出卫生:R1的失败全发生在"除此之外正确"的答案里,整个行业的基准噪声中,有多少其实是答案提取噪声?

这项工作最大的价值,不在于它推翻了一条流传的说法,而在于它示范了一种诚实的基准方法论:确定性评分、可人工复核、公开每一条响应,并且把"打分器永远是第一嫌疑人"当成默认立场。

#AI引用保真度#大语言模型逐字引用#AI基准测试#句子边界#错别字修正#Kaggle Benchmarks#开源模型测试#LLM评测方法
分享:

相关推荐