AI 批量翻译内容站:真正跑得通的管道

2026 年用 AI 批量翻译已有 MDX 内容站:分批调用 Claude/GPT、用打五折的 Batch API 控成本、术语锁定、MDX 安全校验,以及能挡掉那 5%、避免被 Google 判定机翻的 QA 环节。

手翻 500 篇文章是好几个月的活。用前沿模型加一段 50 行的脚本,一个长周末就能搞定——前提是把它当成批处理数据任务,而不是复制粘贴。下面是我翻译本站(每种语言 1209 篇)从英文到中文用的完整管道,包含术语锁定、frontmatter 规则、MDX 校验,以及那个能避免 Google 把整套译文判定为机器生成的 QA 环节。

一句话结论

  • 每次 LLM 调用翻 5-10 篇,system prompt 锁住术语、禁止意译。H2 数量和代码块数量必须和源文一致。
  • frontmatter 按字段透传:只翻 titledescriptionurlSlugtranslationKey 与源文保持一致,双语导航才能配对姊妹文章。
  • Anthropic 的 Batch API 拿到输入输出统一打五折(24 小时内返回)。100 篇典型文章,Sonnet 4.6 批处理大约 3-6 美元,Opus 4.7 略贵。
  • 每个文件保存前过一遍结构校验(标题、代码围栏、链接数一致)和花括号审计——散落的 {var} 会把整个 MDX 构建弄崩。
  • 发布前一定要人工编辑。截至 2026 年 6 月,Google 的质量系统能高准确率识别未经编辑的机翻,而且会压制你所有语言版本的排名,不只是译文页。抽查 10%;流量最高的 5% 找母语人士复核。

为什么瓶颈是管道正确性,不是语言质量

前沿模型(Claude Opus 4.7、Sonnet 4.6、GPT-5.5、Gemini 3.1 Pro)翻译技术散文已经够好,流畅度不再是限制因素。截至 2026 年 6 月,Opus 4.7、Sonnet 4.6 和 Gemini 3.1 Pro 都是 1M token 的上下文窗口,你甚至能把术语表加好几篇完整文章塞进一次调用而不被截断。真正会出问题的是机械层面:

  1. MDX 语法被破坏——译文里一个散落的 {< 就能让整站构建失败。
  2. frontmatter 字段被翻了,而本该原样透传。
  3. 术语跨文件漂移(同一个产品名出现三种写法)。
  4. 链接指向错误的语言版本,或者 URL slug 被翻译了。
  5. 模型在意译而不是翻译,悄悄改了原意。

解决这五个,输出就能发布,人工只需 5-10% 的复核。交互式做法(粘进 ChatGPT、复制输出、保存)翻 10 篇可以;到 500 篇就要脚本,到 2000 篇脚本还得加缓存、重试、断点续跑。一开始就当批处理任务做——前期多花 2-3 小时写脚本,后面省好几天。

什么时候该上这套管道

  • 单语已经有 50+ 篇,想出第二种语言版本。
  • 用 Google Translate 或 DeepL 翻 MDX,把花括号、frontmatter 或链接弄坏过。
  • 有一份术语表(产品名、行话)必须一致翻译。
  • 希望译版作为真实内容被收录,而不是被判定为稀薄拷贝。

成本是多少(2026 年 6 月)

便宜的是模型,贵的是你的复核时间。一篇 1500 字左右的文章,大约 2500 个输入 token;因为中文输出会稍微变长,约 3000 个输出 token。把这些数字过一遍 Batch API(输入输出统一打五折,24 小时内返回结果),翻完整套语料比请一个自由译者一天的费用还便宜。

模型标准价($/1M 入/出)Batch 价(五折)100 篇约需成本(批处理)
Sonnet 4.6$3 / $15$1.50 / $7.50约 $3-4
Opus 4.7$5 / $25$2.50 / $12.50约 $5-7
GPT-5.5$5 / $30(OpenAI 也有批处理,同样约五折)约 $5-8

批处理和实时输出质量完全一样,你只是用延迟换价格。批处理折扣还能和 prompt 缓存叠加(把那段又长又固定的术语表加 system prompt 缓存一次,就不必每个文件都重复为这些输入 token 付费)。一次性翻整套语料,Sonnet 4.6 跑 Batch API 性价比最高;把 Opus 4.7 留给流量最高、那点边际流畅度值得花的页面。API 写法见 Anthropic 批处理文档

管道结构

  1. 建术语表:30-100 条源语和目标语对应,附语气说明。比如:"prompt" -> "prompt"(保留英文),"workflow" -> "工作流""shipping" -> "上线"(不是「运输」)。
  2. 写 system prompt:含术语表、「代码块不翻」、「URL 不翻」、「frontmatter 除 title 和 description 之外不翻」、「publishedAt 日期照搬」、「MDX 组件和花括号一字不改」。
  3. 分批处理。每批 5-10 篇一次 LLM 调用。源 MDX 入,译版 MDX 出。维护一份 done.txt 名单,中断能续跑。
  4. 结构验证:## 标题数一致、代码块数一致、[](url) 链接数一致。任何不匹配都进人工队列。
  5. 跑一遍花括号审计。MDX 一遇到 {var} 就炸。源和译版都要清理或转义。
  6. 抽 10% 人工复核:在目标语言里完整通读。术语漂移记到术语表,重跑受影响的文件。

frontmatter 规则

  • titledescription:翻。
  • urlSlug:和源一致——translationKey 匹配要靠它。
  • categorysubcategorytags:和源一致——这些是分面,不是用户可见字符串。
  • publishedAtauthorfeatureddraft:和源一致。
  • lang:改成目标语言代码。
  • translationKey:等于 urlSlug。EN 和 ZH 同一篇靠这个连。

最小可跑的批处理脚本

可直接起步的 Node + Anthropic SDK 版本——读 5-10 个文件、调一次、写回、记进度:

// scripts/translate-batch.mjs
import fs from 'node:fs/promises';
import path from 'node:path';
import Anthropic from '@anthropic-ai/sdk';

const client = new Anthropic();
const GLOSSARY = await fs.readFile('glossary.md', 'utf8');
const SYSTEM = `把 EN MDX 文章翻译成 ZH。
规则:
- 代码块和行内代码('x\`)原样保留,不要翻译。
- frontmatter 只翻译 title 和 description;urlSlug、tags、category、publishedAt、author
  全部原样保留。lang 改为 "zh"。translationKey = urlSlug。
- text 形式的链接只把 /en/ 改成 /zh/,slug 保留。
- 不许意译。H2 数量和顺序必须完全一致。
${GLOSSARY}`;

async function translateFile(src) {
  const body = await fs.readFile(src, 'utf8');
  const res = await client.messages.create({
    model: 'claude-opus-4-7',
    max_tokens: 8000,
    system: SYSTEM,
    messages: [{ role: 'user', content: body }],
  });
  return res.content[0].text;
}

const done = new Set((await fs.readFile('done.txt', 'utf8').catch(() => '')).split('\n'));
const files = (await fs.readdir('src/content/articles/en')).filter((f) => !done.has(f));

for (const f of files.slice(0, 10)) {  // 每跑一次处理 10 个
  const out = await translateFile(path.join('src/content/articles/en', f));
  await fs.writeFile(path.join('src/content/articles/zh', f), out);
  await fs.appendFile('done.txt', f + '\n');
  console.log('translated:', f);
}

反复执行 node scripts/translate-batch.mjs 直到 done.txt 覆盖完所有文件。中断也无所谓,done.txt 就是断点续跑的依据。一次性批量翻译时,把 messages.create 换成 Batch API(client.messages.batches.create)就能把 token 账单砍半——一次性提交所有任务,24 小时内轮询取结果。

术语一致性

  • 术语表锁住产品名和专有名词。这些字段的”翻译”多半就是”保留原文”。
  • 锁 20-50 个领域术语。面向开发者,commit / deploy / build 在中文里通常保留英文。面向一般读者,翻成标准对应词。
  • 跑一次后处理:在译版语料里 grep 每个术语。如果 95% 用一种译法、5% 用另一种,批量替换。
  • 语气词(简练、口语、专业),system prompt 里放 2-3 句目标语气样本。
  • 术语表放进版本控制(glossary.jsonglossary.csv)。改某条术语时,在源语料 grep 旧译法就能精确定位哪些文章要重翻。

断点续跑和重试

  • 每翻一篇成功就记到 done.txt,加源文件哈希。源变了哈希就变了,这个文件回到队列。
  • 速率限制按指数退避重试。2026 年前沿模型的速率限制不算紧,但 2000 篇照样会撞。
  • LLM 响应按源文件哈希缓存 30 天。脚本中途挂掉,重启只跑没缓存的文件。
  • 每个输出保存前过结构校验。不合规先升温重试一次,再不行隔离到人工复核。

真能挡问题的 QA

这一步不是可选项,也不只为读者体验。截至 2026 年 6 月,Google Search 文档明确建议避免左右并排的对照翻译,并称其质量系统能高准确率识别未经编辑的机翻——未编辑的批量直出可能压制你所有语言版本的排名,不只是新页面。AdSense 审核用的是同一条「原创、非自动生成」的标准。一遍轻量人工编辑,就是可被收录的第二语言站和稀薄拷贝之间的分水岭。

  • 随机抽 10% 通读。在目标语言里整篇看自然度,不只对准确性。
  • 定点检查:每个代码块和源一致、每条链接的 URL 一字不差、每个 frontmatter 字段值对。
  • 流量最高的 5% 找母语人士复核。这部分眼球多、排名权重也最大;例子和货币/地区细节要本地化,别直译。
  • 确认 hreflang 是对称且自引用的,用合法的 ISO 代码(enzh)。多数国际 hreflang 故障都出在标注不互相对应。
  • 比较翻译发布前后的页面指标。译版的停留时间如果低于源版的 60%,多半是语言读着生硬。

容易踩的坑

  • 一篇一篇交互式翻译。成本和时间爆炸,一致性还差。
  • 让模型翻 Markdown 链接里的 URL。URL 永远透传。
  • 漏掉 translationKey。没它,双语导航连不到姊妹文章。
  • 跳过结构验证。模型可能把两个标题悄悄合成一个——读者一时看不出,搜索引擎能看出。
  • 不做任何人工复核就发布。1000 篇里 0.5% 意译误差就是 5 篇说错话。
  • 改一条术语就重翻全站。用定向重翻脚本只跑受影响的文件。

常见问答

  • EN 到 ZH 技术内容用哪个模型?: 截至 2026 年 6 月,批量活儿用 Claude Sonnet 4.6 性价比最佳;最讲究的散文 Opus 4.7 略胜一筹,GPT-5.5 和 Gemini 3.1 Pro 也都是不错的替代。Claude 倾向于在读着自然的地方保留英文术语;GPT 翻得更积极。开跑整套之前先在你自己领域的 5 篇上对比。
  • 大概多少钱?: 走 Batch API(五折),100 篇典型文章 Sonnet 4.6 约 3-7 美元,Opus 4.7 略贵。就算按实时全价,100 篇也远低于 20 美元。比任何人工译者都便宜,而且成本大头是你的复核工时,不是 token。
  • 每篇都要复核吗?: 不用——抽查 10%,再对流量最高的 5% 做一遍母语人士复核。抽样错误率超 5% 就整批重提 prompt 重翻;低于 5% 就地修。完全跳过复核,是唯一会让译版站被判定机器生成的做法。
  • 要不要用 memoQ 这类 CAT 工具?: 不用。LLM 把 CAT 该干的活和翻译一起干了。一个目录加 done.txt 日志就够。
  • RTL 语言或模型不太会的小语种怎么办?: 先做模型测试。RTL(阿语、希伯来)确认代码块和数字没被镜像。低资源语言准备额外请人复核。
  • 译版要一次性发布还是分批发?: 分批。先发 50 篇,盯一周 Search Console 的收录和 CTR,再发下 200 篇。新页面骤增可能触发抓取限速和质量审查。
  • 源文章变了怎么同步已有翻译?: diff 源文件,把 diff 加现有翻译一起发给模型,让它最小幅度只翻改动那部分。这样保留人工编辑的同时同步新内容。
  • 译版站和源站共用 sitemap 还是分开?: 一份 sitemap 就够,canonical 和 hreflang 标签会扛重活。按语言拆 sitemap 利于排查,但不改变收录。
  • 地区相关内容(货币、本地例子)怎么处理?: 源里用模型能看懂的注释标记。system prompt 里加一句”标记部分按目标地区惯例改写而不是直译”。

相关

标签: #独立开发 #ai-assisted #building #translation