Phase 05 - Lesson 11

Traducción Automática

La traducción es la tarea que financió la investigación en PLN durante treinta años y sigue financiándola hoy.

Tipo: Build Lenguajes: Python Prerrequisitos: Fase 5 · 10 (Mecanismo de Atención), Fase 5 · 04 (GloVe, FastText, Subword) Tiempo: ~75 minutos

El Problema

Un modelo lee una oración en un idioma y produce una oración en otro. La longitud varía. El orden de las palabras varía. Algunas palabras de origen mapean a varias palabras de destino y viceversa. Los modismos se resisten al mapeo uno a uno. "I miss you" en francés es "tu me manques" — literalmente "tú me haces falta". Ningún alineamiento a nivel de palabra sobrevive a eso.

La traducción automática es la tarea que obligó al PLN a inventar encoder-decoders, atención, transformers y, finalmente, todo el paradigma de los LLM. Cada paso hacia adelante llegó porque la calidad de la traducción era medible y la brecha entre humano y máquina era obstinada.

Esta lección omite la clase de historia y enseña el pipeline funcional de 2026: encoder-decoder multilingüe preentrenado (NLLB-200 o mBART), tokenización por subpalabras, beam search, evaluación con BLEU y chrF, y el puñado de modos de fallo que aún llegan a producción sin ser detectados.

El Concepto

Pipeline de MT: tokenizar → codificar → decodificar con atención → destokenizar

La MT moderna es un transformer encoder-decoder entrenado con texto paralelo. El encoder lee el origen en la tokenización de su idioma. El decoder genera el destino, una subpalabra a la vez, usando la salida del encoder mediante cross-attention (lección 10). La decodificación usa beam search para evitar la trampa de la decodificación voraz (greedy). La salida se destokeniza, se revierte el truecasing y se puntúa contra una referencia.

Tres decisiones operativas determinan la calidad real de la MT en el mundo real.

  • Tokenizador. SentencePiece BPE entrenado sobre un corpus de idiomas mezclados. El vocabulario compartido entre idiomas es lo que habilita los pares zero-shot en NLLB.
  • Tamaño del modelo. El NLLB-200 distilled 600M cabe en un laptop. El NLLB-200 3.3B es el valor por defecto de producción publicado. 54.5B es el techo de investigación.
  • Decodificación. Ancho de beam de 4-5 para contenido general. Penalización de longitud para evitar salida demasiado corta. Decodificación restringida cuando se necesita consistencia terminológica.

Constrúyelo

Paso 1: una llamada de MT preentrenada

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

model_id = "facebook/nllb-200-distilled-600M"
tok = AutoTokenizer.from_pretrained(model_id, src_lang="eng_Latn")
model = AutoModelForSeq2SeqLM.from_pretrained(model_id)

src = "The cats are running."
inputs = tok(src, return_tensors="pt")

out = model.generate(
    **inputs,
    forced_bos_token_id=tok.convert_tokens_to_ids("fra_Latn"),
    num_beams=5,
    length_penalty=1.0,
    max_new_tokens=64,
)
print(tok.batch_decode(out, skip_special_tokens=True)[0])
Les chats courent.

Tres cosas importan aquí. src_lang le dice al tokenizador qué script y segmentación aplicar. forced_bos_token_id le dice al decoder qué idioma generar. Ambos son trucos específicos de NLLB; mBART y M2M-100 usan sus propias convenciones y no son intercambiables.

Paso 2: BLEU y chrF

BLEU mide la superposición de n-gramas entre la salida y la referencia. Cuatro tamaños de n-grama de referencia (1-4), media geométrica de las precisiones, penalización por brevedad para salida demasiado corta. La puntuación está en [0, 100]. De uso común. Frustrante de interpretar: 30 BLEU es "utilizable"; 40 es "bueno"; 50 es "excepcional"; las diferencias por debajo de 1 BLEU son ruido.

chrF mide el F-score a nivel de carácter. Más sensible a idiomas morfológicamente ricos donde BLEU subcuenta las coincidencias. A menudo se reporta junto con BLEU.

import sacrebleu

hypotheses = ["Les chats courent."]
references = [["Les chats courent."]]

bleu = sacrebleu.corpus_bleu(hypotheses, references)
chrf = sacrebleu.corpus_chrf(hypotheses, references)
print(f"BLEU: {bleu.score:.1f}  chrF: {chrf.score:.1f}")

Siempre usa sacrebleu. Normaliza la tokenización para que las puntuaciones sean comparables entre artículos. Implementar tu propio cálculo de BLEU es como surgen los benchmarks engañosos.

La jerarquía de evaluación de tres niveles (2026)

La evaluación moderna de MT usa tres familias de métricas complementarias. Entrega con al menos dos.

  • Heurística (BLEU, chrF). Rápida, basada en referencia, interpretable, insensible a la paráfrasis. Úsala para comparación heredada y detección de regresiones.
  • Aprendida (COMET, BLEURT, BERTScore). Modelos neuronales entrenados con juicio humano; comparan la similitud semántica de la traducción con el origen y la referencia. COMET tiene la mayor asociación con la investigación en MT desde 2023 y es el valor por defecto de producción de 2026 donde la calidad importa.
  • LLM como juez (sin referencia). Pídele a un modelo grande que puntúe traducciones en fluidez, adecuación, tono y pertinencia cultural. GPT-4 como juez coincide con la concordancia humana ~80% de las veces cuando la rúbrica está bien diseñada. Úsalo para contenido abierto donde no existe referencia.

Stack práctico de 2026: sacrebleu para BLEU y chrF, unbabel-comet para COMET, y un LLM con prompt para la señal final orientada al humano. Calibra cada métrica contra 50-100 ejemplos etiquetados por humanos antes de confiar en ella con datos de producción.

Las métricas sin referencia (COMET-QE, BLEURT-QE, LLM como juez) permiten evaluar traducciones sin una referencia, lo cual importa para pares de idiomas de cola larga donde no existen traducciones de referencia.

Paso 3: qué se rompe en producción

El pipeline funcional de arriba traducirá con fluidez el 80% de las veces y fallará silenciosamente el 20% restante. Modos de fallo nombrados:

  • Alucinación. El modelo inventa contenido que no estaba en el origen. Común en vocabulario de dominio desconocido. Síntoma: la salida es fluida pero afirma hechos que el origen no declaró. Mitigación: decodificación restringida en términos de dominio, revisión humana en contenido regulado, monitoreo de salida mucho más larga que la entrada.
  • Generación off-target. El modelo traduce al idioma equivocado. NLLB es sorprendentemente propenso a esto en pares de idiomas raros. Mitigación: verifica el forced_bos_token_id y siempre decodifica con una verificación de modelo de identificación de idioma (language-ID) en la salida.
  • Deriva terminológica. "Sign up" se convierte en "s'inscrire" en el doc 1 y "créer un compte" en el doc 2. Para texto de UI y cadenas orientadas al usuario, la consistencia importa más que la calidad bruta. Mitigación: decodificación restringida por glosario o diccionario de posedición.
  • Discrepancia de formalidad. "tu" vs "vous" del francés, niveles de cortesía del japonés. El modelo elige la forma que fue más común en el entrenamiento. Para contenido orientado al cliente, esto suele estar equivocado. Mitigación: prefijo de prompt con un token de formalidad si el modelo lo soporta, o fine-tune de un modelo pequeño con corpus solo formales.
  • Explosión de longitud en entrada corta. Las oraciones de entrada muy cortas a menudo producen traducciones demasiado largas porque la penalización de longitud se desploma por debajo de ~5 tokens de origen. Mitigación: límite máximo de longitud proporcional a la longitud del origen.

Paso 4: fine-tuning para un dominio

Los modelos preentrenados son generalistas. La traducción jurídica, médica o de diálogo de videojuegos se beneficia de forma medible del fine-tuning con datos paralelos de dominio. La receta no es exótica:

from transformers import Trainer, TrainingArguments
from datasets import Dataset

pairs = [
    {"src": "The defendant pleaded guilty.", "tgt": "L'accusé a plaidé coupable."},
]

ds = Dataset.from_list(pairs)


def preprocess(ex):
    return tok(
        ex["src"],
        text_target=ex["tgt"],
        truncation=True,
        max_length=128,
        padding="max_length",
    )


ds = ds.map(preprocess, remove_columns=["src", "tgt"])

args = TrainingArguments(output_dir="out", per_device_train_batch_size=4, num_train_epochs=3, learning_rate=3e-5)
Trainer(model=model, args=args, train_dataset=ds).train()

Unos pocos miles de ejemplos paralelos de alta calidad superan a unos pocos cientos de miles de ejemplos ruidosos extraídos de la web. La calidad de los datos de entrenamiento es la mayor palanca individual de producción.

Úsalo

El stack de producción de MT en 2026:

Caso de uso Punto de partida recomendado
Cualquiera-a-cualquiera, 200 idiomas facebook/nllb-200-distilled-600M (laptop) o nllb-200-3.3B (producción)
Centrado en inglés, alta calidad, 50 idiomas facebook/mbart-large-50-many-to-many-mmt
Ejecuciones cortas, inferencia barata, inglés-francés/alemán/español Modelos Helsinki-NLP / Marian
Crítico en latencia, del lado del navegador Marian cuantizado en ONNX (~50 MB)
Calidad máxima, dispuesto a pagar GPT-4 / Claude / Gemini con prompts de traducción

Los LLM ahora superan a los modelos de MT especializados en varios pares de idiomas a partir de 2026, particularmente en contenido idiomático y contexto largo. El tradeoff es el costo por token y la latencia. Elige un LLM cuando la longitud de contexto, la consistencia estilística o la adaptación de dominio mediante prompting importen más que el rendimiento (throughput).

Entrégalo

Guarda como outputs/skill-mt-evaluator.md:

---
name: mt-evaluator
description: Evaluate a machine translation output for shipping.
version: 1.0.0
phase: 5
lesson: 11
tags: [nlp, translation, evaluation]
---

Given a source text and a candidate translation, output:

1. Automatic score estimate. BLEU and chrF ranges you would expect. State whether a reference is available.
2. Five-point human-verifiable check list: (a) content preservation (no hallucinations), (b) correct language, (c) register / formality match, (d) terminology consistency with glossary if provided, (e) no truncation or length explosion.
3. One domain-specific issue to probe. E.g., for legal: named entities and statute citations. For medical: drug names and dosages. For UI: placeholder variables `{name}`.
4. Confidence flag. "Ship" / "Ship with review" / "Do not ship". Tie to the severity of issues found in step 2.

Refuse to ship a translation without a language-ID check on output. Refuse to evaluate without a reference unless the user explicitly opts in to reference-free scoring (COMET-QE, BLEURT-QE). Flag any content over 1000 tokens as likely needing chunked translation.

Ejercicios

  1. Fácil. Traduce un párrafo en inglés de 5 oraciones al francés y de vuelta al inglés usando nllb-200-distilled-600M. Mide qué tan cerca está el ida y vuelta del original. Deberías ver preservación semántica con deriva en la elección de palabras.
  2. Medio. Implementa una verificación de identificación de idioma (language-ID) en las salidas de traducción usando fasttext lid.176 o langdetect. Intégrala en la llamada de MT para que las generaciones off-target se capturen antes de retornar.
  3. Difícil. Haz fine-tuning de nllb-200-distilled-600M con un corpus de dominio de 5.000 pares de tu elección. Mide el BLEU en un conjunto de validación (held-out) antes y después del fine-tuning. Reporta qué tipos de oraciones mejoraron y cuáles empeoraron.

Términos Clave

Término Lo que la gente dice Lo que realmente significa
BLEU Puntuación de traducción Precisión de n-gramas con penalización por brevedad. [0, 100].
chrF F-score de carácter F-score a nivel de carácter. Más sensible para idiomas morfológicamente ricos.
NMT MT Neuronal Transformer encoder-decoder entrenado con texto paralelo. El valor por defecto de 2017+.
NLLB No Language Left Behind La familia de modelos de MT de 200 idiomas de Meta.
Decodificación restringida Salida controlada Forzar tokens o n-gramas específicos a aparecer / no aparecer en la salida.
Alucinación Contenido inventado Salida del modelo que no está respaldada por el origen.

Lectura Adicional

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).