脏输入是"模型变笨"的常见原因
用户从 Word 复制来的文本带零宽字符 ✔、从 PDF 复制的带换行错乱 ✔、
从表格复制的是制表符混空格 ✔ —— 这些"看不见的脏"会破坏匹配 ✔、
让格式校验莫名失败 ✔、让检索召回落空 ✔。
在进入模型之前先把输入规范化 ✔,比事后调提示词有效得多 ✔。
一、六个规范化动作(按优先级)
- Unicode 归一化(NFC/NFKC ✔)—— 处理组合字符与全角/半角 ✔;
- 去零宽与不可见字符(U+200B~200D、U+FEFF ✔)—— 它们会静默破坏匹配 ✔;
- 统一换行(
\r\n→\n✔)与压缩连续空行 ✔; - 去首尾空白、去掉重复分隔符 ✔;
- 编码修复(非法字节替换或拒绝 ✔,别让乱码进链路 ✔);
- 长度与类型校验(超长截断并标注 ✔ —— 见长尾输入那篇 ✔)。
第 2 条最容易被忽略 ✗:零宽字符肉眼不可见 ✔,但会让"看起来一样"的两段文本比对失败 ✔。
二、规范化要"可解释"
- 记录做了什么改动(去掉多少字符、是否截断 ✔);
- 改动大时提示用户 ✔("已去除 12 个不可见字符" ✔)——
这比静默处理更让人放心 ✔;
- 原始输入要保留(用于复现与审计 ✔ —— 见可复现那篇 ✔)。
三、什么不该被"规范化"掉
- 代码块里的空格与缩进 ✗(一改语义就变 ✔);
- 数学公式与符号(如
≤、×✔); - 多语言混排中的原始写法(日文假名、阿拉伯文 ✔);
- URL/ID/哈希(大小写敏感 ✔ —— 归一化大小写会直接搞坏 ✔)。
做法:把文本分成"自然语言段"与"结构化段"(代码/公式/ID ✔),
只对前者做激进规范化 ✔。
四、该观测什么
- 规范化改动率(去掉了多少字符 ✔ —— 异常升高说明上游有问题 ✔);
- 规范化后校验通过率的提升 ✔(这是它价值的直接证据 ✔);
- 因脏输入导致的失败占比 ✔(分类型统计 ✔)。
五、一个最小实现
① 统一换行 → ② 去零宽/不可见 → ③ Unicode 归一化
④ 分段(自然语言 vs 代码/公式/ID)→ ⑤ 只对自然语言段做空白压缩与截断
⑥ 记录改动摘要 + 保留原始输入
一条判据
同样的内容,分别从网页、Word、PDF 复制进系统 ✔,模型的行为是否一致 ✔?
不一致,说明输入规范化没做全 ✗。