更新于

用 AI API 做高质量翻译的工程化流程


AI 翻译比传统机翻准确度高一个量级,但要做到”上线级别”还有不少工程化工作。本文给一份完整流程,覆盖模型选择、术语表、上下文、回译验证、批量处理。

一、模型选择

任务推荐
通用中英翻译Claude Sonnet 4.6
高质量营销文案翻译Claude Opus 4.7
技术文档翻译Claude Sonnet 4.6 / GPT-5
批量低成本Gemini Flash 或 GPT-5 mini
小语种Claude 系列(多语言强)
视频字幕Claude Haiku + 后处理

Claude 系列在中英翻译上特别强——文风自然、术语准确。

二、最小翻译 prompt

from openai import OpenAI

client = OpenAI(api_key="sk-yo-...", base_url="https://yotradeapi.com/v1")

def translate(text, source="en", target="zh"):
    resp = client.chat.completions.create(
        model="claude-sonnet-4-6",
        messages=[
            {"role": "system", "content": f"你是专业翻译。把 {source} 翻译成 {target}。保持原意,自然流畅,不解释。"},
            {"role": "user", "content": text},
        ],
        temperature=0.3,
    )
    return resp.choices[0].message.content

简单但够 80% 场景用。

三、加术语表

def translate_with_glossary(text, glossary):
    glossary_str = "\n".join(f"- {k}{v}" for k, v in glossary.items())
    resp = client.chat.completions.create(
        model="claude-sonnet-4-6",
        messages=[
            {
                "role": "system",
                "content": f"""你是专业翻译。把英文翻译成中文。

# 术语表(必须严格使用以下译法)
{glossary_str}

# 要求
- 自然流畅
- 不解释、不加注释
- 保留 markdown 格式(代码块、链接、列表)
""",
            },
            {"role": "user", "content": text},
        ],
        temperature=0.3,
    )
    return resp.choices[0].message.content

glossary = {
    "prompt caching": "提示词缓存",
    "context window": "上下文窗口",
    "agent": "代理",
    "embedding": "向量嵌入",
}

术语表是把”AI 翻译”提升到”专业翻译”的最关键一步。通用模型不会自动用你公司的标准译法

四、保持上下文(长文档分段)

长文档拆段翻译时,每段独立调用会导致:

  • 同一术语前后不一致
  • 代词指代丢失
  • 语境断裂

解决:滑动窗口

def translate_long(paragraphs, glossary, window=2):
    results = []
    for i, p in enumerate(paragraphs):
        # 前 window 个段落的原文 + 译文作为上下文
        ctx = []
        for j in range(max(0, i - window), i):
            ctx.append(f"原文:{paragraphs[j]}\n译文:{results[j]}")
        ctx_str = "\n\n".join(ctx)

        prompt = f"""# 上文(原文 + 已有译文)
{ctx_str}

# 现在翻译这段
{p}
"""
        results.append(translate_with_glossary(prompt, glossary))
    return results

五、回译验证

简单粗暴但有效的质量检查:

def back_translate_check(source_en, translation_zh):
    back = translate(translation_zh, source="zh", target="en")
    # 用 embedding 算相似度
    e1 = embed(source_en)
    e2 = embed(back)
    return cosine_sim(e1, e2)

阈值经验:

  • 0.92:质量优

  • 0.85–0.92:可用
  • < 0.85:可能漂移,需要人工审

六、批量并发

100 段并发:

import asyncio
from openai import AsyncOpenAI

aclient = AsyncOpenAI(api_key="sk-yo-...", base_url="https://yotradeapi.com/v1")

async def translate_async(text, glossary):
    glossary_str = "\n".join(f"- {k}{v}" for k, v in glossary.items())
    resp = await aclient.chat.completions.create(
        model="claude-haiku-4-5",
        messages=[
            {"role": "system", "content": f"翻译。术语:{glossary_str}"},
            {"role": "user", "content": text},
        ],
    )
    return resp.choices[0].message.content

async def batch(texts, glossary, concurrency=10):
    sem = asyncio.Semaphore(concurrency)
    async def one(t):
        async with sem:
            return await translate_async(t, glossary)
    return await asyncio.gather(*[one(t) for t in texts])

results = asyncio.run(batch(texts, glossary, concurrency=10))

详见 Python 异步并发调用 LLM API

七、保留 Markdown / HTML 格式

需要明确写在 system prompt:

保留:
- 代码块 ``` 内的内容不要翻译
- HTML 标签(<a> <strong> 等)保持
- markdown 链接 [text](url) 的 url 不动,text 翻译
- 内联 `code` 不要翻译
- frontmatter(--- 之间)按字段处理:title/description 翻译,slug/date 不动

八、专业领域微调 prompt

针对不同领域:

技术文档

你是技术文档翻译。
- 代码示例不动
- 术语使用业界标准译法
- 命令、参数、文件路径保留原文
- 风格简洁,不啰嗦

营销文案

你是营销文案翻译。
- 不直译,要意译
- 保持品牌调性
- 文化适配(节日、习语本地化)
- 输出 3 个版本供选择

法律文档

你是法律翻译。
- 严格忠实原文,不增删
- 法律术语用标准译法
- 不修改条款结构
- 不确定的地方明确标记 [?]

九、字幕翻译特例

字幕需要保留时间戳:

1
00:00:01,000 --> 00:00:03,000
Hello, welcome to our channel.

2
00:00:04,000 --> 00:00:07,000
Today we're talking about...

只翻译文本行:

import re

def translate_srt(srt_text, glossary):
    blocks = srt_text.strip().split("\n\n")
    out = []
    for block in blocks:
        lines = block.split("\n")
        if len(lines) >= 3:
            idx, ts = lines[0], lines[1]
            text = "\n".join(lines[2:])
            translated = translate_with_glossary(text, glossary)
            out.append(f"{idx}\n{ts}\n{translated}")
    return "\n\n".join(out)

十、成本估算

任务模型文档大小估算成本
1 万字技术文章Sonnet 4.68k tokens$0.20
1 万字技术文章Haiku 4.58k tokens$0.05
1 万字营销文案Opus 4.78k tokens$1.00
1 本书(10 万字)Sonnet 4.680k tokens$2.00
100 集字幕Haiku 4.550k tokens$0.30

加上 caching 还能再降 60%。

十一、与 DeepL / Google Translate 的对比

维度LLM 翻译DeepLGoogle Translate
文风
术语遵循优(可注入术语表)
上下文
速度极快
价格
适合高质量、专业通用速查

十二、相关阅读

需要批量翻译稳定的中转 + 同 Key 调多家模型?YoTradeApi 一把 Key 调 Claude / GPT / Gemini 全家,按场景切。