leonx.ai Don't trust, verify
← 回首页

中文 · English

为了让 AI 翻译「有灵魂」,我做了个验证器——结果得先验证这个验证器

2026-06-21 · 一个翻译插件的 build log

上一篇 townhall 收尾我写过一句:验证才是一切,而验证器的价值全在它可不可信。那是从一个多 agent 编排玩具里顺出来的。这篇换个完全不搭界的场景——一个翻译插件——又把这句话验了一遍,而且这回栽得更明白:我做了个验证器去判译文好不好,结果发现,得先验证这个验证器自己。

东西叫 AI 译匠,一个 Chrome 插件,纯客户端、自带 key 直连 DeepSeek。卖点不是「能翻」——谷歌也能翻——是「翻得有灵魂」。就是别整出那种逐字直译、满嘴翻译腔的中文,要像一个中文工程师自己写的。

麻烦立刻就来了:「有没有灵魂」这种话,怎么让机器自己判?我总不能每改一版 prompt 就坐下来肉眼读几十段。没有一个能打分的东西,这事根本迭代不动。

先把「好」拆成三道闸门

「翻得好」太虚。拆成三条,各测各的:一,能翻——别整页抓瞎、别漏段;二,不乱翻——代码、导航、不该动的别动,排版别搞坏;三,有灵魂——地道、没翻译腔、术语得体。

前两条是死的,DOM 上算得出来,不花钱;第三条主观,得请 LLM 当评委。于是两个验证器,正好对上 townhall 里那三招:静态检查、跑沙箱、AI 批判。

翻译验证器:确定的那半,免费,能全量跑

纯 Ruby,Ferrum 开个无头 Chrome,把一批真实网页挨个打开,跑插件真正在用的那套正文抽取,算覆盖率——抓到的正文字数除以页面该翻的可见字数。一个块都没抓到,就是翻不了;覆盖率低,就是漏翻,顺手把漏掉的片段列出来。

挑了 15 个不同结构的页面:博客、维基、新闻、文档、SPA、论坛、仓库、营销、中文站。一跑,13/15。剩下俩一开始判「漏翻」,凑近看才发现冤枉了抽取逻辑:一个是死链,抓回来的是 Apache 报错页;另一个被 Cloudflare 拦了,压根没拿到正文。

卡了一下:报「漏翻」,到底是我抽取的锅,还是页面就没加载对?

这俩得分开,不然你会去改一段其实没毛病的代码。所以加了个 BLOCKED:正文里冒出「Cloudflare / 请验证 / 环境异常」这类词、或者干脆没什么正文,就判「被拦」,不算「漏翻」。先认清是自己错还是环境错,再谈改。

这半很顺。死的东西就这点好,它不会骗你。麻烦在另一半。

灵魂验证器,以及它怎么把我骗了

灵魂这半这么测:同一段英文,凑三份译文摆一块——我们的(prompt 让 DeepSeek 翻的)、金标准(我手挑的好的人工译文)、谷歌(字面直译,当没灵魂的反面教材)。再叫一个更强的模型、开着思考当评委,干两件事:按维度打分,再把三份盖住名字盲排。

第一版评委,我让它直接给我们的译文打分,五个维度各 1 到 5。跑出来是这样:

忠实 5.0 · 无翻译腔 5.0 · 术语 5.0 · 语域 5.0 · 原创 5.0 · 总评 5.0
忠实 5.0 · 无翻译腔 5.0 · 术语 5.0 · 语域 5.0 · 原创 5.0 · 总评 5.0
...一路全是 5

条条满分。我差点就信了——哟,翻得不错嘛。

可这跟 townhall 里那个 0% recall 的 Critic,是一个病:你以为有了验证器,它其实闭着眼睛盖章。一个见谁都给满分的评委,信息量是零,等于没有。验证器自己,先得过验证这关。

改起来不难:别让它凭空打,把金标准摆它面前当满分线——只有翻到这份人工译文的水平才给 5,有一处能改就扣。一句话加进去,分数立马活了:四分一大片,偶尔三分,该扣的扣了,区分度有了。

验证器准了,才敢开 loop

到这才轮到 loop:改 prompt,重跑验证器,看分涨没涨,再改。再普通不过的循环。可它跑不跑得动,全看上一步——验证器是这个 loop 的方向盘,方向盘不准,油门越踩越偏。

而我的方向盘有旷量。盲排这个信号,抖得吓人:同一句译文几乎没动,「排得过谷歌」上一轮 80%、下一轮 0%。一个开了思考的强模型,碰上「边缘情况 vs 边界情况」「使用工具 vs 调用工具」这种几乎等价的措辞,也排不稳。

第 1 轮  tool-definition  胜谷歌 80%  过
第 2 轮  tool-definition  胜谷歌  0%  挂   ← 译文几乎没改

于是 loop 被噪声拖着乱晃:通过数 3/4 跟 2/4 来回跳,看着像「改退步了」,其实只是两次采样在抖。盯着这数字调 prompt,等于在追噪声。

那怎么把噪声跟真信号分开?

三招:一条多评几次取中位 / 多数(GEMBA 那套路);把抖得最凶的「打平人工」从硬门槛降成只看不卡;别盯单轮的过没过,看维度分的趋势。真改进是看得见的——比如我把翻译温度从 1.0 压到 0.3,「乱加词」当场少一大半:之前它能把 "painkillers always win" 翻成「止痛药永远卖得更好」,凭空加个「卖」字;压完温这种就没了,忠实分实打实往上走。这种好,不靠盲排也分得出来。

什么时候停?评委再也分不出高下的时候。剩下那点分歧——「边缘」还是「边界」——评委排不稳,说实话我自己也讲不清谁更好。这就是撞到这套评测的分辨天花板了,译文已经够好。够好就收,接着在噪声上磨,只是烧 token。

验证器和 loop,是一对

这趟最想留下的就一句:验证器和 loop 是一对,缺谁都不成立。

没有可信验证器的 loop,就是 Yegge 说的那台老虎机——你以为在「迭代」,其实在拉杆:赢了不知道为啥赢,输了不知道为啥输。反过来,没有 loop 的验证器,就是一把挂墙上没人用的尺子,量一回,然后呢?

摆对了是这样:loop 是发动机,验证器是仪表盘。一个给你「再来一版」的劲,一个告诉你这版到底有没有更好。俩齿轮咬上了,迭代才是在爬坡,不是原地乱走。

所以 townhall 那句 "Don't trust, verify",还得往里再套一层:连你自己的验证器都别信。先拿已知答案——金标准,或者像 townhall 那样埋好的 bug——把验证器本身验一遍,确认它真分得出对错,再放它去当裁判。裁判能上场,但上场前也得先体检。

最后

AI 译匠 是个能用的小工具,代码不金贵。带得走的是那套路子,跟 townhall 一模一样,换个场景又走通一遍:看见一个判断组件(评委也好、验证器也好),先拿已知答案量它准不准,准了再让它去驱动 loop,跑到它分不出高下为止。

说句私货:我们在认真做的 leonclass.com,一个帮理科老师审题的 AI 助手,骨子里就是个验证器——判一道题自不自洽、有没有命中要考的能力。两个玩具,一个编排、一个翻译,反反复复教我同一件事:验证器的价值全在它可不可信,而让它可信的唯一办法,是给它也套一个 loop。

你要也在琢磨验证 / 教育 / agent,欢迎来聊。