Ir al contenido principal

Traducción Evolutiva / Basada en Búsqueda

La idea: Generar múltiples traducciones candidatas, puntuarlas contra una función de aptitud (chrF++, aceptación FST, consistencia de traducción inversa), mutar los mejores desempeños, y repetir. Selección natural para traducciones — los más aptos sobreviven.

:::info Este es un libro de recetas, no una implementación terminada Este es el enfoque más experimental de la serie de libros de recetas. No ha sido probado para MT a escala, pero la arquitectura es sólida y el arnés puntuará con gusto lo que produzca. :::

Cuándo Usar Esto

  • Tiene una buena función de puntuación pero ningún modelo individual produce resultados consistentes
  • Desea explorar el espacio de soluciones de manera más amplia que una única generación codiciosa
  • Tiene presupuesto computacional para muchas generaciones paralelas (docenas de candidatos por entrada)
  • Le interesa la investigación novedosa — este enfoque está poco explorado para MT de bajo recurso

Cómo 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))

Diseño de la Función de Aptitud

La función de aptitud lo es todo. Opciones:

MétricaQué Mide¿Automatizada?
chrF++ contra referenciaSimilitud a nivel de caracteres con el estándar de oro✅ Sí
Tasa de aceptación FSTValidez morfológica✅ Sí (si FST está disponible)
Consistencia de traducción inversa¿Se recupera la fuente al traducir de vuelta?✅ Sí
LLM como juezOtro LLM califica fluidez/precisión✅ Sí (pero ruidoso)
Presencia de términos de diccionario¿Aparecen correctamente los términos conocidos?✅ Sí

:::tip Combine múltiples señales Una combinación ponderada de métricas crea una función de aptitud más robusta que cualquier métrica individual. Esto refleja la propia puntuación compuesta del arnés. :::

Ventajas y Desventajas

✅ Explora soluciones diversas❌ Computacionalmente costoso (N × G llamadas API)
✅ Puede descubrir enfoques que ningún modelo individual encuentra❌ Requiere una buena función de aptitud
✅ Paralelizable❌ Lento — múltiples generaciones por traducción
✅ Agnóstico del modelo❌ Rendimientos decrecientes después de pocas generaciones

Se Combina Bien Con

Véase También