LLM 翻译调试实战:从 Prompt 到模型微调
用 GPT-4o、Claude、DeepSeek、Qwen 跑字幕翻译的真实调试笔记,覆盖 prompt 工程、术语库注入、 hallucination 控制、模型微调与效果评估。
LLM 翻译调试实战:从 Prompt 到模型微调
用 LLM 做字幕翻译是这两年字幕组工作流的最大变化。我跑了近一年,把所有踩过的坑、调试经验、效果对比整理成这篇笔记。
为什么用 LLM 做字幕翻译
传统机器翻译(Google Translate、DeepL)有几个硬伤:
- 不懂上下文:每句话独立翻译,前后不连贯
- 术语不统一:同一个词在不同句子里翻译成不同中文
- 文化词处理生硬:直接照搬或直译,丢失文化语境
- 风格单一:所有内容都是同一种语气
LLM 的优势在于能"读完整个上下文"再翻译,理论上能解决上述问题。但 LLM 也有自己的坑:hallucination(编造内容)、改写原意、风格漂移。所以 LLM 翻译的核心是控制而非自由。
模型横评
我用同一段 30 分钟日剧字幕(约 400 条)测过几个主流模型:
| 模型 | BLEU | 错译率 | 漏译率 | 风格分 | 成本/千条 |
|---|---|---|---|---|---|
| GPT-4o | 38.2 | 4.1% | 1.2% | 8.5/10 | $0.30 |
| GPT-4o-mini | 32.5 | 7.8% | 2.1% | 7.0/10 | $0.02 |
| Claude 3.5 Sonnet | 39.1 | 3.8% | 1.5% | 8.7/10 | $0.40 |
| Claude 3.5 Haiku | 34.2 | 6.5% | 1.8% | 7.5/10 | $0.04 |
| DeepSeek-V3 | 36.8 | 5.2% | 1.6% | 8.2/10 | $0.05 |
| Qwen2.5-72B | 35.5 | 6.1% | 2.3% | 7.8/10 | $0.06(自部署) |
| DeepL | 31.0 | 8.5% | 3.2% | 6.5/10 | $0.20 |
几个观察:
- Claude 3.5 Sonnet 在质量上略胜 GPT-4o,但成本高一倍
- GPT-4o-mini 性价比最高,是日常字幕翻译的甜点位
- DeepSeek-V3 是国产之光,成本极低,质量接近 GPT-4o
- DeepL 已经被 LLM 全面碾压,唯一优势是稳定性(不会编造)
Prompt 工程
LLM 翻译质量 70% 取决于 prompt。我迭代了 20 多个版本,目前稳定用这个:
你是一名专业的字幕翻译员。下面是一段视频的字幕原文,请翻译成中文。
要求:
1. 保留原文意思,不增删内容,不改写句子结构
2. 每条字幕单独翻译,单条不超过 18 个中文字符
3. 保留语气词、感叹号、问号等情绪标记
4. 专有名词按术语表翻译(见下方)
5. 文化负载词保留原文,括号注释
6. 输出格式:每行一条译文,序号与原文对应
术语表:
- 先輩 → 前辈
- 後輩 → 后辈
- 先生 → 老师
- さん → 不译
- 様 → 大人
原文:
1. こんにちは、田中先輩。
2. 今日はいい天気ですね。
3. また明日お会いしましょう。
几个关键设计:
- "不增删内容"防止 LLM 发挥创作欲
- "单条不超过 18 字符"约束字幕长度
- "保留语气词"防止风格书面化
- "术语表"统一翻译一致性
- "输出格式"约束输出结构
这套 prompt 把 GPT-4o-mini 的 BLEU 从 28 提到 32,错译率从 12% 降到 7.8%。
Hallucination 控制
LLM 偶尔会编造内容,比如把"今日はいい天気ですね"翻译成"今天天气真好,适合出去玩",多出了原文没有的"适合出去玩"。这是 LLM 翻译最致命的问题。
控制方法:
- Prompt 严格约束:明确写"不增删内容",发现违反时整个 batch 重跑
- 长度校验:译文长度如果超过原文 1.5 倍,标记可疑
- 置信度检查:让 LLM 同时输出 confidence score,低于 0.7 的标记人工复核
- 双模型对照:同时跑 GPT-4o-mini 和 DeepSeek-V3,译文差异大于 30% 的标记
实测这套机制能把 hallucination 率从 3% 降到 0.4%。
术语库注入
字幕组内部维护的术语表通常有几百条,全塞进 prompt 会超 token 限制。我的做法是动态注入:
def build_prompt(subtitles, terminology):
# 从字幕里提取所有专有名词
proper_nouns = extract_proper_nouns(subtitles)
# 只注入相关的术语
relevant_terms = {
noun: terminology.get(noun, "")
for noun in proper_nouns
if noun in terminology
}
# 构造 prompt
return f"""...
术语表:
{format_terms(relevant_terms)}
..."""
提取专有名词用 spaCy 的 NER 模型,准确率 90% 以上。这样 prompt 里只放十几个相关术语,token 消耗可控,准确率反而更高。
模型微调
通用 LLM 在特定题材上会有偏差。日漫翻译里大量出现的"古风台词""中二台词"通用 LLM 翻译得很别扭。这种情况下需要微调。
我做过一个 Qwen2.5-7B 的微调,用 5000 条人工翻译的日漫字幕做训练集,LoRA 微调,4 张 4090 跑 8 小时。效果:
- 古风台词风格更地道("吾之剑"比"我的剑"更对味)
- 中二台词保留了夸张感
- 成本从 $0.06/千条降到几乎为零(自部署)
但微调也有代价:
- 数据准备耗时,5000 条人工校对花了 3 周
- 题材迁移性差,日漫微调的模型用在纪录片上反而退步
- 维护成本高,每出新番都要重新评估
通用场景用 GPT-4o-mini,垂直场景用微调模型,这是目前的折中方案。
效果评估
LLM 翻译效果评估有两个维度:
- 客观指标:BLEU、chrF、TER
- 主观指标:母语者评分(5 分制)
客观指标用 sacrebleu 跑:
sacrebleu reference.txt -i hypothesis.txt -m bleu chrf ter
主观指标找 5 个母语者盲测打分,去掉最高最低分取平均。
实测发现客观指标和主观指标相关性不强。BLEU 高的译文不一定读着舒服,BLEU 低的反而可能更地道。所以评估时两个指标都要看,最终以主观指标为准。
实战工作流
我现在的完整工作流:
- yt-dlp 下载素材和原文自动字幕
- VideoCaptioner 跑 Whisper 转录(如果自动字幕质量差)
- Python 脚本批量调用 GPT-4o-mini 翻译
- 用 Aegisub 人工校对译文中可疑标记
- 导出 ASS 交付
一个 24 分钟日漫,自动翻译 + 人工校对大约 30 分钟。纯人工翻译需要 2 小时。效率提升 4 倍,质量持平或略优。
翻译理论札记
写到这里想插入一段翻译理论的思考。奈达的功能对等强调译文读者读到译文时的反应,应当与原文读者读到原文时的反应基本一致,这意味着翻译不是字面替换,而是要在目标语里重新构造等值效果。我们做字幕,观众在屏幕前只有几秒钟读完一行字,反应时间被严重压缩,所以功能对等在字幕里被推到了极端——可读性优先于忠实度。
纽马克的区分更实用:交际翻译关注译文效果,语义翻译关注原文意义。字幕绝大多数时候走交际翻译路线,但遇到关键术语、专有名词、文化负载词时又要切回语义翻译,避免观众被误导。这两条路线在字幕里不停切换,做久了会形成直觉。
韦努蒂的归化异化是另一条轴线。归化是让译文流畅得像目标语原创,异化是保留原文的陌生感。日漫字幕里大量保留"前辈""学园""王道"等词就是异化,因为这些词在中文语境里已经形成了稳定的亚文化共识,强行归化反而失味。但纪录片、欧美剧的台词又需要强归化,否则观众跳戏。题材决定策略,没有一招通吃的方案。
—— 这些理论看起来抽象,但实际做字幕时每天都在用,只是未必意识到。把直觉变成方法论,是新人到熟手的分水岭。