跳转到主要内容

进化/搜索型翻译

核心思想: 生成多个候选翻译,用适应度函数(chrF++、FST 接受率、往返一致性)对其评分,对表现最好的候选进行变异,然后重复。自然选择应用于翻译——适应度最高的存活下来。

:::info 这是一本食谱,不是完成的实现 这是食谱系列中最具实验性的方法。它还未在大规模机器翻译中得到验证,但架构是健全的,评分工具可以愉快地对其产生的任何结果进行评分。 :::

何时使用

  • 你有一个良好的评分函数,但没有单个模型能产生一致的结果
  • 你想更广泛地探索解空间,而不仅仅是单个贪心生成
  • 你有计算预算用于许多并行生成(每个输入数十个候选)
  • 你对新颖研究感兴趣——这种方法在低资源机器翻译中尚未充分探索

工作原理

[Generation 0] Generate N candidates (different models, temperatures, prompts)


[Score] Evaluate each candidate: chrF++, FST acceptance, fluency


[Select] Keep top K performers


[Mutate] Prompt an LLM: "improve this translation, fix these issues"


[Generation 1] Score again. Repeat for G generations.


[Output] Best-scoring candidate from final generation

框架

async def evolutionary_translate(source, reference=None, generations=3, pop_size=8):
# Generation 0: diverse candidates
population = []
for model in ["gemini-2.5-pro", "gpt-4o", "claude-sonnet-4-6"]:
for temp in [0.3, 0.7, 1.0]:
candidate = await translate(source, model=model, temperature=temp)
population.append(candidate)

for gen in range(generations):
# Score each candidate
scored = [(c, score(c, reference)) for c in population]
scored.sort(key=lambda x: x[1], reverse=True)

# Select top K
survivors = [c for c, s in scored[:pop_size // 2]]

# Mutate: ask LLM to improve each survivor
mutants = []
for survivor in survivors:
mutant = await improve(source, survivor, feedback=scored[0])
mutants.append(mutant)

population = survivors + mutants

return max(population, key=lambda c: score(c, reference))

适应度函数设计

适应度函数至关重要。选项包括:

指标测量内容自动化?
针对参考译文的 chrF++与黄金标准的字符级相似度✅ 是
FST 接受率形态学有效性✅ 是(如果有 FST)
往返一致性反向翻译能否恢复源文本?✅ 是
LLM 作为评判者另一个 LLM 评估流畅度/准确度✅ 是(但有噪声)
词典术语出现已知术语是否正确出现?✅ 是

:::tip 组合多个信号 多个指标的加权组合比任何单一指标都能形成更稳健的适应度函数。这与评分工具自身的 composite score 相呼应。 :::

优缺点

✅ 探索多样化的解决方案❌ 计算成本高(N × G 次 API 调用)
✅ 可以发现单个模型无法找到的方法❌ 需要良好的适应度函数
✅ 可并行化❌ 速度慢——每次翻译需要多代迭代
✅ 模型无关❌ 几代之后收益递减

与以下方法结合效果好

另见