两年前我们接了一个跨境电商多语言客服的项目,被机器翻译的质量和不可追溯性折磨到怀疑人生。明明术语表里写着”退款”要翻译成”refund”,线上翻出来却变成”return”,客户工单来回折腾十几轮。更头疼的是,运营想知道这句译文到底来自哪条语料、哪个版本的模型、谁改过,结果谁也说不清。后来我们痛定思痛,自研了一整套引擎,就是这篇要聊的CNSH通用翻译引擎。这个引擎的核心就三件事:全语言互译、AI鉴定、来源追溯。它不是那种”给你一个API就完事”的开箱即用产品,而是面向企业内部或深度集成场景的一套可治理、可审计、可迭代的翻译基础设施。适合正在自建翻译平台、想把机器翻译管起来的团队参考,也适合对翻译质量评估、数据血缘追溯感兴趣的技术负责人看看。
我先把整体思路掰开揉碎讲一遍,然后重点拆解全语言互译的工程实现、AI鉴定模块怎么落地、来源追溯怎么做,最后列一些我们真实踩过的坑。这里没有PPT式的框架,都是能直接抄作业的实践细节。
1. 项目概述与需求拆解
1.1 最初的问题:为什么需要自研翻译引擎
市面上机器翻译API很多,但大多数团队都会在某个节点碰到四个绕不开的问题。第一是术语一致性,专业领域的专有名词、品牌词、法规词汇,通用模型根本记不住,甚至会一本正经地翻错。第二是语料归属,我们曾经出现过生产环境的模型被偷偷换了版本,线上译文和测试环境对不上,整整排查了两天才发现是有人重新训练后直接替换了模型文件,没有任何版本记录。第三是质量无法审计,用户投诉某句翻译有严重错误,可我们连这句译文是怎么生成的历史轨迹都拿不出来。第四是低资源语种覆盖不足,像越南语、印尼语、土耳其语这种稍微冷门一点的语言,通用API的质量经常不稳定。
CNSH这个项目就是为了解决这四个问题。它不是一个简单的翻译proxy,而是把“翻译、鉴定、溯源”三条能力整合成一个闭环:翻译引擎负责产出译文,AI鉴定负责判断译文质量和内容属性,来源追溯负责记录从语料到模型的完整数据血缘。这三者缺一不可,否则只能算一个加强版API。
1.2 CNSH这个命名背后的思路
CNSH是Common Natural-language Semantic Hub的缩写,中文可以直接叫“通用自然语言语义中枢”。命名时我们有意避开”neuro-machine-translation”这类时髦词,因为团队心里清楚,这玩意儿的核心不是某个神经网络的魔法,而是把语言资源、模型能力、审计治理组合成一个中枢。如果只用MT(机器翻译)来框它,就很难让客户理解为什么还要有AI鉴定和来源追溯。
实际上,很多做翻译平台的企业都踩过同一个坑:一上来就奔着”翻译质量”去,忽视了数据治理。结果模型上线后,成了无人敢动的黑盒子。CNSH从设计第一天就把“可追溯”作为一等公民,所有的翻译请求、模型版本、语料来源都被记录成结构化事件,最后形成一条完整的血缘链。这一点在后来的实际运营中救了我们很多次。
1.3 三条主线:互译、鉴定、溯源如何协同
很多人第一次听到这三个词并列时会觉得奇怪:翻译和鉴定还好说,来源追溯更像是数据库的事,怎么会和翻译引擎放在一起?我们当时的设计逻辑是这样的:翻译引擎每生成一条译文,都会产出一个翻译事件,事件里包含原文指纹、模型版本、使用的术语表版本、语料库批次、后处理规则列表。这些信息一部分直接用于来源追溯,另一部分则交给AI鉴定模块做质量评估。比如鉴定模块发现某条译文是机翻痕迹很重的高风险文本,就能通过溯源ID反查到是哪一批语料、哪个模型参数导致的,快速定位问题,而不是整个模型回滚。
这三条线在架构上可以分成两个平面:数据平面负责翻译请求的处理,管理平面负责鉴定和溯源。数据平面要延迟低,管理平面可以异步。我们最初犯过一个错误,把鉴定和溯源都放在同步链路上,结果一个鉴定模型推理一次就要80毫秒,整个翻译接口的P99从300毫秒涨到了480毫秒。后来改成异步写事件、同步返回译文,性能问题迎刃而解。
2. 整体架构设计
2.1 模型层选型:开源基座加微调
CNSH没有从零训练一个万语模型,这既不现实也没必要。我们选的是开源翻译基座模型作为底子,比如M2M100和NLLB系列,这个选择在当时有几个理由。一是它们原生支持上百种语言之间的互译,符合“全语言互译”的预期;二是模型权重开放,可以自己做领域微调,不会受制于某个云厂商的API配额;三是社区生态成熟,推理优化方案多,容易落地到我们的技术栈里。
不过直接拿开源模型上线是远远不够的。我们在基座之上做了两层定制:第一层是领域自适应预训练,用行业平行语料继续训练,让模型熟悉业务语境;第二层是术语增强,通过外部术语库在推理时动态注入约束。这里有一个重要心得:不要只依赖模型内部记住术语,要在解码阶段加入术语约束,否则你永远无法保证专有名词百分百准确。
一个具体例子:业务方要求“订单取消”一律翻译成“order cancellation”,我们不能指望模型每次都乖乖听话。我们实现了一个基于有限状态机的术语约束模块,在beam search解码时强行锁定候选序列,让指定术语的得分被拉高到几乎必选的程度。这个模块后来单独抽出来作为服务,其他模块也会调用。
2.2 全语言互译的工程实现:语言路由与降级策略
“全语言互译”听起来很霸气,但真到工程层面,第一个要解决的问题是:模型支持几千种语言对,但不可能为每个语言对都加载一个大模型,显存也扛不住。我们用了语言路由加动态加载的方案。语言路由负责判断源语言和目标语言,把它们映射到一组预定义的翻译策略上。策略有四种:首选是专用大模型直接翻译;其次是多语言大模型分组翻译;再不行就使用桥接语言,比如某些冷门语种没有直达模型,就通过英语中转;最后兜底是规则加词典的替换式翻译。
这套降级策略是必须提前设计的。我们曾经在冷门语种上直接调用多语言模型,发现某些语言对(例如祖鲁语到芬兰语)质量惨不忍睹。后来通过桥接语言策略,先翻译成英语,再从英语翻译成目标语言,质量提升明显。虽然这样会有信息损失,但至少比瞎翻强得多。
这里还要提一下语言识别。语言识别错误会直接导致路由错误,所以我们没有用模型自带的语言分类器,而是单独训练了一个轻量级语言识别器,基于字符n-gram和fastText的迁移模型。识别器输出每个语言的置信度,低于阈值时进入人工确认队列,或者用多种语言同时翻译返回候选。这个细节虽然不起眼,却是全语言互译稳定性的基础。
2.3 AI鉴定模块怎么做
AI鉴定模块在CNSH里承担两个任务:一是鉴定译文是否为机器翻译生成,二是鉴定译文质量等级。前者主要用于内容安全和人工审核分流,后者则用来做质量评分、监控劣化趋势。
机器翻译文本鉴定本质上是一个二分类问题,但难点在于特征选择。我们最初尝试直接用BERT分类模型,输入原文和译文,效果一般,尤其在模型翻译质量较高时,和人工翻译几乎区分不出来。后来我们组合了多组特征:译文与原文的语义相似度、翻译一致性得分、句法复杂度分布、罕见词比例、翻译模型的困惑度等。把这些特征拼成一个向量,再送入一个轻量级GBDT分类器,准确率提升了不少。
质量等级评估则用了一个两阶段方案。第一阶段用COMET或BLEURT这类神经指标给译文打分,第二阶段结合术语规范性和目标语言语法错误率做规则修正。打分结果除了用于人工审核,还会写入溯源事件,变成后续训练的反馈信号。这里有一个比较容易被忽视的问题:用户真正关心的不是BLUE分数高一点还是低一点,而是译文能不能直接用于生产。所以我们把评估结果分成四个等级:可直接使用、需轻微修改、需重大修改、完全不可用。这个颗粒度更贴近业务审批流程。
2.4 来源追溯的落地方式
来源追溯听起来很“数据治理”,但落地时其实就三块:语料溯源、模型溯源、请求溯源。语料溯源是记录每条平行语料的原始出处、清洗版本、加入时间、质量标签。模型溯源是记录训练任务所用的训练集ID、验证集ID、模型参数、超参数、评估结果。请求溯源则是记录每一次翻译请求的完整处理链路。这个链条最关键的是要把三者串起来,形成一条数据血缘。
我们用了一个叫“翻译事件ID”的字段来串联。每个翻译请求会生成一个ID,从语料查询、模型推理、后处理、人工修改,每一个环节都会往事件里追加一条记录,最终写进Elasticsearch和对象存储。这样一来,前端用户点开一条译文的历史记录,就能看到类似这样的链路:语料批次C-2107的第38条 -> 模型版本NLLB-1.2-finetune-v7 -> 后处理规则组v3 -> 人工审校员A修改。
3. 实操过程与核心环节实现
3.1 语料清洗与平行语料构建
整个项目中,语料清洗占的时间比模型调参还多。我们手里有来自电商平台、客服工单、产品手册的各种历史数据,质量参差不齐。清洗流程经历了五步:去重、对齐校验、术语规范化、低质过滤、安全审查。其中最耗时的是对齐校验,因为很多历史语料是拿Excel硬对齐的,经常出现多余空格、缺行、错位,一旦混进训练集,模型会学到一些很奇怪的对应关系。
我建议所有做平行语料的人都写一个对齐置信度校验器。我们用了LASER嵌入把源句和目标句映射到同一个语义空间,计算余弦相似度,低于0.75的直接进人工复核队列。这个办法有点费算力,但非常值得,因为低质量对齐对模型质量的伤害是累积性的。用这套清洗流程跑下来,语料库从最初的1200万条缩到了830万条,但模型评估分数反而提升了。
3.2 模型微调流程
微调流程我们固定成了四个阶段:预热、领域训练、术语注入、评估发布。预热阶段用通用平行语料继续训练,防止模型灾难性遗忘。领域训练阶段使用清洗后的行业语料,学习率调低到通用训练的十分之一左右。术语注入阶段则是在解码端引入术语约束,不再改动模型权重。评估发布阶段会跑一套多语言、多领域的评测集,评测集里的每条样本都带有人工参考译文和可接受性标签。
这里有一个容易被忽略的细节:微调语料里中英比例如果失衡,模型的翻译风格会偏得很厉害。我们一开始用了大量中英语料,结果中英翻译质量上去了,但英法、英德方向全面退化。后来在领域训练时做了语言对采样均衡,确保每个语言对的样本量不低于一个阈值,才把这个偏置纠正过来。记住,多语言模型微调时,语种分布必须做全局考量。
3.3 接口设计与性能优化
CNSH对外暴露的是gRPC接口和REST接口。内部全部用gRPC通信,因为延迟更低,而且有流式能力;对外REST方便业务方接入。接口设计上最重要的原则:每个请求必须携带trace_id和language_hint,不能完全依赖自动识别。我们接入了很多业务方,凡是忘记传language_hint的,都出现过语言识别错误导致翻译结果匪夷所思的问题。
性能优化方面,我们做的第一件事不是买GPU,而是缓存。同一句话重复翻译的概率非常高,尤其是客服工单中的常见问题。我们在Redis里做了一个带语义指纹的缓存层,相似度超过0.97的请求直接命中缓存,命中率大约能到32%。第二件事是模型推理优化,用ONNX Runtime和CUDA Graph把推理延迟降了四成。第三件事是动态batch,在服务端把同一时间窗口内的多个请求拼成一个batch,能显著提升GPU利用率,代价是增加了尾延迟,后来我们设置batch等待时间不超过5ms。
3.4 质量评估闭环
质量评估不是上线后的事,而是从需求阶段就要跑的。我们在每次模型更新前都会跑全量回归集,这个回归集包括几百个固定的语言对和上千条业务敏感句子。评估结果会生成一份对比报告,在报告上明确标注哪些参数导致了哪些分项的变化。这个环节能帮我们拦住很多拍脑袋调参的冲动。
上线后还要做在线影子评估。新模型先和旧模型并行跑一段时间,用AI鉴定模块对两者的输出做质量打分,同时观察线上反馈数据。只有当新模型的强好率(人工审核员明确表示译文更好)超过旧模型一个百分点以上,才会切全量流量。整个过程听起来很繁琐,但保证了一个原则:任何模型变更都有据可依,而不是靠感觉。
4. 常见问题与排查技巧实录
4.1 低资源语言翻译质量差怎么破
碰到最多的就是“某个冷门语种翻译得跟屎一样”的反馈。排查时首先要确认是不是语言路由错了,很多冷门语种的语言代码容易混淆,比如印尼语和马来语,塞尔维亚语和克罗地亚语。先看请求日志里的language_hint和识别结果,如果识别置信度低,直接在语言识别器里加规则强化。
如果路由正常但质量确实差,那就别硬刚模型,老老实实走桥接语言策略,或者增加该语种的语料。我们发现一个很有效的办法是挖掘平行语料中的“伪相关对”:对某类非英语语种,如果找不到高质量平行语料,可以用英语作为枢轴语言,从维基百科和公开的多语语料库里抽取相似度较高的句对,做一个弱监督扩充。效果虽然不是顶级,但至少能让模型输出可用。
4.2 鉴定模块误判问题
AI鉴定模块最容易被吐槽的就是把人工翻译判成机器翻译,或者把机翻判成人工翻译。我们的经验是不要只看一个模型输出,要综合多个信号。如果你发现判成“机器翻译”的文本里有大量风格一致、完全没有术语错误,那大概率是人工翻译,因为模型生成的文本通常会伴随一些很细微的违和感,比如复数形式过度统一、句子长度分布异常。
另外,鉴定模块最好要可解释。不要只给一个风险概率,要把命中的特征列出来,比如“译文与原文逐词对齐率过高”、“目标语言困惑度过低”、“罕见词占比不足”。这样业务方才能知道为什么被拦下来。我们在鉴定结果里返回了一个结构化JSON,里面包含命中的特征和得分,后来处理客户投诉时省了很多解释成本。
4.3 来源追溯链路丢失问题
最早我们设计溯源时只记录了一小部分关键节点,结果真到排查时就发现某条译文的“术语表版本”是空的,因为当时版本读取字段没写全。后来我们定了一个规矩:所有关键节点必须上报完整的事件消息,缺字段宁可失败重试也不能静默跳过。同时,我们给事件上报加了一个校验器,如果检测到必要字段为空,立刻生成告警。
实操中还有一个坑:人工修改后的译文没有生成新的溯源事件,导致用户看到的历史记录和研究结果对不上。解决方式是定义“人工覆盖事件”,一旦人工审校员确认或修改了译文,就把它标记为新的版本,并保留原先的机器版本供回溯。这样既尊重人工判断,又保留了机器生成记录,整个链路才是闭环。
4.4 性能瓶颈与并发优化
有段时间CNSH的QPS一上去,GPU服务的显存就爆了。排查发现是有好几个翻译策略组各自加载了不同模型,不存在同一份模型权重的共享。我们改成了模型仓库加进程级共享的方式,所有进程通过引用计数共享同一个模型权重,只在推理时复制上下文层,显存占用降低了将近百分之三十。
并发场景下另一个痛点是鉴定模块的模型和翻译模型的显存争抢。我们后来把鉴定模块拆成了CPU推理服务,用Intel的OpenVINO优化,速度基本够用,而且彻底释放了GPU资源给翻译推理。拆分后整体的吞吐量提升了大约一倍。建议任何做综合引擎的团队,都提前规划好模型推理的异构分配。
5. 几个值得记住的实战教训
如果让我只留一条经验,那就是“先定义好可追溯性,再谈模型优化”。很多项目组一上来就沉迷刷BLUE分数,结果模型上线后完全不可控。CNSH的成功一半是工程上的,另一半是管理上的——我们把每一次翻译决策都变成可查的事件流,于是所有问题都能被定位,而不是靠某个老师傅的经验来猜。
还有一个日常运营中的小技巧:每个版本发布前,把上几个版本的已知问题整理成一个“回归卡”,里面写清历史错误样本和期望输出。每次跑模型评估的时候,除了新的测试集,一定要带着回归卡里的样本跑,防止模型旧错复发。这个办法成本极低,但能拦住大量回归问题。
至于后续的扩展方向,我们目前正在做两件事:一是把AI鉴定的能力扩展到图片中的文字翻译场景,二是尝试用大语言模型替换部分翻译后编辑工作。如果你也在做类似的东西,建议多关注线上反馈数据,而不是只盯着离线指标。机器翻译这个领域,只有接住真实世界的复杂语言现象,才能把产品做扎实。