Ir para o conteúdo principal

Tradução Evolutiva / Baseada em Busca

A ideia: Gere múltiplos candidatos de tradução, avalie-os contra uma função de aptidão (chrF++, aceitação FST, consistência de tradução reversa), mutue os melhores desempenhos e repita. Seleção natural para traduções — os mais aptos sobrevivem.

:::info Este é um cookbook, não uma implementação finalizada Esta é a abordagem mais experimental da série de cookbooks. Não foi comprovada para MT em escala, mas a arquitetura é sólida e o harness avaliará com prazer tudo o que produzir. :::

Quando Usar Isto

  • Você tem uma boa função de avaliação, mas nenhum modelo único produz resultados consistentes
  • Você quer explorar o espaço de soluções de forma mais ampla do que uma única geração gulosa
  • Você tem orçamento computacional para muitas gerações paralelas (dezenas de candidatos por entrada)
  • Você está interessado em pesquisa inovadora — essa abordagem é pouco explorada para MT de baixo recurso

Como Funciona

[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

Esqueleto

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))

Design da Função de Aptidão

A função de aptidão é tudo. Opções:

MétricaO Que MedeAutomatizada?
chrF++ contra referênciaSimilaridade em nível de caractere com o ouro✅ Sim
Taxa de aceitação FSTValidade morfológica✅ Sim (se FST disponível)
Consistência de tradução reversaA tradução reversa recupera a fonte?✅ Sim
LLM-como-juizOutro LLM avalia fluência/precisão✅ Sim (mas ruidoso)
Presença de termo em dicionárioOs termos conhecidos aparecem corretamente?✅ Sim

:::tip Combine múltiplos sinais Uma combinação ponderada de métricas cria uma função de aptidão mais robusta do que qualquer métrica única. Isso espelha o próprio composite score do harness. :::

Prós e Contras

✅ Explora soluções diversas❌ Computacionalmente caro (N × G chamadas de API)
✅ Pode descobrir abordagens que nenhum modelo único encontra❌ Requer uma boa função de aptidão
✅ Paralelizável❌ Lento — múltiplas gerações por tradução
✅ Agnóstico a modelo❌ Retornos decrescentes após algumas gerações

Combina Bem Com

Veja Também