30 Generación de texto en profundidad
Dónde estamos. Abre la Parte V (usar el modelo). En el Cap. 12 vimos lo básico de decodificación —greedy, beam, temperatura, top-k, top-p, KV-cache—. Aquí vamos más hondo y aplicado: cómo elegir estrategia, los métodos de muestreo nuevos, cómo controlar la salida (repetición, longitud, guía), cómo forzar formato (JSON, gramáticas), cómo acelerar (decodificación especulativa) y cómo evaluar el texto generado —con sus trampas—.
30.1 La idea en una frase
La calidad de lo que genera un modelo no es solo cuestión del modelo, sino de cómo lo decodificas: la misma red puede sonar plana y repetitiva o creativa y coherente según la estrategia de decodificación que elijas.
30.2 Conceptos clave y su papel en el transformer
Antes de entrar en detalle, definimos los términos de este capítulo y para qué sirve cada uno dentro de un transformer:
- Decodificación. Definición: el procedimiento que convierte las probabilidades que saca el modelo en tokens concretos, uno a uno. En el transformer: es la capa que va después de la red; la misma red puede sonar plana o creativa según cómo decodifiques.
- Greedy / beam (maximización). Definición: elegir en cada paso el token más probable (o la secuencia globalmente más probable). En el transformer: da precisión en tareas cerradas, pero en texto abierto degenera en repetición.
- Muestreo (temperatura, top-k, top-p). Definición: sacar el siguiente token al azar según la distribución, recortada por temperatura/top-k/top-p. En el transformer: aporta la diversidad que el texto humano necesita; los filtros podan la cola de tokens improbables.
- Min-p. Definición: un umbral de corte relativo al token más probable. En el transformer: se adapta a la confianza del modelo → aguanta temperaturas altas sin desbarrar.
- Control (repetición, longitud). Definición: palancas que bajan los logits de tokens ya vistos o deciden cuándo parar. En el transformer: rompen el bucle auto-reforzado de la repetición y fijan la longitud de salida.
- Decodificación restringida. Definición: en cada paso, enmascarar los tokens que violarían un esquema (JSON, regex, gramática) y renormalizar. En el transformer: garantiza la forma de la salida (no la verdad).
- Decodificación especulativa. Definición: un modelo borrador propone varios tokens y el grande los verifica en paralelo. En el transformer: acelera la inferencia sin cambiar la distribución de salida.
- Evaluación (referencia / LLM-juez / fidelidad). Definición: las familias de métricas para juzgar el texto generado. En el transformer: miden ejes distintos —solapamiento, preferencia, veracidad— y ninguna es perfecta.
Con esto en mente, vamos paso a paso.
30.3 Decodificar es decidir: probabilidad ≠ calidad
La primera lección, contraintuitiva: buscar la secuencia más probable no da el mejor texto en generación abierta. El trabajo de referencia (Holtzman et al. 2020) lo mostró: la maximización (greedy, beam) en texto abierto produce salidas planas, repetitivas y degeneradas —el modelo se atasca en bucles—. Y el hallazgo que lo explica: el texto humano NO sigue el camino de máxima probabilidad; las personas somos “sorprendentes”, y un texto que es altamente probable en cada paso suena artificial.
De ahí la decisión central, según la tarea:
- Determinista (greedy / beam): para tareas cerradas —traducción, código, datos, preguntas factuales— donde hay (casi) una respuesta correcta y quieres precisión.
- Estocástica (muestreo): para tareas abiertas/creativas —escribir, conversar, generar ideas— donde la diversidad importa y la repetición mata.
Lo más llamativo de (Holtzman et al. 2020) es esto: si dibujas la probabilidad que el modelo asigna a cada palabra del texto escrito por humanos, oscila —sube y baja—; no se queda pegada arriba. El lenguaje natural mezcla lo esperable con lo inesperado. Por eso un decodificador que solo persigue lo más probable produce algo demasiado predecible para parecer humano. La degeneración por repetición, además, es un bucle que se refuerza: repetir un token sube su probabilidad futura.
30.4 Muestreo en profundidad
Recordatorio (Cap. 12): la temperatura \(\tau\) reescala los logits antes del softmax, softmax(z/τ) —con \(\tau\to 0\) tiende a greedy (siempre el más probable) y \(\tau\to\infty\) a uniforme (azar puro)—; top-k se queda con los \(k\) mejores; top-p (nucleus) con el conjunto más pequeño que suma probabilidad \(p\). Sobre eso, métodos más recientes que el Cap. 12 no cubrió:
- Min-p (Nguyen et al. 2025): el umbral es relativo al token más probable (
p_base × prob_del_top). Cuando el modelo está seguro (un token domina), recorta agresivo; cuando duda, deja más opciones. Es más robusto a temperatura alta —deja ser creativo sin desbarrar—. - Muestreo típico (Meister et al. 2023): muestrea entre los tokens cuyo contenido de información está cerca de la sorpresa esperada (la entropía condicional). Descarta a la vez lo demasiado obvio y lo demasiado raro.
- Eta / epsilon (Hewitt et al. 2022): ve el modelo como “distribución real + suavizado”; truncar es des-suavizar. η usa un umbral que depende de la entropía (más candidatos cuando el modelo es genuinamente incierto, menos cuando está seguro) —mejor que top-p para escapar de la repetición—.
- Búsqueda contrastiva (Su et al. 2022): en cada paso equilibra la confianza del modelo con una penalización de degeneración (parecido con lo ya generado) → coherente y no repetitivo, sin el ruido del muestreo.
- Decodificación contrastiva (Li et al. 2022): puntúa con
log p(experto) − log p(aprendiz)(un modelo fuerte menos uno débil); el contraste cancela los fallos (repetición, sosería) que el aprendiz también comete.
Receta práctica: valores típicos temp ≈ 0,7–1,0 y top-p ≈ 0,9 (o top-k ≈ 40). Ojo: estos filtros se combinan y el orden importa (suele aplicarse temperatura → top-k → top-p sobre el mismo paso). Baja temperatura/greedy para factual; sube temperatura + min-p/top-p para creativo.
30.5 Controlar la generación
Más allá de cómo muestrear, hay palancas para dirigir la salida:
- Repetición. La penalización por repetición (Keskar et al. 2019) divide los logits de los tokens ya vistos por un factor >1; no-repeat-ngram prohíbe repetir cualquier n-grama; las penalizaciones de frecuencia (escala con el número de apariciones) y de presencia (plana, una vez visto) son las de las APIs. Todas combaten el bucle auto-reforzado de Holtzman.
- Longitud.
max/minde tokens nuevos; la penalización de longitud en beam (sin ella, beam prefiere secuencias cortas); manejo del token de fin (EOS): suprimirlo para forzar longitud mínima, o sesgar hacia él para acabar antes. - Guía sin clasificador (CFG) para texto (Sanchez et al. 2023): tomada de los modelos de difusión. Amplifica el efecto del prompt contrastando los logits con y sin condición:
\[ \text{logits} = \text{logits}_{\text{sin}} + \gamma\,\big(\text{logits}_{\text{con}} - \text{logits}_{\text{sin}}\big) \]
Término a término: logits_con = con el prompt; logits_sin = sin él (incondicional); \(\gamma\) = el peso de guía (cuánto exagerar la diferencia). \(\gamma=1\) es la generación normal; \(\gamma>1\) empuja el texto a “quedarse en el tema” del prompt. - Otras: logit bias (forzar o vetar tokens concretos) y criterios de parada (cadenas de stop, EOS, máximo de tokens).
30.6 Decodificación restringida: forzar un formato válido
A veces necesitas que la salida obedezca un esquema (JSON, una regex, una gramática). La idea es simple y potente: en cada paso, pones a cero la probabilidad de los tokens que violarían la restricción y renormalizas sobre los válidos. Así la salida está garantizado que encaja.
- Outlines (Willard y Louf 2023): compila la regex/gramática en una máquina de estados finitos y precalcula la máscara de tokens válidos por estado → coste casi nulo, generación guiada por regex o esquema JSON.
- Decodificación con gramática (Geng et al. 2023): gramáticas formales (estilo GBNF de llama.cpp). El “modo JSON” y el function calling son casos productizados de esto.
🧩 Analogía. Es un autocompletado que físicamente no puede teclear un carácter inválido —como un campo de formulario que solo acepta dígitos—.
Las restricciones aseguran forma, no verdad: un JSON perfectamente válido puede contener una respuesta incorrecta. Y hay un debate abierto: Let Me Speak Freely? (Tam et al. 2024) halló que restringir el formato puede degradar el razonamiento (el modo JSON ayuda a clasificar pero perjudica tareas de razonamiento). Otros replican que un diseño cuidadoso del esquema lo recupera. Trátalo como un compromiso, no como algo cerrado: restringe cuando necesites parsear sin fallos, pero mide si pierdes calidad de contenido.
30.7 Decodificación especulativa: la misma salida, más rápido
Generar es secuencial (un token tras otro), y ahí está el cuello de botella de latencia. La decodificación especulativa (Leviathan et al. 2023; Chen et al. 2023) lo ataca sin cambiar el resultado: un modelo borrador pequeño propone varios tokens, y el modelo grande los verifica en paralelo en una sola pasada, aceptando el prefijo correcto y recalculando en el primer fallo. La distribución de salida es idéntica a la del modelo grande solo; solo que más rápida. Hoy es la aceleración sin pérdida dominante en inferencia.
🧩 Analogía. Un becario redacta una frase y el experto la revisa de un vistazo, quedándose con la parte correcta: las mismas palabras finales, en mucho menos tiempo.
30.8 Evaluar el texto generado
¿Cómo sabes si una salida es buena? Es difícil, porque en generación abierta no hay una referencia única. Tres familias:
- Basadas en referencia (solapamiento con un texto “correcto”): BLEU (Papineni et al. 2002) (precisión de n-gramas, traducción), ROUGE (Lin 2004) (recall de n-gramas, resumen), BERTScore (Zhang et al. 2020) (similitud por embeddings, capta paráfrasis). Honesto: BLEU/ROUGE correlacionan débilmente con el juicio humano en texto abierto.
- Basadas en modelo (LLM-as-judge): G-Eval (Liu et al. 2023) (un GPT-4 puntúa con cadena de razonamiento) y MT-Bench / Chatbot Arena (Zheng et al. 2023) (comparación por pares, Elo humano). Honesto: los jueces-LLM tienen sesgos —de posición (favorecen la primera respuesta), de verbosidad (favorecen la más larga) y de autopreferencia (favorecen su propia familia de modelos)—.
- Fidelidad / alucinación: es un eje aparte de la fluidez —una respuesta puede sonar perfecta y ser falsa—.
La estrategia de decodificación no cambia la geometría de atención del modelo; pero la longitud de lo que generas sí dispara el coste del KV-cache. tafagent te calcula, a partir de γ (Cap. 15-20), el presupuesto de KV a la longitud objetivo: útil para anticipar cuánta memoria costará una generación larga antes de lanzarla.
30.9 Resumen
- Probabilidad ≠ calidad (Holtzman et al. 2020): maximizar (greedy/beam) degenera en texto abierto; el texto humano no sigue la cresta de probabilidad → muestrear.
- Cuándo: determinista para cerrado/factual/código; muestreo para abierto/creativo.
- Muestreo nuevo: min-p (umbral relativo al top, robusto a temperatura alta), típico, eta/epsilon, búsqueda/decodificación contrastiva. Receta: temp≈0,7–1,0, top-p≈0,9; se combinan y el orden importa.
- Control: penalización de repetición/frecuencia/presencia, no-repeat-ngram; longitud y EOS; CFG de texto (
sin + γ·(con − sin)); logit bias. - Restringida: enmascarar tokens inválidos + renormalizar (Outlines/gramáticas, modo JSON) → forma garantizada; pero forma ≠ verdad, y puede dañar el razonamiento (Tam et al. 2024).
- Especulativa: borrador propone, grande verifica en paralelo → misma salida, más rápido.
- Evaluar: BLEU/ROUGE/BERTScore (referencia, correlación débil), LLM-as-judge (G-Eval, MT-Bench, con sesgos posición/verbosidad/autopreferencia); fidelidad es eje aparte.
Siguiente (Capítulo 30): sin tocar pesos, el prompt mismo programa al modelo — prompting, in-context learning, chain-of-thought y las cabezas de inducción que lo hacen posible—.
30.10 Ejercicios
- Probabilidad ≠ calidad. ¿Por qué greedy/beam degeneran en generación abierta? ¿Qué mostró Holtzman sobre el texto humano?
- Min-p vs top-p. ¿En qué se diferencia el umbral de min-p del de top-p, y por qué min-p aguanta mejor temperaturas altas?
- CFG de texto. En
logits_sin + γ·(logits_con − logits_sin), ¿qué hace \(\gamma\)? ¿Qué pasa con \(\gamma=1\)? - Restringida. Explica el mecanismo “enmascarar + renormalizar”. ¿Por qué un JSON válido no garantiza una respuesta correcta?
- Especulativa. ¿Por qué la decodificación especulativa produce exactamente la misma distribución que el modelo grande solo?
- Jueces-LLM. Cita dos sesgos de usar un LLM como evaluador.