没有不值得去解决的问题,也没有不值得去学习的技术!

A Tour of Go 翻译实验:更多原始上下文为什么没有更好?从 157 个保护标记到 30 次重复盲评

【图 3:5 个页面 Request SHA256 完全一致,但 Response SHA256 全部不同】

作者:

在

A Tour of Go 多语言翻译项目

图3:访问过去的 Go Tour 简体中文站 tour.go-zh.org 时,当前已经无法正常建立连接。

(1) 从「A Tour of Go 中文版」这个搜索词开始:我决定做一个持续维护的 Go Tour 中文版

本地运行的 A Tour of Go「Methods continued」课程页面,左侧为课程说明,右侧为 Go 代码编辑器及运行结果。

(2) A Tour of Go 中文版项目设计冻结:从 101 页到 103 页,从 Gin 转向 Cobra CLI

A Tour of Go 中文版开发实战:英文基线、在线运行与 101 页上游同步体系

(3) A Tour of Go 中文版开发实战:英文基线、在线运行与 101 页上游同步体系

go-tour-i18n 项目完成首个简体中文课程页面 welcome/1 的整页翻译、结构校验和本地预览。

(4) A Tour of Go 多语言翻译项目实录:完成首个 zh-CN 页面翻译闭环

图 1:DeepSeek 官方更新日志显示,本次只更新 DeepSeek-V4-Flash,DeepSeek-V4-Pro API 与 APP、Web 模型均未更新

(5) A Tour of Go 中文翻译项目进展:完成前 8 页、修复 present 语法,并暂缓 DeepSeek 对比

图 1:generics/1 简体中文页面本地预览

(6) 一个页面重试五次:使用 GLM-5.2 翻译 A Tour of Go 时遇到的 Token 与 Present 结构问题

图 1:methods/16 简体中文页面浏览器预览

(7) A Tour of Go 中文翻译实录:如何只翻译教学代码注释,而不破坏 Go 代码

图 2:A Tour of Go methods/20「练习:错误」中文候选页面最终渲染效果

(8) A Tour of Go 多语言翻译:当正确的中文语序被受保护标记顺序校验误判

图 3:methods/24 中文页面,静态代码、Bounds 行内代码和链接内的 image.Rectangle 均正确渲染

(9) A Tour of Go 中文翻译完成 7 个代表页校准:最后 3 页又发现了哪些真实问题

图 2:首批 10 个普通页面经过试跑与流程校准后全部进入 ready

(10) A Tour of Go 多语言翻译项目:首批 10 个普通页面试跑,从 2 个 blocked 到全部 ready

图 2:flowcontrol/6 最终中文页面,return 与 v 为适应自然中文语序发生整体换位

(11) A Tour of Go 中文翻译第二批实跑:从 Inline Code 顺序误判到历史响应重新验证

图 1:flowcontrol/6 首次原始输入实验直接通过统一自动校验

(12) A Tour of Go 多语言翻译项目:从 swap 问题重新审视 Token 保护,原始输入与最小保护的一次真实实验

图 7:moretypes/1 最终中文页面预览。左侧课程正文、静态代码块、行内代码和教学注释均正常渲染,右侧官方 Go 示例继续保持原样。

(13) A Tour of Go 多语言翻译实战:第三批 10 页全部 Ready,继续校准 Protected Token 的结构角色

图 4:上游源码确认共有 103 个课程页面,zh-CN 最终达到 ready=103、pending=0、blocked=0

(14) A Tour of Go 多语言翻译项目:zh-CN 103 个课程页面全部 ready,课程正文翻译阶段完成

图 4:GitHub 与 ChatGPT 已成功连接

(15) ChatGPT 连接 GitHub 实测:让 AI 直接读取 go-tour-i18n 仓库参与译文审核

图 3:中文 Go 术语校准完成后,将确定的译法写入 zh-CN glossary

(16) 为什么 channel 最终选择“通道”:A Tour of Go 中文术语统一的一次实践

图 1:技术含义基本正确,但“返回一个返回……”已经明显影响阅读,因此仍被列入 C 类修订

(17) 103 页逐页审核后,只返修 16 页:A Tour of Go 中文正文发布前质量审计

图 2:中文课程页面以及已经完成本地化的编辑器控制区

(18) A Tour of Go 多语言翻译项目:公共 UI 本地化完成,从课程译文走向完整中文界面

图 2:完整 zh-CN 正式投影成功生成,103 个课程页面被重新组装为 7 个 .article

(19) 从 103/103 ready 到完整站点验收:A Tour of Go 中文版补齐正式投影与课程元数据本地化

图 3:从 production bundle 独立启动的 A Tour of Go 简体中文页面,课程正文、公共 UI 和官方 Go 示例均已进入最终发布形态。

(20) A Tour of Go 多语言翻译项目:103 页全部完成后,我终于生成了可独立部署的 zh-CN Production Bundle

图 1:A Tour of Go 简体中文版正式生产页面,远程运行已经成功输出“Hello, 世界”。

(21) A Tour of Go 多语言翻译项目:zh-CN 正式上线,从生产发布到 go.dev Playground 的完整部署记录

图 1:新生产域名 go-dev.shuijingwanwq.com 已正常访问,Go 示例远程运行成功

(22) A Tour of Go 多语言翻译项目:从 go-tour 到 go-dev,完成 EdgeOne、Nginx 与 HTTPS 生产域名迁移

图 1:A Tour of Go 多语言翻译项目正式生产首页

(23) A Tour of Go 多语言翻译项目正式上线:从项目首页、公共 Footer 到生产发布元数据的完整收尾

图 3:GA4 g/collect 请求返回 HTTP 204,并携带当前课程页面地址,确认 Google Analytics 已产生真实事件上报

(24) A Tour of Go 多语言翻译项目:接入 Google Analytics 与百度统计,从 systemd 注入到 EdgeOne 与真实上报验证

图 1:生产环境 robots.txt 与 sitemap.xml 已正确对外提供,Sitemap 共包含 104 个规范 URL。

(25) A Tour of Go 中文站上线后:补齐 robots.txt、Sitemap,并完成五大搜索引擎提交

图 4:发布生产并刷新 EdgeOne 缓存后,再次通过真实手机访问,顶栏项目名称已经完整保持在一行,最终移动端验收通过。

(26) A Tour of Go 多语言翻译项目:修复手机端首页顶栏标题换行,并完成真机验证

图 3:生产自动部署脚本第一次真实运行时,systemd 已经显示 active,但首次 localhost 探测仍然得到 HTTP 000;随后连续 3 次同时满足 active + HTTP 200 后,脚本才判定部署成功,并继续完成公网 HTTP 200 验收。这次真实运行验证了连续应用层健康检查的必要性。

(27) A Tour of Go 多语言翻译项目:从一次 203/EXEC 故障到生产自动部署脚本落地

图 1:阿里云生产环境访问 go.dev Playground 时出现 TLS 握手超时

(28) A Tour of Go 多语言翻译项目:为 Playground 搭建独立的 ZgoCloud 执行代理

图 3:清除 /tour/script.js 缓存后,Run 已直接请求 ZgoCloud /compile 并返回 HTTP 200

(29) A Tour of Go 多语言翻译项目:将生产 Run / Format 切换到 ZgoCloud 执行节点

【图 1:微信中运行 Go 示例时出现 Error communicating with remote server.】

(30) A Tour of Go 中文版手机端运行与格式化偶发失败排查:从间歇性报错到补强 Nginx 可观测性

【图 4:向 golang-dev 公开邮件列表发送 Playground 使用告知邮件并投递成功】

(31) A Tour of Go 多语言项目:为 Playground 代理增加唯一 User-Agent,并主动告知 Go 官方

【图 3:百度剩余 9 个核心 URL 提交成功,remain 归零】

(32) A Tour of Go 搜索引擎收录实测:从 Google 自然索引到百度主动提交与 Bing IndexNow

【图 1:当前正式中文 methods/24 页面,右侧示例代码运行成功】

(33) A Tour of Go 中文翻译完成后,我为什么重新评估 minimal-protect 翻译模式

【图 3:5 个页面 Request SHA256 完全一致,但 Response SHA256 全部不同】

(34) A Tour of Go 翻译实验:更多原始上下文为什么没有更好?从 157 个保护标记到 30 次重复盲评

图 3:3 个代表页 × 4 个评审模型,共 12 次匿名评审的完整排名与第一名票数。

(35) A Tour of Go 翻译质量再评估:minimal-protect 未达预期后,我开始比较 ChatGPT、Codex 与 GLM-5.2

图 2:GitHub 中的 chatgpt-zh-CN-008 重译批次。一个 Batch 同时保存 inputs、raw-responses、candidates、validation 和 retry 记录,GitHub 成为 ChatGPT 与本地翻译流水线之间的数据交接层。

(36) 没有 OpenAI API,我如何用 ChatGPT + GitHub 完成 A Tour of Go 103 页全量重译

图 1:103 个正式课程页面完成最终语义质量审核,结果为 A=103、B/C/D=0,同时不存在缺失、重复或额外页面。A/B/C/D 是本轮项目内部语义质量分级,并不是自动结构 validator 的结果。

(37) 103 页翻完还不能发布:A Tour of Go ChatGPT 译文的语义审核与 Canonical Promotion

图 3:7 个 article endpoint 的 production origin 与 EdgeOne 公网响应全部 exact match,同时新的 ChatGPT 译文标记存在,旧版译文标记已经消失。

(38) 103/103 与 7/7 Exact Match:A Tour of Go ChatGPT 新译文的最终线上验收

【图 2:upstream source preview】

(39) A Tour of Go 多语言翻译项目首次实现 upstream 同步机制:从一次性翻译到长期维护

图 2:A/B/C/D 质量评级规则,展示正式质量 rubric 与 Promotion gate。

(40) A Tour of Go 多语言翻译项目引入 Translation Quality Review:从自动验证到 AI 翻译质量控制

图 4:翻译后 Playground Example,展示中文注释与保持不变的 Go 代码结构。

(41) A Tour of Go 多语言翻译项目实现 Playground Example 本地化:从代码注释翻译到完整学习体验

图 5:公网页面验证广告脚本输出

(42) A Tour of Go 多语言翻译项目接入广告系统:从 AdSense 专用配置到通用 HTML 注入架构

图 3:百度统计单页应用设置

(43) go-dev 单页网站接入统计与 Google AdSense Auto Ads 验证记录

图 1:GitHub 仓库中的多语言翻译项目结构

(44) A Tour of Go 多语言翻译项目:选择日语作为第二语言并启动翻译验证

图 5:模型身份描述不一致

(45) A Tour of Go 多语言翻译项目中的 AI 协作异常排查:一次长期工程会话失效分析

【图 1:ChatGPT GitHub 写入流程调整说明截图】

(46) go-tour-i18n 翻译流程调整:从 ChatGPT GitHub 写入到本地 artifact 导入

图 4 展示了本次异常状态。

(47) go-tour-i18n 翻译自动化流程复盘:已验证的 ChatGPT 翻译能力在新任务中的稳定性问题

【图 6:全部评审结束以后才读取 secret key,完成最终揭盲】

(48) A Tour of Go 翻译质量再评估:Codex High 已接近 ChatGPT High,我决定调整默认翻译引擎

图 4:ja-JP 生产课程页实际运行 Go 示例

(49) A Tour of Go 日语版正式上线:第二门语言 ja-JP 完成生产发布

图 1:ja-JP 上线以后,先提交“新增语言标准化流程”

(50) A Tour of Go 多语言扩展复盘:为第三门语言建立标准化流程

图 1:课程正文结束以后,页面左侧仍然存在大块视觉空白,但 AdSense 并没有在这里插入展示广告。

(51) A Tour of Go 明明有大片空白,为什么 AdSense 就是不显示展示广告?

图 2:golang/website 当前的 _content/tour/。课程内容、静态资源和模板都在这个上游目录中持续维护。

(52) 为了 AdSense,要不要放弃 SPA?A Tour of Go 页面架构的一次取舍

图 4:最终的手动课程广告真实展示在课程内容区域内,而不是 footer 之后。

(53) 保留 SPA 以后,广告应该放在哪里?从 AdSense 预览到方案 B

图 1:Google Search Console 中,多个不同的 A Tour of Go 课程 URL 被判断为“重复网页,用户未选定规范网页”。

(54) SPA 的 SEO 老问题:为什么最后还是给 103 个 A Tour of Go 课程页生成了 Prerender HTML

图 2:方案 B 生产环境中,源码已经正常,但课程主体高度异常缩短,footer 提前进入第一屏。

(55) 从源码空白到 AdSense 高度污染:A Tour of Go 方案 B 的生产收尾

图 1:A Tour of Go 德语版 de-DE 已正式运行在生产环境

(56) A Tour of Go de-DE 上线复盘:第三门语言用了约 16 小时,下一门如何压到 8 小时?

图 1:fr-FR 首次 production 验收完成后,我没有立即开始 ko-KR,而是先连续完成新增语言与首次生产流程的优化

(57) 法语版上线后,我没有马上开始韩语:A Tour of Go 新增语言流程的一轮完善与简化

图 1:根据 ko-KR 期间 76 次 Git 提交估算实际工作时间

(58) 原本预计 6 小时,最后用了约 16~18 小时:A Tour of Go 韩语版上线复盘

图 2:英文 source 与当时发生 validation failure 的 ko-KR candidate 对比

(59) Validator 报错,到底该改译文还是改规则?一次 A Tour of Go 韩语翻译实战

图 2:法语 A Tour of Go 仓库目前已经归档,页面仍保留 553 Commits 和 61 Contributors 的历史

(60) 从法语 553 次提交到韩语两代离线:A Tour of Go 社区翻译为什么难以长期维护

【图 4:es-ES 首次 Production 收口后连续完成的流程优化 commit】

(61) 从 es-ES 首次上线复盘:我把 A Tour of Go 新增语言的 Production 流程又收敛了一轮

图 1:旧公网验收链路连续出现 curl 28 超时,最终导致 public-machine 阶段失败

(62) A Tour of Go Production 公网验收踩坑:从跨境 SOCKS 链路改为 zgocloud direct

图 1:两次 Production Machine Acceptance 都已经通过,但 Headless Chrome 分别在 / 和 /tour/ 判定页面没有完成渲染

(63) 页面明明能打开,为什么 Headless Chrome 仍然判定 Production 失败?

图 3:Bing 从 Google Search Console 中识别到新的 it-IT 站点,并同时发现已有的 1 个 sitemap

(64) GSC → Bing Webmaster Tools:多语言站点如何减少重复验证

图 3:英文站 3 小时内出现 565 个 Cloudflare 来源 URL

(65) IndexNow 实战:手工提交长期不显示,Cloudflare Crawler Hints 却很快出现在 Bing Webmaster Tools

【图 1:A Tour of Go 项目首页目前的语言版本列表】

(66) 从 nl-NL 到 tr-TR:A Tour of Go 连续上线三门语言后,我又优化了哪些流程

【图 4:Go local 页面中已经出现 French、German、Korean、Simplified Chinese】

(67) 从邮件无人回复到进入 Go 官方 Go local:我的 4 个 A Tour of Go 翻译站终于被收录

图8:最终只保留一把启用的新 API Key

(68) 腾讯云 EdgeOne API 自动化:从 CAM 子用户到最小权限 API Key 的完整配置

【图 7:Production Release Batch 最终汇总】

(69) 从同步 Go 官方上游到一个命令发布 10 个语言站:A Tour of Go Production 流程的再次收敛

【图 3:Cloudflare Smart Tiered Cache 已启用】

(70) Cloudflare 缓存 HIT 很快,MISS 却不稳定:回源阿里云杭州的一次真实优化

【图 3:简体中文站 Support 页面】

(71) 广告之外,社区项目如何长期活下去?我给 A Tour of Go 多语言项目加了 Support

图5:评论成功发布

(72) 从 Go Weekly 到 Reddit、DEV 和 Go Forum:第一次系统推广 A Tour of Go 多语言项目

【图 4:RTL 桌面课程布局修复后的效果】

(73) 第一次把 A Tour of Go 做成 RTL:阿拉伯语版本上线,以及我踩过的几个坑

从一个一直没有想通的问题开始

最近一直在继续验证 A Tour of Go 多语言翻译项目中的结构保护策略。

目前正式翻译流程并不是直接把 .article 原文全部交给 GLM-5.2,而是会先保护一部分不应该被翻译或修改的结构,例如:

  • .play、.image 等 present directive;
  • 链接 target;
  • 行内代码的结构边界;
  • emphasis 标记;
  • 静态预格式化代码;
  • 一些必须固定保留的技术内容。

这些内容会被转换成 protected token,翻译完成后再恢复,并进入统一的 present 解析、结构比较和页面校验。

这种方案的结构可靠性已经比较成熟,但我一直有一个疑问:

如果模型看到的不是最完整的原始页面,那么这些 protected token 会不会破坏上下文,从而降低翻译质量?

这个疑问并不是凭空产生的。

在之前的 WordPress 中文到英文 AI 翻译实践中,我已经多次确认:同一个模型下,整篇文章一次性翻译通常明显优于把文章拆成一个个孤立段落翻译。

完整上下文可以帮助模型理解前后关系、术语、指代、文章主题和整体语气。

因此最初我的直觉也是:

既然更多完整上下文通常有利于翻译,那么 A Tour of Go 中减少 protected token,让模型看到更多原始内容,理论上至少不应该让质量变差。

但后面的实验结果并没有这么简单。

【图 1:Static Context 实验代码基线,包含 1e8bd12 feat: 增加静态代码上下文翻译实验 和 197b57d refactor: 完善最小保护策略与精确重试】
【图 1:Static Context 实验代码基线,包含 1e8bd12 feat: 增加静态代码上下文翻译实验 和 197b57d refactor: 完善最小保护策略与精确重试】

先从 Default 与 minimal-v1 开始

前面的实验中,我先设计了一个 minimal protection 模式。

最初只保护完整 .play directive,后续根据真实失败补充了 emphasis delimiter,并加入更精确的 retry。

最终形成了 minimal-v1。

在 7 个代表页面的一轮实验中:

Plaintext
Default:
首次通过 7/7
最终通过 7/7

minimal-v1:
首次通过 5/7
最终通过 7/7

随后还做了一次匿名翻译质量比较。

单次样本的结果是:

Plaintext
Default:4/7
minimal-v1:3/7

当时这个结果让我更加疑惑。

minimal-v1 明明向模型暴露了更多原始内容,为什么不仅没有表现出稳定质量优势,有些页面反而明显比 Default 差?

如果简单按照“上下文越完整,翻译越好”的经验,这并不太容易解释。

于是我决定暂时不继续改 protection policy,而是先把一个更基础的问题搞清楚:

Default 的 protected token,到底真正隐藏了什么?

157 个 protected token,到底遮住了多少自然语言?

我针对固定的 7 个代表页面重新做了一次 Default protection 信息损失审计。

结果是:

Plaintext
Pages: 7
Protected tokens: 157
Replaced source bytes: 1,206

A machine structure: 761 bytes
B code / technical content: 419 bytes
C fixed natural language: 26 bytes
D hidden translatable English: 0 bytes

Hidden translatable English items: 0
Hidden translatable English ratio: 0.00%
【图 2:Default protection 审计,157 个 protected token,但 hidden translatable English 为 0】
【图 2:Default protection 审计,157 个 protected token,但 hidden translatable English 为 0】

这个结果非常关键。

原来我之前把“原始字节完整性”和“自然语言上下文完整性”混在了一起。

例如:

Plaintext
`comparable`

Default 并不是把整个 comparable 隐藏掉。

实际上主要被替换的是两侧的反引号,而中间真正具有技术语义的:

Plaintext
comparable

仍然可以被模型看到。

类似地:

Plaintext
*Note:*

主要隐藏的是 emphasis delimiter,而 Note: 本身仍然存在于模型输入中。

链接:

Plaintext
[[/pkg/image/#Image][Package image]]

主要隐藏的是:

Plaintext
/pkg/image/#Image

而真正需要理解和翻译的:

Plaintext
Package image

仍然完整可见。

因此,Default 和 minimal-v1 实际上并不是:

Plaintext
完整上下文
VS
残缺上下文

更准确的区别是:

Plaintext
Default:
完整的页面级自然语言上下文
+ 较强的机器结构抽象

minimal-v1:
完整的页面级自然语言上下文
+ 较少的机器结构抽象
+ 更多原始代码和机器语法

这和 WordPress 的“整篇翻译 vs 分段翻译”其实是两个不同的问题。

WordPress 分段翻译会真正丢掉前后自然语言上下文。

而 A Tour of Go 的 Default protection 并没有把完整课程页面拆成多个孤立翻译单元。

真正可能损失语义的,是静态代码

虽然 7 个页面中没有任何可翻译英文自然语言被完全隐藏,但 Default 确实会隐藏一些完整静态代码。

例如 generics/1 中:

Go
func Index[T comparable](s []T, x T) int

以及 methods/24 中:

Go
package image

type Image interface {
    ColorModel() color.Model
    Bounds() Rectangle
    At(x, y int) color.Color
}

这些代码不需要翻译,但确实包含技术语义。

于是问题进一步收敛成:

如果 Default 的自然语言上下文本来就已经完整,那么仅仅让模型额外看到这些静态代码,是否会改善翻译?

为了验证这一点,我没有取消现有 static code protection,而是新增了一个只用于开发实验的:

Plaintext
--dev-static-context

这个模式仍然使用完全相同的 Default protected page。

区别只有一个:

在 user message 中额外加入一份只读 static code reference。

代码只用于帮助模型理解技术关系,不允许复制、修改或重新输出。

这样就能够尽量把实验变量压缩为:

Plaintext
模型是否能够看到 static code 的技术语义

但实验过程中又发现了一个更大的变量

第一轮 Static Context 实验还没来得及得出质量结论,就出现了一个更值得追查的问题。

我发现 generics/1 的普通 Default,在之前的一次 fresh 实验中能够首次通过 validator,而新一轮完全相同的 Default 请求,却出现了 protected token 重复。

于是我直接拿两轮已有实验的 request.json 和 response.json 做对比。

比较页面包括:

Plaintext
generics/1
flowcontrol/8
methods/20
concurrency/7
methods/24

结果非常一致:

Plaintext
REQUEST_IDENTICAL : true
RESPONSE_IDENTICAL: false

5 个页面全部如此。

最终结果:

Plaintext
identical request -> different assistant content = 5/5
【图 3:5 个页面 Request SHA256 完全一致,但 Response SHA256 全部不同】
【图 3:5 个页面 Request SHA256 完全一致,但 Response SHA256 全部不同】

这里比较的不只是 Prompt 大致相同。

实际确认了:

  • source 完全一致;
  • model 一致;
  • system message 字节一致;
  • user message 字节一致;
  • thinking 一致;
  • do_sample 一致;
  • max_tokens 一致;
  • 实际 API payload 一致。

但 5/5 页面得到的 assistant content 都不同。

而且差异不仅是措辞不同。

generics/1 的一轮 Default 可以通过 validator,另一轮完全相同的 Request 却复制了同一组 protected token:

Plaintext
protected token count = 21, want 19
token 5 occurrence count = 2, want 1
token 6 occurrence count = 2, want 1

这意味着运行间波动甚至能够影响:

Plaintext
validator pass
VS
validator fail

至于 GLM-5.2 服务端为什么会出现这种行为,仅凭当前项目保存的 artifacts 无法判断,我也没有继续猜测服务端路由、模型部署或计算层面的具体原因。

项目真正需要面对的事实只有一个:

相同 Request,在当前实际 API 调用中并没有表现出字节级可复现性。

之前的 4:3,不能再当成模式结论

这也直接改变了我对前面 Default 与 minimal-v1 匿名评审的理解。

原来的结果:

Plaintext
Default:4
minimal-v1:3

只能表示:

这一轮各自抽取一个 candidate 时,刚好得到这样的结果。

它不能证明:

Plaintext
Default 的翻译质量稳定高于 minimal-v1

也不能证明:

Plaintext
minimal-v1 没有质量价值

因为现在已经确认,同一个 Default 请求自己的多次独立运行,就足以产生明显不同的译文。

因此,如果每种模式每页只生成一次,就很容易把模型自身的运行波动误认为 protection policy 的效果。

这也是这轮实验中最重要的方法论修正之一。

把 Static Context 实验升级为 3 次独立重复

为了降低单次输出波动的影响,我没有继续做“一页一个 Default 对一个 Static Context”的实验。

而是固定 5 个页面:

Plaintext
generics/1
flowcontrol/8
methods/20
concurrency/7
methods/24

两种模式:

Plaintext
Default
Static Context

每页每种模式运行 3 次独立请求:

Plaintext
5 pages × 2 modes × 3 repeats
= 30 planned samples

R2 和 R3 还专门采用了交错执行:

同一个 page + repeat 的 Default 与 Static Context 尽量连续运行,同时随机决定哪种模式先执行。

网络失败、validator failure 都原样保留,不补跑,不重新选择“更好看的结果”。

最终结构结果为:

Plaintext
               Default     Static Context
generics/1      V / P / V   V / V / V
flowcontrol/8   P / P / P   P / P / P
methods/20      P / P / P   N / P / P
concurrency/7   P / P / N   V / P / N
methods/24      P / P / P   P / P / P

其中:

Plaintext
P = validator pass
V = API success, validator fail
N = network/API failure

总体结果:

Plaintext
Default:
planned          15
API success      14
network failure   1
validator pass   12
validator fail    2
usable/planned 12/15

Static Context:
planned          15
API success      13
network failure   2
validator pass    9
validator fail    4
usable/planned  9/15
【图 4:5 页 × 2 模式 × 3 次重复,共 30 个计划样本】
【图 4:5 页 × 2 模式 × 3 次重复,共 30 个计划样本】

这个样本量仍然不足以证明 Static Context 一定降低结构可靠性。

尤其存在网络失败,而且前面的可复现性实验已经确认相同请求自己的 validator 结果也可能发生变化。

但至少目前可以确认:

Static Context 没有表现出明显的结构可靠性优势。

接下来更重要的是看语言质量。

不再挑一个“最好结果”,而是把所有有效译文都拿来盲评

这一次我没有从每种模式里挑一份“代表译文”。

所有通过 validator 的 candidate 全部进入匿名质量材料。

最终进入盲评的页面是:

Plaintext
flowcontrol/8    6 个候选
methods/20       5 个候选
concurrency/7    3 个候选
methods/24       6 个候选

generics/1 只有一个有效 candidate,因此没有参与两种模式的语言质量比较。

所有候选在每个页面内部随机打乱,只显示:

Plaintext
CANDIDATE A
CANDIDATE B
CANDIDATE C
...

完全隐藏:

  • Default / Static Context;
  • R1 / R2 / R3;
  • attempt;
  • worktree;
  • token usage。

评审时先锁定完整排名,之后才打开单独保存的 mapping。

methods/24 展示出了非常明显的运行波动

methods/24 一共有 6 个有效候选。

其中 Candidate D 的表达是:

Plaintext
但我们将使用预定义的实现 `color.RGBA` 和 `color.RGBAModel`,
暂不深究这些接口。

这些接口和类型由 image/color 包定义。

Candidate C 则是:

Plaintext
但我们将使用预定义的实现 `color.RGBA` 和 `color.RGBAModel`
来忽略这一点。

这些接口和类型由 image/color 包指定。

在完全不知道身份的情况下,最终锁定的排名是:

Plaintext
D > B > A > F > E > C

D 排第一,C 排最后。

【图 5:methods/24 Candidate D 与 Candidate C 匿名质量比较】
【图 5:methods/24 Candidate D 与 Candidate C 匿名质量比较】

如果这时只看译文,很容易猜测:

也许 D 来自某种更好的 Prompt 或 Context 设计,而 C 来自另一种较差的策略。

但揭晓身份以后,结果完全不是这样。

Plaintext
D = Default R3
C = Default R1

也就是说:

Plaintext
Default R3 → 第 1 名
Default R1 → 第 6 名

两份译文来自同一个页面、同一种 Default 模式。

【图 6:methods/24 身份揭晓,第一名和最后一名都是 Default】
【图 6:methods/24 身份揭晓,第一名和最后一名都是 Default】

这张结果几乎浓缩了整轮实验最重要的发现:

同一种翻译策略的一次输出,并不能稳定代表这种策略的语言质量。

Static Context 有没有让译文更好?

揭晓全部匿名映射以后,几个页面的排名分布如下。

flowcontrol/8:

Plaintext
Default:1、4、5
Static Context:2、3、6

methods/20:

Plaintext
Default:1、3、4
Static Context:2、5

concurrency/7:

Plaintext
Default:2、3
Static Context:1

methods/24:

Plaintext
Default:1、3、6
Static Context:2、4、5

最明显的特征不是哪一组全面领先,而是:

两种模式大量交错。

没有出现类似:

Plaintext
Static Context:1、2、3
Default:4、5、6

这种明显整体上移。

例如 methods/24 中,Default 自己就同时占据:

Plaintext
第 1
第 3
第 6

Static Context 则是:

Plaintext
第 2
第 4
第 5

因此目前没有观察到:

额外暴露 static code 可以稳定提高 GLM-5.2 的中文翻译质量。

“更多上下文没有更好”其实是个错误的问题

走到这里以后,我觉得最初的问题本身需要重新描述。

一开始我问的是:

为什么给模型更完整的内容,翻译质量没有更高?

现在更准确的问题应该是:

额外提供的究竟是不是新的“有用语义上下文”?

Default protection 虽然用了 157 个 protected token,但 7 个代表页中:

Plaintext
hidden translatable English = 0

真正需要翻译的页面级自然语言上下文本来就完整存在。

minimal-v1 或 Static Context 新增的主要不是前后叙事、句子关系或页面主题,而是:

  • 更多机器语法;
  • link target;
  • directive;
  • static code;
  • 技术结构。

其中 static code 确实可能提供额外技术语义,所以又专门做了 Static Context 单变量实验。

但在目前的重复实验中,这种额外技术语义没有表现出稳定的翻译质量优势。

因此:

Plaintext
更多原始字节

不能简单等同于:

Plaintext
更多有助于自然语言翻译的上下文

这和 WordPress 整篇翻译优于分段翻译并不矛盾。

WordPress 分段会真正丢失自然语言上下文。

而这里两种模式从一开始就都在翻译一个完整的 present.Section。

当前工程决策

经过这一轮实验,我暂时不会继续为了减少 protection 而修改正式翻译流程。

当前正式方案继续使用:

Plaintext
Default protected-token

原因并不是实验已经证明:

Plaintext
Default 翻译质量更高

目前没有这样的证据。

更准确的理由是:

  1. Default 已经具有成熟的结构保护和恢复能力;
  2. 它没有隐藏这 7 个代表页中的可翻译自然语言;
  3. minimal-v1 没有显示稳定的语言质量优势;
  4. 单独补回 static code 也没有显示稳定质量优势;
  5. GLM-5.2 自身的运行间质量波动明显,单次输出不足以评价 protection policy;
  6. 在没有明确质量收益的情况下,没有必要为了“原始内容看起来更完整”而削弱已经验证过的结构保护。

minimal-v1 和:

Plaintext
--dev-static-context

则继续保留为开发实验能力。

它们并不是无用的分支。

恰恰是这些实验模式帮助我确认了:

protected token 到底遮挡了什么,以及哪些原先看起来像 protection policy 导致的质量差异,其实可能只是模型自身的运行间波动。

最后的一个重要变化:以后不能再用“一次翻译”评价翻译策略

这轮实验对项目后续测试方法的影响,可能比 Static Context 本身还大。

以后如果需要比较两个 Prompt、两个 protection policy 或两个翻译工作流,我不会再简单采用:

Plaintext
每页每模式调用一次
→ 两份译文 A/B
→ 看谁更好

因为现在已经实际验证:

Plaintext
相同 Request
→ 5/5 页面 Response 不同

甚至同一个 Default,在 methods/24 中可以分别产生盲评第一名和最后一名。

更可靠的方式应该是:

Plaintext
固定页面
×
固定模式
×
多次独立运行
→
分别统计结构可靠性
→
所有 validator-passed candidate 全量匿名评审
→
最后再揭晓模式

这种方法成本更高,但至少不会轻易把一次偶然生成结果误认为架构本身的优势。

这也算是这次 A Tour of Go 多语言翻译实验中,一个比“到底要不要少保护几个 token”更重要的收获。

A Tour of Go 中文翻译完成后,我为什么重新评估 minimal-protect 翻译模式 A Tour of Go 翻译质量再评估:minimal-protect 未达预期后,我开始比较 ChatGPT、Codex 与 GLM-5.2

A Tour of Go 多语言翻译项目

本系列完整记录 A Tour of Go 多语言翻译项目从架构设计、整页翻译、结构保护、自动校验,到生产发布与后续维护的实际开发过程。

项目入口:
✅ Brazilian Portuguese — Português (Brasil)
✅ Dutch — Nederlands
✅ French — Français
✅ German — Deutsch
✅ Italian — Italiano
✅ Japanese — 日本語
✅ Korean — 한국어
✅ Simplified Chinese — 简体中文
✅ Spanish — Español
✅ Turkish — Türkçe
✅ 项目源码:GitHub:shuijingwan/go-tour-i18n

项目正在持续扩展更多语言版本,并长期维护翻译质量、生产发布与后续更新。项目属于非官方社区多语言翻译项目,与 Go 官方无隶属或授权关系。