词典本来要帮我,为什么突然替我说了一长串话

今天我在讲密钥灌注怎么落地。

我要梳理的是三个层面:密钥机房由 Future X 还是别的供应商承载;云端的 Key 能不能从 TCS、FIS 和 ISO 银行拿到;以及硬件厂商的读卡 SDK。最后还要决定,KPOS 或 Hante Pay 的密钥维护模块,是独立程序,还是放进核心 payment SDK。

结果出来以后,原本的口述中间突然挤进了一长串英文名:Claude Code、Codex、LinkedIn、Luqra、City、P3H、ChatGPT、DBA、CPadPay、Fiserv、CR100、KeyUS、KPOS、Typeless、Elavon、P3Mix……很多根本不是我这一刻说的内容。

这不是普通的“一个词听错了”。它像是 Xtype 把自己的英文词典翻开,整页念给了我。

词典为什么会跑进正文

复盘本机保存的完整处理过程后,问题发生在哪一步很清楚。

这条记录的第一遍 Grok 语音识别收到了 62 个词典提示:22 个中文词、40 个英文词。语音处在“硬件厂商,像……”这样的列举语境时,识别模型没有只把这些词当作拼写参考,而是把其中一大批当成了我正在继续列举的内容。

因此,英文清单在原始识别稿里就已经存在。第二遍整理又在 8 秒后超时,Xtype 为了不丢话,按原来的安全规则回退并保留了原始稿。回退没有制造污染,但把已经受污染的文字完整交给了我。

这次事故说明了一件事:接口允许传很多提示词,不代表产品应该每次把名额填满。词典越大,提示越多,不一定越准;当提示脱离当前这句话时,它们也可能成为模型凭空补写内容的来源。

“越用越准”应该发生在哪一步

我此前给 Xtype 定的原则是:我们不能训练 Grok,也不能控制基础识别模型变得多聪明。Xtype 能做的是记住用户亲手确认的偏好,让同一个人的系统越用越懂他。

这个价值没有改变,但实现位置必须改变。

新的流程是:

音频 → 不带词典的原始识别 → 匹配当前句的个人常错词 → 确定性纠正 → 整理 AI → 最终文字

第一遍只回答“音频里听到了什么”。词典不再提前灌给 Grok,也不再灌给本机 Speech。

识别完成后,Xtype 才查看当前这一句是否真的出现过用户确认的错误写法。例如识别稿里实际出现 Kels,本机又有用户批准的 Kels → Kiosk,这条映射才进入纠正;没有出现在当前句里的几十个公司名和产品名,不参与这一轮。

这样,词典仍然能让系统越用越准,但不再有机会替用户说话。

为什么没有只把 62 个缩成 8 个

把上限从 62 改成 12 或 8,看起来改动最小,但它没有修掉问题的性质:模型仍然可能把未说过的提示词写进原始稿,只是一次少写几个。

所以 0.1.111 选择的是硬边界:第一遍 STT 的词典提示固定为空。普通听写、长口述分段、失败重试和历史重新转写都经过同一条规则,不能因为某条旁路继续把词典带进去。

真实出错的那批词也进入了回归测试。以后即使代码再次收到这份词表,第一遍识别请求仍必须丢弃它。

词典没有被删除

这不是把“越用越准”撤掉,也不是把用户已经维护的词作废。

词典仍在本机,用户纠正过的来源仍在,识别后的别名匹配和第二遍 AI 仍会使用当前句相关的少量映射。改变的只是顺序:先忠实地听,再根据用户自己的习惯纠正。

一个语音输入工具最基本的边界,是不能把系统知道的内容冒充成用户说过的话。0.1.111 把这条边界重新立在第一步。