我们检查了每一条机器翻译。出错的反而是这些检查。

语言

在发布翻译套件之前,我们在一个小型示例应用上测试了它:将 70 个字符串从六种格式(JSON、Flutter ARB、Android、Apple .strings、gettext 和 Markdown)翻译成德语、俄语、日语、阿拉伯语和西班牙语,使用由 vLLM 在我们自己的机器上托管的开源 Qwen 模型(Qwen3.8-Flash-Next,量化为 4 位)。每个翻译后的字符串在写入之前都会经过检查。350 个字符串中有 4 个被拒绝。这 4 次拒绝都是误判。

检查项包括什么

破坏应用的翻译比没有翻译更糟,因此每条字符串必须保留其占位符(%1$s、{name}、{{count}})、标签、换行符和 URL;必须使用目标语言的书写系统;不能为空、过长或保留英文;复数形式必须恰好覆盖该语言拥有的类别。失败的字符串会带着具体问题重新请求翻译,若再次失败则被排除,应用将在该字符串处显示英文。

四次误判

修复检查项后,第二次运行仅向模型请求那四条字符串,因为其余内容已在翻译记忆中,并在 45 秒内写入了全部 350 条。

我们预期会失败却没有失败的部分

复数形式是简单直译最容易出错的地方:英语只有一和复数两种形式,俄语有一、少、多和其他四种,阿拉伯语有六种,日语则只有一种形式。我们要求模型严格遵循目标语言的复数类别,并逐一检查每种形式的占位符。模型为俄语生成了“1 день, 2 дня, 5 дней”,并正确生成了阿拉伯语的全部六种形式。所有五种语言的 Android 复数形式均一次性通过,所有复数消息也都通过了检查,除了那条被我们的检查误判的日语消息。

检查无法捕捉的问题

随后,我们将示例中的 22 条网页字符串翻译成 Polyglot 支持的全部 42 种语言:924 条字符串中有 924 条通过。通读这些译文时,有一条引起了我们的注意。在高棉语中,“You are offline”(您已离线)被译成了一句表示“您已在线”的话。它是语法正确、使用正确文字且内容完整的高棉语,因此通过了所有检查。检查能发现导致应用故障的问题;而含义错误则需要懂该语言的人工审阅。

要点

对机器输出进行自动检查需要真实的输出作为测试对象。使用虚构翻译的单元测试通过了;而让真实模型编写真实的日语,几分钟内就发现了漏洞。Polyglot 内置了这些已修复的检查机制,以及针对四种情况的测试。这些检查机制本身是免费且开源的:translation-checks(GitHub)。

已更新: