专业书籍精读 · Generative AI System Design Interview · 第 3 章
Generative AI System Design Interview · Ch 3 · Ali Aminian, Hao Sheng & Alex Xu · 2024
你在手机上拍一块外文路牌,几百毫秒后屏幕上出现一句通顺的中文。这一章讲的就是背后那台机器怎么造:它要同时伺候一百多种语言,其中大多数语言它几乎没见过几句像样的例句。
老办法像一个查短语手册的人:把句子剪成小块,一块一块查手册、再拼回去。拼出来的你能看懂,但一读就知道不是人写的——没有哪一块知道整句在说什么。
新办法像一个真译员:先把整句听完,脑子里形成一个意思,然后一个词一个词地说出译文。而且他说每一个词的时候,眼睛会回到原文上再扫一遍,看看这个词该对着原文的哪个位置——这一下,长句子就不会说着说着走丢了。
世界上有七千种语言,可网上的双语对照材料几乎全挤在十几种大语言上——英法之间要多少有多少,有些语言连一万句像样的对照句都凑不齐。更麻烦的是数量:两种语言之间要一个译员,一百种语言两两之间就是近一万个方向——不可能每个方向都单独养一个。
第一,让一个人学会所有语言。 不给每一对语言各造一台机器,而是造一台,在句子开头贴一个小标签写明「翻成中文」。好处是语言之间会互相帮忙:它从西班牙语里学到的语法感觉,能借给几乎没学过的邻近语言用。甚至会出现一种怪事——有些方向它从没被教过,却也能翻,因为它分别学过这头和那头。
第二,给缺料的语言自己造练习题。 某种语言只有单语文章、没有对照译文,就先用现有的机器把它翻成英语,得到一份质量一般的「假对照」,再拿这份假题反过来练翻译。题目是假的,但确实能练出真本事。
第三,先决定谁多练。 如果照着网上语料的真实比例安排练习,那台机器九成时间都在练英语和法语,小语种永远轮不上。所以要人为地把小语种的练习配额调高——代价是大语种会略微退步。这是这一章最核心的那个取舍:盘子就这么大,多分给谁,就得少分给谁。
怎么知道它翻得好不好?常用的办法是拿译文和一份「标准答案」比对,看重合了多少个词。可同一句话本来就有很多种正确译法——换个说法,词对不上、分数就掉,人读着却一样好。所以这个分数只能看大方向,真要判断好坏,最后还得请人来读。
翻译系统的工程难点不在「怎么把一种语言变成另一种」,而在怎么在极度不均的资源分配下照顾到所有人,以及怎么在没有唯一正确答案的任务上,衡量自己到底有没有变好。
想进到具体机制、记号和示意图? → 切到精读版
你以为机器翻译难在语言学,其实难在资源分配和度量:模型形态(编码器–解码器 + 注意力)在 2017 年后基本收敛、不再是争点,真正决定系统成败的是——怎么用一套参数同时服务一百多种语言而不让小语种饿死,以及怎么在一个没有唯一正确答案的任务上判断自己有没有变好。 这是本书里第一道「输出是完整句子、必须逐句评质量」的题。
un-、-ing),让固定大小的词表能拼出任意词,包括没见过的。0–100,越高越好。这是 Part II 十道真题的第二道。上承 Ch2 智能撰写——同样是序列生成,但 Ch2 的预算只有百毫秒、被迫用小模型,翻译允许几百毫秒、能上大模型,两章对照正好量出「延迟预算」能把设计拉开多远。下启 Ch4 ChatGPT:从「有参考答案的生成」走向「连参考答案都没有的生成」。现实对应 Google 翻译、DeepL、字幕与文档本地化,以及任何跨语言检索与客服系统的底座。
统计机器翻译的做法是把句子切块、查短语表、再拼回去。它能用,但没有任何一块知道整句在说什么,长距离关系全丢——性数一致、语序重排、代词指代,拼接式系统结构上就够不着。
更硬的问题是规模与倾斜。其一,语言对按平方涨——N 种语言两两互译有 N×(N−1) 个方向,N=100 就是 9900 个,每个方向单独训练、上线、监控一个模型,工程上不可能。其二,语料极度长尾——英法、英西轻松拿到上亿句对,很多语言全网可用的干净句对不足 十万,差四个数量级往上。
不解决会怎样?会得到一个「二十种语言很好用、其余一百种像机翻笑话」的产品。而这一章真正的野心是:让那一百种从二十种身上借力。
翻译被建模成:给定源句逐词生成目标句,每步在整个词表上挑下一个 token。两条工程后果。其一,延迟与输出长度成正比——生成 N 个 token 就跑 N 次前向,于是「翻长文」和「翻短消息」是两类 SLO:交互式常把 p95 定在几百毫秒,批量文档按吞吐算账。其二,正确译文不止一个,这直接埋下了后面评估那一节的全部麻烦。
需求澄清该问的是:支持多少语言、文本还是语音、交互式还是批量、要不要保留格式与术语表。「支持多少语言」这一问决定架构,其余只决定参数。
词级词表在多语言下当场崩溃:一百种语言的词并起来是几百万条,而嵌入矩阵的大小正比于词表。子词切分(BPE / SentencePiece)把词切成常见片段,用几万条的共享词表拼出任意语言的任意词——包括训练时没见过的人名和新词。
共享词表还有一个常被忽略的红利:它让语言之间产生了真正的参数共享——拉丁字母系语言大量共用同一批子词片段,从西班牙语学到的表示可被加泰罗尼亚语直接复用。代价是词表配额的争夺:不做平衡,词表会被高资源语言占满,小语种的词被切成一地碎片,同一句话的 token 数可能是英语的三四倍,成本与质量一起变差。
做法朴素得出奇:不改结构,只在源句前加一个目标语言标记,如 <2zh> 表示「翻成中文」,然后把所有语言方向的句对混在一起训练同一套参数。
它买到三样东西。运维上,9900 个模型塌成一个,训练、上线、监控、回滚都只有一份。质量上,发生跨语言迁移:低资源语言借用高资源语言学到的句法与语义结构。能力上,出现零样本——从没见过葡萄牙语→韩语的句对也能翻,因为两端各自与英语的映射把中间表示拉进了同一个空间。
代价叫容量稀释(capacity dilution,又称多语言的诅咒):参数固定时语言越多、每种语言分到的容量越少,高资源方向往往比它的专用双语模型略差。所以真实系统常是混合的——头部方向另配专用适配器,长尾统一走多语言大模型。
迁移能借到一部分,但缺料终究得补。三条主线:
回译性价比最高。目标语单语文本多得是,先用反方向模型把它译成源语,得到「机翻源句 + 人写目标句」的合成句对。关键在方向:输入端是机翻、输出端是真人写的,所以学到的生成分布仍然干净。
语料挖掘:从网页、字幕、多语官方文档里自动配对句子,靠多语句向量算相似度筛选。量极大,噪声也极大——脏语料的危害常被低估:一对错配句子教给模型的不是错词,而是「可以脱离原文自由发挥」。
数据平衡:训练时按真实语料比例采样,等于把绝大部分算力喂给英法德西。实践做法是按语料量的 1/T 次方重新加权(T 越大越平),人为抬高小语种配额。这是一个直接的零和旋钮:低资源方向的分数涨,高资源方向就掉,没有免费午餐,只有你愿意在哪头让步。
BLEU 数的是译文与参考译文重合的 n-gram 比例,再乘一个惩罚过短译文的系数。便宜、快、可回归,于是做了二十年默认尺子。但它的假设是好译文长得像参考译文,而翻译恰恰一对多——同义改写、换语序、换句式,人读着一样好,BLEU 直接扣分。
于是标准做法是三层并用:BLEU / chrF 做每日回归的快尺(chrF 按字符算,对芬兰语这类形态丰富的语言更稳);COMET / BLEURT 这类学习型指标做上线前把关,它们直接在人工打分上训练,与人的相关性明显更高;MQM 人工评估做最终仲裁,贵且慢,只在关键版本上跑。
还有一类自动指标天然测不出的问题要单列检查表:低资源方向的幻觉(输出一段与原文无关却极其通顺的话——错得流畅,生成式系统的典型失败形态)、性别与职业刻板印象、术语与品牌名被「翻译」掉。
表 1 · 一百种语言怎么装:三种架构
| 每个方向一个双语模型 | 以英语为中转(枢纽式) | 单一多语言模型 | |
|---|---|---|---|
| 模型数量 | 约 N×(N−1),N=100 时约 9900 | 约 2N,N=100 时约 200 | 1 |
| 质量 | 头部方向最高 | 两跳翻译,误差叠加、语气丢失 | 头部略降,长尾明显提升 |
| 延迟 | 一跳 | 两跳,约翻倍 | 一跳 |
| 新增一门语言 | 要训约 2N 个新模型 | 只训 2 个 | 加进混合语料重训一次 |
| 代价 | 运维不可能,长尾没人管 | 非英语对质量塌陷 | 容量稀释;一次坏训练伤全部语言 |
| 适合 | 只做几对、且质量要顶格 | 过渡方案 / 极少见语对兜底 | 默认姿势,头部方向可另配适配器 |
表 2 · 低资源语言:四条补数据的路
| 回译 | 网页语料挖掘 | 跨语言迁移 | 提高采样温度 | |
|---|---|---|---|---|
| 需要什么 | 目标语单语文本 + 一个反向模型 | 海量网页 + 多语句向量 | 一个近亲高资源语言 | 什么都不需要,改配比即可 |
| 收益 | 稳定且可叠加,业界默认 | 量最大 | 语系相近时最省事 | 立竿见影 |
| 代价 | 要先有能用的反向模型;合成文本风格单一 | 噪声句对教会模型脱离原文发挥 | 语系不沾边时几乎无效 | 高资源方向直接变差 |
| 先做哪个 | 第一优先 | 与回译并行,但过滤要狠 | 选型时顺带吃到 | 最后微调,按产品优先级定 |
表 3 · 评估:三把尺子各量什么
| BLEU / chrF | COMET / BLEURT | MQM 人工评估 | |
|---|---|---|---|
| 量的是 | 与参考译文的 n-gram / 字符重合 | 学出来的「人会打几分」 | 逐处错误的类型与严重度 |
| 成本 | 近乎零,秒级 | 要跑一个模型,分钟级 | 贵且慢,按人天算 |
| 与人的相关性 | 弱,同义改写被判低分 | 明显更高 | 基准本身 |
| 致命弱点 | 分词口径一变分数就变,跨论文不可比 | 自身有偏,且可被针对性优化 | 贵到只能抽样,覆盖不了长尾 |
| 用在哪 | 每日回归、快筛 | 上线前把关 | 关键版本与争议仲裁 |
这一章的骨架远不止翻译:任何「一套模型服务极度不均的多个群体」的系统都长这样——多语言语音识别、多国站点的推荐与风控、多方言的意图识别。共享参数吃迁移、加标记做条件、用采样配比调公平、最后被一把不完美的自动指标卡住,四步一模一样。
面试里它最值钱的一句是:把「多语言」讲成容量分配问题,而不是语言学问题。 说出「我愿意让英法掉 1 个 BLEU,换二十个长尾方向各涨 3 个,因为增长在新兴市场」,比背任何模型名字都有说服力。
600M 到 54.5B。「长尾要专门造评估集」本身就是结论:没有尺子的语言等于没人管。facebookresearch/fairseq · NLLB 分支 ↗28.9 BLEU,换 GNMT 式注意力后 29.9。这是「注意力不是锦上添花,是修一个结构缺陷」的一手说法。tensorflow/nmt README ↗① 翻译是条件生成:读完整句、逐词生成;延迟与输出长度成正比,正确答案不止一个。
② 注意力修的是一个具体结构缺陷——把整句压进一个固定向量,长句必然丢信息。
③ 共享子词词表是多语言的入场券:几万条拼出所有语言,还顺带制造了跨语言的参数共享。
④ 每个方向一个模型是 N×(N−1) 的死路;一个模型 + 目标语言标记把它塌成一份。
⑤ 单模型买到跨语言迁移与零样本,代价是容量稀释:高资源方向常比专用双语模型略差。
⑥ 低资源四条路:回译(第一优先)、语料挖掘(量大噪声大)、近亲迁移、调采样温度。
⑦ 采样温度是零和旋钮:尾部抬多少,头部掉多少——这是产品优先级问题,不是优化问题。
⑧ BLEU 的假设「好译文长得像参考译文」在一对多的翻译上本就不成立;分词口径一变分数就变。
⑨ 评估要三层并用:BLEU / chrF 快筛 → COMET / BLEURT 把关 → MQM 人工仲裁。
⑩ 自动指标测不出的失败要单列:低资源方向的流畅幻觉、性别刻板印象、术语与品牌名被翻掉。