IA Generativa y LLMs: Arquitectura y preparación de datos

Objetivo del módulo

Entender qué es la IA generativa, qué tipos de contenido produce y por qué está transformando sectores enteros. Al terminar, el lector sabrá:

Un caso de partida

Un equipo de tecnología de un hospital quiere mejorar la experiencia del paciente: que cada persona reciba un resumen comprensible de sus análisis clínicos, en lugar de una tabla de valores técnicos. ¿Puede hacerlo una máquina? Es exactamente el tipo de tarea en la que destaca la IA generativa.

Qué es la IA generativa

La IA generativa es el conjunto de modelos de aprendizaje profundo capaces de generar texto, imágenes y otros contenidos de alta calidad a partir de los datos con que se entrenaron. Funciona en tres pasos:

  1. Se entrena con grandes cantidades de datos existentes.
  2. Aprende los patrones y estructuras de esos datos: cómo se combinan las palabras, cómo se distribuyen los colores, cómo suena una voz.
  3. Usa ese conocimiento para producir datos nuevos y pertinentes, que no copian ningún ejemplo concreto.

Una analogía útil: un artista que estudia cientos de cuadros, entiende sus patrones y después pinta una obra original inspirada en lo aprendido.

IAgenerativaaprende patrones de los datosy genera contenido nuevoTextonarrativa, traducción, resúmenesGPTImagendesde texto o desde una imagen semillaDALL-E · difusiónAudiovoz natural, texto a vozWaveNet3Dobjetos tridimensionalesMúsicacomposición
Fig. 1 — Tipos de contenido que genera la IA generativa y modelos representativos de cada uno.

Modelos de texto

Comprenden el contexto y las relaciones entre palabras y frases, y generan texto coherente con él. Si se empieza a escribir un relato, predicen y redactan la continuación; si se introduce una frase en español, pueden traducirla a otro idioma conservando el tono. El ejemplo de referencia es GPT (generative pre-trained transformer, transformador generativo preentrenado).

Modelos de imagen

Trabajan de dos maneras:

Esta misma capacidad permite crear deepfakes (falsificaciones hiperrealistas), por ejemplo «devolver a la vida» a un actor en una película: un uso que plantea cuestiones éticas evidentes.

Modelos de audio

Generan voz con sonido natural y realizan síntesis de texto a voz: por ejemplo, una conversación grabada que suena real. El ejemplo de referencia es WaveNet. La IA generativa también produce objetos tridimensionales y música.

Aplicaciones transversales

AplicaciónQué aporta
Creación de contenidoArtículos, entradas de blog, material de marketing; imágenes y vídeos para entretenimiento y publicidad
Resumen de documentosCondensar textos largos para captar lo esencial rápidamente
TraducciónTraducciones más naturales, que mejoran la accesibilidad del contenido
Asistentes virtualesChatbots que conversan de forma natural y atienden mejor a los clientes
Análisis de datosDescubrir patrones en grandes volúmenes de texto y proponer soluciones

Por sectores, hoy y mañana

HoyFuturomercado estimado: 1,3 billones de dólares en 2032 (Bloomberg Intelligence)Saludanalizar imágenes médicas y redactar informes de pacientesFinanzaspredicciones a partir de grandes datos financierosVideojuegoselementos interactivos e historias dinámicasTIdatos sintéticos para entrenar modelosRecomendaciones personalizadasDescubrimiento de fármacosHogares inteligentesVehículos autónomos
Fig. 2 — Aplicaciones por sector hoy y ámbitos en los que se espera que crezca.

Según Bloomberg Intelligence, la IA generativa podría convertirse en un mercado de 1,3 billones de dólares (1,3 × 1012) hacia 2032. Volviendo al caso del hospital: un modelo de texto puede convertir los resultados en un resumen claro. Con una biblioteca como Hugging Face Transformers bastan unas líneas:

from transformers import pipeline # Modelo de chat pequeño y abierto (se descarga la primera vez) generador = pipeline("text-generation", model="Qwen/Qwen2.5-0.5B-Instruct") informe = """Hemoglobina: 13,5 g/dL (rango normal 12-16). Colesterol LDL: 160 mg/dL (recomendado: menos de 130).""" mensajes = [{"role": "user", "content": "Resume para el paciente, en dos frases sencillas:\n" + informe}] salida = generador(mensajes, max_new_tokens=80) print(salida[0]["generated_text"][-1]["content"]) # respuesta del modelo

En un entorno sanitario real, ese resumen tendría que revisarlo un profesional antes de llegar al paciente: los modelos pueden equivocarse, como se verá en el módulo dedicado a las alucinaciones.

Mini-quiz · Importancia de la IA generativa

1. ¿Qué define a la IA generativa?

2. ¿Qué pareja tipo de contenido–modelo es correcta?

3. Convertir un boceto en una imagen realista es un ejemplo de…

Ejercicio 1.1 · Elegir el tipo de modelo

Indica qué tipo de modelo generativo (texto, imagen o audio) resolvería cada necesidad: (a) un servicio de atención telefónica que lee en voz alta el estado de un pedido; (b) generar ilustraciones para un manual a partir de descripciones; (c) traducir los partes de mantenimiento del francés al español; (d) restaurar fotografías antiguas deterioradas.

Solución

(a) Audio, síntesis de texto a voz (tipo WaveNet). (b) Imagen de texto a imagen (tipo DALL-E). (c) Texto (tipo GPT u otro LLM, modelo de lenguaje grande). (d) Imagen de imagen a imagen, por ejemplo con un modelo de difusión, que aprende a quitar ruido y reconstruir.

Ejercicio 1.2 · Riesgos del caso del hospital

El hospital quiere automatizar los resúmenes de análisis para los pacientes. Enumera dos riesgos y una medida para cada uno.

Solución

(1) Errores o datos inventados en el resumen: un profesional revisa cada resumen antes de enviarlo, y el modelo trabaja solo con los valores del informe. (2) Privacidad de los datos clínicos: usar un modelo desplegado en infraestructura propia o con garantías contractuales, y anonimizar lo que no sea necesario. Un tercer riesgo razonable: un lenguaje que alarme sin necesidad; se mitiga con instrucciones de tono y ejemplos revisados.

Objetivo del módulo

Conocer las cinco arquitecturas más usadas en IA generativa y en qué se diferencian sus formas de entrenar. Al terminar, el lector sabrá:

El problema de partida

Una plataforma en línea quiere generar vídeos personalizados a partir de una descripción escrita por cada usuario. ¿Qué arquitectura usar? Depende de lo que haya que generar y de cómo se entrene: no existe un modelo universal. Las cinco familias principales son las redes neuronales recurrentes (RNN), los transformers, las redes generativas adversariales (GAN), los autocodificadores variacionales (VAE) y los modelos de difusión.

Redes recurrentes (RNN)

Las RNN (recurrent neural networks) procesan datos secuenciales o series temporales: datos con un orden natural o con dependencias en el tiempo. Se distinguen de las redes convencionales por un bucle en su estructura que les permite recordar entradas anteriores: lo que se leyó antes influye en cómo se procesa la entrada actual.

RNN compactaceldaRNNh (memoria)xLa misma celda desplegada en el tiempoceldax1 = «El»y1h1celdax2 = «gato»y2h2celdax3 = «come»y3h3celdax4 = «pescado»y4el estado oculto h lleva la información de las palabras anteriores al paso siguiente
Fig. 1 — Una red neuronal recurrente usa un bucle: el estado oculto de cada paso influye en el siguiente.
import torch import torch.nn as nn rnn = nn.RNN(input_size=8, hidden_size=16, batch_first=True) x = torch.randn(1, 4, 8) # 1 frase, 4 palabras, 8 rasgos por palabra salidas, h_final = rnn(x) print(salidas.shape) # torch.Size([1, 4, 16]): una salida por paso print(h_final.shape) # torch.Size([1, 1, 16]): memoria tras la última palabra

Se usan en procesamiento del lenguaje natural (PLN), traducción, reconocimiento de voz y descripción de imágenes. Su punto débil es que procesan palabra a palabra, de forma secuencial, y les cuesta recordar información muy lejana.

Ajuste fino

El ajuste fino (fine-tuning) consiste en adaptar un modelo ya entrenado para mejorar su rendimiento en una tarea o un conjunto de datos concreto. Su alcance cambia según la arquitectura: en una RNN puede requerir ajustar los pesos e incluso la estructura de la red; en un transformer, el modelo preentrenado se mantiene casi intacto y normalmente solo se entrenan las capas finales de salida.

Transformers

Los transformers son modelos de aprendizaje profundo capaces de traducir texto y voz casi en tiempo real. La información fluye desde la capa de entrada, a través de capas ocultas, hasta la de salida. Su pieza clave es el mecanismo de autoatención: para cada palabra, el modelo calcula cuánto debe fijarse en cada una de las demás.

Pesos de atención de «banco» sobre cada palabra de la frase (suman 1)0,03El0,12banco0,04del0,63ríoaclara el sentido0,08estaba0,10lleno«río» recibe el peso más alto: indica que «banco» es la orilla, no una entidad financiera
Fig. 2 — El mecanismo de autoatención asigna a cada palabra un peso según su relevancia para la palabra que se procesa.

Cada palabra se representa con tres vectores: consulta (Q), clave (K) y valor (V). El producto QK⊤ mide su afinidad; la función softmax lo convierte en pesos que suman 1; y la salida es la media ponderada de los valores. Como todas las palabras se procesan a la vez, el entrenamiento se puede paralelizar, a diferencia de las RNN.

import numpy as np def autoatencion(Q, K, V): d_k = Q.shape[-1] puntuaciones = Q @ K.T / np.sqrt(d_k) # similitud entre palabras pesos = np.exp(puntuaciones) pesos = pesos / pesos.sum(axis=-1, keepdims=True) # softmax por fila return pesos @ V, pesos rng = np.random.default_rng(0) X = rng.normal(size=(3, 4)) # 3 palabras, 4 dimensiones salida, pesos = autoatencion(X, X, X) print(pesos.round(2)) # cada fila suma 1: a quién atiende cada palabra

GPT (generative pre-trained transformer) es un transformer entrenado para predecir y generar secuencias de texto. Aunque no modela de forma explícita la distribución de los datos como otros modelos generativos, produce texto que reproduce esa distribución y se adapta bien con ajuste fino: por eso se considera generativo.

Redes adversariales (GAN)

Una GAN combina dos submodelos: un generador, que crea muestras falsas, y un discriminador, que las compara con muestras reales y asigna a cada una la probabilidad de ser auténtica. Es una competición amistosa: el generador intenta engañar y el discriminador, no dejarse engañar; ambos mejoran. Son especialmente útiles para generar imágenes y vídeo.

ruidoaleatorioGeneradorcrea muestras falsasmuestrafalsamuestrasrealesDiscriminador¿real o falsa?p = 0,31la puntuación vuelve al generador: los dos mejoran compitiendo
Fig. 3 — Una red generativa adversarial (GAN): generador y discriminador entrenan en competencia.

Autocodificadores (VAE)

Un VAE (variational autoencoder) sigue un esquema codificador-decodificador. El codificador comprime la entrada en un espacio abstracto simplificado, el espacio latente, que captura sus características esenciales; el decodificador reconstruye los datos a partir de él. La diferencia con un autocodificador normal es que representa cada dato como una distribución de probabilidad: por eso puede generar un abanico de salidas para una misma entrada, reflejando la incertidumbre de los datos reales. Se usan en arte y diseño creativo.

imagen deentradacodificadorespacio latentemedia μ y dispersión σdecodificadorimagennuevamuestrear puntos distintos del espacio latente produce variaciones con características parecidas
Fig. 4 — Un autocodificador variacional (VAE) comprime los datos en un espacio latente probabilístico y los reconstruye.

Modelos de difusión

Un modelo de difusión es un modelo generativo probabilístico que aprende a eliminar ruido: durante el entrenamiento, las imágenes se van degradando con ruido hasta quedar irreconocibles, y el modelo aprende a recorrer el camino inverso. Para generar, parte de ruido puro y lo va limpiando paso a paso, guiado por el prompt. También restaura fotos antiguas o de baja calidad.

imagen originalruido 25 %ruido 50 %ruido 75 %ruido puro→ entrenamiento: se añade ruido paso a paso← generación: el modelo aprende a quitar el ruido paso a paso
Fig. 5 — Un modelo de difusión aprende a invertir un proceso de ruido para generar imágenes nuevas.

En la fórmula, x0 es la imagen original, ε es ruido aleatorio y ᾱt controla cuánto queda de la imagen en el paso t: cerca de 1 al principio, cerca de 0 al final. El modelo aprende a predecir ε para poder restarlo.

Comparativa

ArquitecturaEnfoque de entrenamientoUsos típicos
RNNDiseño con bucle sobre secuenciasLenguaje, voz, series temporales
TransformerAutoatención, procesamiento en paraleloTexto (GPT, BERT), traducción
GANCompetición generador–discriminadorImagen y vídeo
VAECaracterísticas en un espacio latente probabilísticoArte y diseño, variaciones
DifusiónPropiedades estadísticas: aprender a quitar ruidoImágenes de alta calidad, restauración

Para la plataforma de vídeo del caso inicial, lo razonable sería un modelo de difusión (o una GAN) guiado por un transformer que interprete el texto del usuario.

Aprendizaje por refuerzo

El aprendizaje por refuerzo clásico estudia cómo un agente (un sistema de IA o un robot) interactúa con su entorno para maximizar una recompensa. Los modelos generativos usan técnicas de refuerzo durante el entrenamiento para ajustar y optimizar su rendimiento en tareas concretas; el caso más conocido, el aprendizaje por refuerzo a partir de retroalimentación humana, se ve en el módulo siguiente.

Error común

Pensar que «generativo» equivale a «transformer». Los transformers dominan el texto, pero las imágenes de alta calidad suelen venir de modelos de difusión, y las GAN y los VAE siguen siendo útiles en otros contextos. Elegir arquitectura depende del tipo de dato y de la tarea.

Mini-quiz · Arquitecturas

1. ¿Qué permite a una RNN recordar entradas anteriores?

2. ¿Por qué los transformers se entrenan de forma más eficiente que las RNN?

3. ¿Qué modelo aprende a eliminar ruido para generar imágenes?

Ejercicio 2.1 · Elegir arquitectura

Propón la arquitectura más adecuada y justifica: (a) predecir la próxima lectura de un sensor meteorológico a partir de las últimas 24 horas; (b) generar retratos realistas de personas que no existen; (c) producir muchas variaciones de un logotipo; (d) un asistente que responde preguntas en lenguaje natural.

Solución

(a) RNN (o un transformer para series temporales): datos secuenciales con dependencias temporales. (b) GAN o difusión: imágenes realistas de alta calidad. (c) VAE: muestrear puntos cercanos del espacio latente da variaciones con características parecidas. (d) Transformer tipo GPT: comprensión del contexto y generación de texto.

Ejercicio 2.2 · Calcular la autoatención

Con dos palabras cuyas puntuaciones de afinidad (ya divididas por √dk) para la primera palabra son [2, 0], calcula los pesos de atención con softmax.

Solución

La primera palabra dedica el 88 % de su atención a sí misma y el 12 % a la segunda. Si las puntuaciones fueran iguales, los pesos serían 0,5 y 0,5.

Objetivo del módulo

Comprender cómo ha evolucionado la IA generativa aplicada al procesamiento del lenguaje natural (PLN) y por qué los modelos de lenguaje grandes (LLM, large language models) son su pieza central. Al terminar, el lector sabrá:

Un asistente bancario

Un banco encarga a su ingeniero de IA un asistente virtual que converse con los clientes sobre sus cuentas y opciones de inversión. Para que la conversación sea útil, el sistema tiene que comprender el lenguaje humano y responder de forma indistinguible de una persona. Las arquitecturas de IA generativa aportan tres capacidades clave:

Evolución en el PLN

Reglasgramática y reglaslingüísticas fijasprecisas, rígidasAprendizajeautomáticométodos estadísticossobre corpusmás flexiblesAprendizajeprofundoredes neuronales congrandes datosmás maticesTransformersautoatención sobresecuenciascontexto y paralelismocada etapa gana capacidad para captar contexto y matices del lenguaje
Fig. 1 — Evolución de la IA generativa aplicada al procesamiento del lenguaje natural.

Avances por tarea

TareaQué mejora
Traducción automáticaConversiones más precisas y conscientes del contexto
Chatbots y asistentesConversación natural, con empatía y personalización
Análisis de sentimientoCapta expresiones sutiles del lenguaje
Resumen de textosReconoce el significado central y su importancia

Qué es un LLM

Un LLM es un modelo fundacional que usa IA y aprendizaje profundo con enormes conjuntos de datos (sitios web, libros…) para generar texto, traducir y crear contenido. Se llaman «grandes» por dos razones: el tamaño de los datos de entrenamiento, que puede llegar a petabytes, y el número de parámetros, que alcanza miles de millones. Los parámetros son las variables que definen el comportamiento del modelo y se ajustan durante el entrenamiento; por ejemplo, el peso que se asigna a palabras como «feliz» o «triste» al aprender sobre emociones.

Su habilidad básica es predecir la siguiente palabra (más exactamente, el siguiente token) de una secuencia:

Gracias a ese entrenamiento masivo, comprenden las estructuras y contextos del lenguaje, captan sus matices y pueden producir contenido creativo con muy poco entrenamiento específico.

Tres familias de LLM

Solo codificadorBERTcodificadorentiende el contexto de cadapalabra en ambas direccionesUSOS TÍPICOSsentimiento · preguntasSolo decodificadorGPTdecodificadorpredice la siguiente palabra apartir de las anterioresUSOS TÍPICOSchatbots · generación de textoCodificador-decodificadorBART · T5codificadordecodificadorcodifica la entrada y genera untexto nuevoUSOS TÍPICOStraducción · resumen
Fig. 2 — Las tres familias de arquitecturas transformer y sus modelos de referencia.
from transformers import pipeline # Solo codificador (BERT): comprender, p. ej. completar una palabra oculta relleno = pipeline("fill-mask", model="bert-base-uncased") print(relleno("The bank of the [MASK] was full of fish.")[0]["token_str"]) # Solo decodificador (GPT-2): generar texto continuando la entrada generador = pipeline("text-generation", model="gpt2") print(generador("Generative AI is", max_new_tokens=20)[0]["generated_text"])

GPT frente a ChatGPT

AspectoGPTChatGPT
ObjetivoTareas diversas de generación de textoGenerar conversaciones
Entrenamiento y ajustePrincipalmente aprendizaje supervisadoCombinación de aprendizaje supervisado y por refuerzo
Retroalimentación humanaNo la incorporaUsa RLHF en el ajuste fino

El RLHF (reinforcement learning from human feedback, aprendizaje por refuerzo a partir de retroalimentación humana) usa valoraciones de personas sobre las respuestas para entrenar un modelo de recompensa, que después guía el ajuste del LLM hacia respuestas más útiles. La mayoría de los LLM se basan en la arquitectura transformer.

Versatilidad de los LLM

corpus enorme(webs, libros…)petabytesPreentrenamientopredecir la siguientepalabra; miles demillones de parámetrosmodelofundacionalAjuste finodatos mucho más pequeñosde una tarea: p. ej. clasificarproductos de una tiendael conocimiento general se reutiliza; solo hace falta adaptarlo a la tarea
Fig. 3 — Los LLM se preentrenan una vez con datos generales y después se ajustan a tareas concretas.

Un LLM se puede preentrenar con fines generales y después ajustar con un conjunto de datos mucho más pequeño. Por ejemplo, un modelo preentrenado en clasificación genérica de texto se ajusta para una tienda, de modo que clasifique productos en categorías como electrónica o ropa a partir de su descripción.

Dos advertencias: los LLM pueden generar información que suena correcta pero no lo es, y pueden reproducir sesgos; hay que valorar el impacto social de lo que generan.

Esta estimación explica por qué los modelos grandes necesitan hardware especializado: solo cargar los pesos de un modelo de 7000 millones de parámetros en precisión de 16 bits ocupa unos 14 GB de memoria.

Mini-quiz · IA generativa para el PLN

1. ¿Por qué se llaman «grandes» los LLM?

2. Para un análisis de sentimiento que exige comprender cada palabra en su contexto, ¿qué familia encaja mejor?

3. ¿Qué distingue el entrenamiento de ChatGPT del de GPT?

Ejercicio 3.1 · Asignar modelo a tarea

Para el asistente bancario, elige familia de LLM para: (a) clasificar el sentimiento de las reseñas de clientes; (b) redactar respuestas a sus preguntas; (c) resumir extractos de contratos largos.

Solución

(a) Solo codificador (BERT): comprensión y clasificación. (b) Solo decodificador (GPT): generación conversacional. (c) Codificador-decodificador (BART o T5): leer un texto completo y generar otro distinto, el resumen. En la práctica, un LLM decodificador grande también resume bien, pero el codificador-decodificador es la opción clásica.

Ejercicio 3.2 · Memoria de un modelo

Estima la memoria necesaria solo para los pesos de un modelo de 13 000 millones de parámetros en precisión de 16 bits (2 bytes por parámetro) y en 8 bits (1 byte).

Solución

A eso hay que sumar la memoria para las activaciones y el contexto. Reducir la precisión (cuantizar) es una forma habitual de hacer caber un modelo en una GPU (unidad de procesamiento gráfico) más pequeña.

Objetivo del módulo

Entender qué son las alucinaciones de la IA, por qué se producen en los modelos de lenguaje grandes (LLM) y cómo reducir sus efectos. Al terminar, el lector sabrá:

Qué es una alucinación

Un LLM puede redactar con tono de autoridad sobre cualquier tema, pero a veces genera información que suena correcta y no lo es, o contenido sesgado. Se habla de alucinación cuando el modelo presenta como exacta una salida que las personas perciben como irreal, inexacta, irrelevante o sin sentido; el término viene de la analogía con las alucinaciones humanas.

Un caso conocido: ChatGPT afirmó falsamente que un alcalde australiano había sido condenado y encarcelado por soborno, cuando en realidad él había sido quien denunció el caso a las autoridades, y el alcalde llegó a preparar una demanda por difamación. Este tipo de incidentes es poco frecuente, pero muestra que las consecuencias pueden ser serias.

Causas y consecuencias

Causas• sesgos en los datos de entrenamiento• entrenamiento limitado• complejidad del modelo• falta de supervisión humanaProblemas• información inexacta• sesgos o información engañosa• entradas erróneas a sistemassensibles (salud, vehículos)Mitigación• datos de calidad y sin sesgos• evitar entradas manipuladas• evaluación y mejora continuas• ajuste fino con datos del dominio• supervisión humana y verificación• más contexto en el prompt
Fig. 1 — Por qué alucinan los LLM, qué problemas causa y cómo reducirlo.

Las alucinaciones están muy asociadas a los LLM. Influyen los sesgos de los datos, un entrenamiento limitado, la complejidad del modelo y la falta de supervisión humana. Además, una salida puede no basarse en ningún patrón aprendido de los datos. Las consecuencias van desde información inexacta o sesgada hasta errores graves: un resumen legal equivocado puede acabar en un litigio, y una entrada errónea es peligrosa en aplicaciones sensibles como la medicina o los vehículos autónomos.

Por qué son inevitables

Los LLM no comprenden el significado de las palabras como las personas: aprenden patrones estadísticos y predicen la palabra siguiente más probable. Una frase puede ser muy probable y a la vez falsa. Por eso las alucinaciones no se eliminan del todo, y lo más frustrante es que a menudo contienen errores sutiles, difíciles de detectar.

Cómo mitigarlas

En el modeloEn el uso
Eliminar sesgos y entrenar extensamente con datos de calidadEstar alerta: el modelo predice, no comprende
Evitar la manipulación de las entradasSupervisión humana para verificar hechos y pruebas continuas
Evaluar y mejorar el modelo de forma continuaDar más contexto en el prompt
Ajustar el modelo con datos del dominioPedir que admita cuando no sabe algo

Dar contexto concreto y permitir al modelo responder «no lo sé» es de las medidas más eficaces y baratas:

contexto = """Política de devoluciones (versión 2026): - Plazo: 30 días desde la entrega. - El producto debe estar sin usar y con su embalaje.""" prompt = f"""Responde SOLO con la información del contexto. Si la respuesta no está en el contexto, di «No lo sé». Contexto: {contexto} Pregunta: ¿Puedo devolver un producto usado después de 20 días?""" print(prompt) # este texto es el que se envía al modelo # más contexto y una salida explícita («No lo sé») reducen las alucinaciones

Con este prompt, el modelo debería responder que no: el producto está usado. Sin el contexto, podría inventar una política plausible.

Error común

Fiarse de una respuesta porque «suena segura». El tono de autoridad no indica exactitud: un LLM redacta con la misma fluidez un dato correcto que uno inventado. En cualquier uso con consecuencias (legal, médico, financiero), los hechos se verifican contra una fuente.

Mini-quiz · Alucinaciones

1. ¿Qué es una alucinación de la IA?

2. ¿Por qué no se pueden eliminar por completo?

3. ¿Qué medida reduce las alucinaciones sin reentrenar el modelo?

Ejercicio 4.1 · Detectar el riesgo

Ordena de mayor a menor riesgo por alucinación: (a) un LLM que sugiere títulos para entradas de blog; (b) un LLM que resume informes de laboratorio para pacientes; (c) un LLM que redacta borradores de correos que una persona revisa. Justifica.

Solución

(b) > (c) > (a). En (b) un dato inventado afecta a la salud y llega a una persona que no puede detectarlo. En (c) hay supervisión humana antes del envío. En (a) un error tiene poco impacto y es fácil de descartar.

Ejercicio 4.2 · Diseñar salvaguardas

Una asesoría quiere un asistente que responda preguntas sobre su normativa interna de 300 páginas. Propón tres medidas contra las alucinaciones.

Solución

(1) Recuperar los fragmentos pertinentes de la normativa e incluirlos en el prompt como contexto, con la instrucción de responder solo a partir de ellos. (2) Pedir que cite el artículo de origen y que diga «no lo sé» si no lo encuentra. (3) Mantener una evaluación continua con preguntas de respuesta conocida y revisión humana de las consultas delicadas.

Objetivo del módulo

Conocer las bibliotecas y herramientas que se usan para construir aplicaciones de IA generativa sobre lenguaje y saber para qué sirve cada una. Al terminar, el lector sabrá:

Un mapa por capas

Diseñar, desarrollar y desplegar aplicaciones de IA generativa para el procesamiento del lenguaje natural (PLN) exige entender muchas sutilezas del lenguaje. La buena noticia es que existe un ecosistema maduro de herramientas, que se puede ordenar por capas:

APLICACIÓNLangChainencadenar prompts, modelos y herramientas en aplicaciones con LLMMODELOSHugging FaceModel Hub · Transformers · Datasets · TokenizersMARCO DE APRENDIZAJE PROFUNDOPyTorch · TensorFlowtensores, autograd, entrenamiento; Keras y TFX en TensorFlowDATOSPydanticvalidar tipos y formatos con anotaciones de tipo; configuración
Fig. 1 — Mapa de las bibliotecas habituales en IA generativa para el lenguaje, por capas.

PyTorch

Marco de aprendizaje profundo de código abierto, desarrollado originalmente por el laboratorio de IA de Facebook (hoy Meta) y basado en Python. Destaca por su facilidad de uso, su flexibilidad y sus grafos de cómputo dinámicos: la estructura de la red puede cambiar durante la ejecución, lo que resulta intuitivo cuando la arquitectura debe adaptarse a entradas variables. Su sistema Autograd calcula los gradientes automáticamente. Tiene un ecosistema rico (por ejemplo, torchtext para datos de texto) y es especialmente apreciado en investigación y prototipado.

TensorFlow

Marco de código abierto de Google para aprendizaje automático y profundo. Su arquitectura es robusta y escalable, pensada para pasar con fluidez del prototipo a la producción a gran escala:

Se usa en análisis de sentimiento, clasificación de texto o traducción, y es una opción habitual para PLN a escala empresarial.

Hugging Face

Plataforma con bibliotecas de código abierto, modelos preentrenados y herramientas para agilizar el entrenamiento y el ajuste de modelos generativos. Su Model Hub aloja una enorme colección de modelos, sobre todo de PLN, compatibles con PyTorch y TensorFlow, con información de arquitectura, datos de entrenamiento y ejemplos de uso. Sus bibliotecas más útiles:

BibliotecaPara qué sirve
TransformersModelos preentrenados para generación, resumen, traducción, clasificación y preguntas y respuestas
DatasetsAcceder y compartir conjuntos de datos y métricas de evaluación en muchos idiomas
TokenizersTokenización rápida y versátil para modelos como BERT y GPT
from transformers import pipeline clasificador = pipeline("sentiment-analysis") print(clasificador("I love this course!")) # [{'label': 'POSITIVE', 'score': 0.99...}]

Se usa mucho en reconocimiento de entidades nombradas (clasificar nombres en categorías como personas o lugares), análisis de sentimiento y resumen.

LangChain

Marco de código abierto para desarrollar aplicaciones con LLM. Aporta herramientas de ingeniería de prompts (diseñar las entradas que guían el comportamiento del modelo) e integra modelos líderes como GPT, lo que facilita pasar del concepto a la implementación de chatbots o herramientas de análisis.

from langchain_core.prompts import PromptTemplate plantilla = PromptTemplate.from_template( "Eres un asistente bancario. Responde con claridad a: {pregunta}") print(plantilla.format(pregunta="¿Qué comisiones tiene mi cuenta?"))

Pydantic

Biblioteca de Python para analizar y validar datos mediante anotaciones de tipo. Con la clase BaseModel se definen modelos de datos y sus reglas; también gestiona configuración y variables de entorno. En una canalización de PLN garantiza la integridad de los datos antes de procesarlos, algo clave con conjuntos grandes y diversos.

from pydantic import BaseModel, Field, ValidationError class Ejemplo(BaseModel): texto: str = Field(min_length=1) etiqueta: int = Field(ge=0, le=1) # 0 = incorrecta, 1 = correcta datos = [{"texto": "He doesn't talk to me.", "etiqueta": 1}, {"texto": "", "etiqueta": 3}] for d in datos: try: print(Ejemplo(**d)) except ValidationError as e: print("descartado:", len(e.errors()), "errores")

El primer ejemplo pasa la validación; el segundo se descarta por dos motivos: texto vacío y etiqueta fuera del rango 0–1.

Cuál elegir

NecesidadHerramienta
Investigar y prototipar redes con flexibilidadPyTorch
Desplegar a gran escala con canalizaciones de producciónTensorFlow (TFX, Keras)
Usar o ajustar un modelo preentrenadoHugging Face Transformers
Construir una aplicación con prompts, modelos y herramientasLangChain
Asegurar que los datos tienen el formato correctoPydantic
Mini-quiz · Bibliotecas y herramientas

1. ¿Qué caracteriza a los grafos de cómputo dinámicos de PyTorch?

2. ¿Qué biblioteca de Hugging Face sirve para acceder a conjuntos de datos y métricas de evaluación?

3. Una canalización recibe ejemplos con etiquetas fuera de rango. ¿Qué herramienta los detecta antes de entrenar?

Ejercicio 5.1 · Montar la pila

Diseñas un chatbot que responde preguntas sobre manuales técnicos, usando un modelo abierto ajustado con datos propios. Indica qué herramienta usarías en cada capa.

Solución

Datos: Pydantic para validar los pares pregunta-respuesta y Hugging Face Datasets para gestionarlos. Modelo: un modelo del Model Hub cargado con Transformers. Entrenamiento: PyTorch (o TensorFlow) para el ajuste fino. Aplicación: LangChain para las plantillas de prompt y la conexión con la búsqueda en los manuales.

Ejercicio 5.2 · Ampliar la validación

Amplía el modelo de Pydantic del ejemplo para que también exija un idioma de dos letras («es», «en», «fr»…) y rechace textos de más de 500 caracteres.

Solución
from pydantic import BaseModel, Field class Ejemplo(BaseModel): texto: str = Field(min_length=1, max_length=500) etiqueta: int = Field(ge=0, le=1) idioma: str = Field(pattern=r"^[a-z]{2}$") # «es», «en», «fr»… print(Ejemplo(texto="Hola", etiqueta=1, idioma="es"))

El patrón ^[a-z]{2}$ exige exactamente dos letras minúsculas; max_length limita la longitud del texto.

Objetivo del módulo

Entender cómo se convierte el texto en unidades que un modelo puede procesar. Al terminar, el lector sabrá:

Qué es tokenizar

Para analizar el sentimiento de las opiniones de los usuarios, un modelo tiene que identificar palabras como «bueno» o «malo», y para eso hay que descomponer el texto en partes con significado. Dividir una frase en piezas más pequeñas, los tokens, se llama tokenización; el programa que lo hace es el tokenizador. Por ejemplo, «IBM taught me tokenization» puede dar los tokens IBM, taught, me y tokenization. Cada modelo usa su propio tipo de tokens.

Tres métodos

Frase: «Unicorns are unbelievable»Por palabras3 tokensUnicornsareunbelievableconserva el significado · vocabulario enorme; «unicorn» y «unicorns» son tokens distintosPor caracteres23 tokens (sin espacios)Unicornsareunbelie…vocabulario mínimo · secuencias largas y caracteres sin significado propioPor subpalabras6 tokensUnicornsareunbelievablepalabras frecuentes enteras, raras divididas en partes con significado
Fig. 1 — Los tres métodos de tokenización aplicados a la misma frase (división de subpalabras ilustrativa).
MétodoVentajaInconveniente
Por palabrasConserva el significadoVocabulario enorme; «unicorn» y «unicorns» son tokens distintos
Por caracteresVocabulario muy pequeñoUn carácter aporta poca información; secuencias largas y más cómputo
Por subpalabrasCombina lo mejor de ambosRequiere aprender cómo dividir (un algoritmo entrenado)

Por palabras

Bibliotecas como NLTK (Natural Language Toolkit) y spaCy dividen bien las frases, pero tratan las formas de una misma palabra como tokens distintos, lo que dificulta algunas tareas de PLN (procesamiento del lenguaje natural).

import spacy nlp = spacy.load("en_core_web_sm") texto = "Unicorns are real. I saw a unicorn yesterday. I couldn't see it today." print([t.text for t in nlp(texto)]) import nltk from nltk.tokenize import word_tokenize nltk.download("punkt_tab") print(word_tokenize(texto)) # ambos separan "could" + "n't" y tratan "Unicorns" y "unicorn" como tokens distintos

Por subpalabras

Las palabras frecuentes se quedan enteras y las raras se dividen en subpalabras con significado: «unbelievable» puede convertirse en un + believ + able. Tres algoritmos habituales:

from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained("bert-base-uncased") print(tokenizer.tokenize("IBM taught me tokenization.")) # ['ibm', 'taught', 'me', 'token', '##ization', '.']
from transformers import XLNetTokenizer tokenizer = XLNetTokenizer.from_pretrained("xlnet-base-cased") print(tokenizer.tokenize("IBM taught me tokenization.")) # ['▁IBM', '▁taught', '▁me', '▁token', 'ization', '.']

En la salida de XLNet, ▁token empieza una palabra nueva (iba precedida de un espacio) e ization no lleva prefijo porque continúa la anterior sin espacio.

Vocabulario e índices

El modelo no trabaja con texto, sino con números. Tras tokenizar se construye un vocabulario que asigna a cada token un índice entero único. En PyTorch, la biblioteca torchtext lo hacía con get_tokenizer y build_vocab_from_iterator; el token especial <unk> representa las palabras que no están en el vocabulario, y get_stoi() devuelve el diccionario de palabra a índice.

from torchtext.data.utils import get_tokenizer from torchtext.vocab import build_vocab_from_iterator dataset = [(1, "Introduction to NLP"), (2, "Basics of PyTorch"), (1, "NLP Techniques for Text Classification")] tokenizer = get_tokenizer("basic_english") def yield_tokens(data_iter): for _, text in data_iter: yield tokenizer(text) vocab = build_vocab_from_iterator(yield_tokens(dataset), specials=["<unk>"]) vocab.set_default_index(vocab["<unk>"]) # palabra desconocida → <unk> print(vocab(["introduction", "to", "nlp"]))

A tener en cuenta

torchtext dejó de desarrollarse en 2024 (su última versión es la 0.18) y no es compatible con las versiones recientes de PyTorch. Para proyectos nuevos se usan los tokenizadores de Hugging Face o una implementación propia, que es sencilla: el siguiente código reproduce todo el proceso con Python estándar.

Tokens especiales y relleno

1. Texto«IBM taught me tokenization»tokenizador2. Tokens + especiales<bos>ibmtaughtmetokenization<eos><pad><pad>vocabulario (stoi)3. Índices2711913311torch.tensor4. Tensor listo para el modelotensor([ 2, 7, 11, 9, 13, 3, 1, 1])Tokens especiales<bos> inicio de secuencia<eos> fin de secuencia<pad> relleno hasta lalongitud máxima<unk> palabra desconocidaíndices ilustrativos: dependen del vocabulario construido
Fig. 2 — De texto a tensor: tokenizar, añadir tokens especiales, asignar índices y convertir en tensor.

Muchas aplicaciones añaden tokens especiales: <bos> al principio y <eos> al final de cada frase (inicio y fin de secuencia). Como los modelos procesan lotes de frases de igual longitud, se rellenan las más cortas con <pad> hasta la longitud de la más larga.

import re from collections import Counter def tokenizar(texto): # equivalente a "basic_english" return re.findall(r"\w+|[^\w\s]", texto.lower()) frases = ["IBM taught me tokenization", "Special tokenizers are ready", "hi!"] tokens = [["<bos>"] + tokenizar(f) + ["<eos>"] for f in frases] especiales = ["<pad>", "<unk>", "<bos>", "<eos>"] frecuencias = Counter(t for frase in tokens for t in frase if t not in especiales) itos = especiales + [t for t, _ in frecuencias.most_common()] stoi = {t: i for i, t in enumerate(itos)} longitud = max(len(t) for t in tokens) rellenas = [t + ["<pad>"] * (longitud - len(t)) for t in tokens] indices = [[stoi.get(t, stoi["<unk>"]) for t in frase] for frase in rellenas] print(rellenas[2]) print(indices[2])

Error común

Construir el vocabulario con un tokenizador y aplicar después otro distinto, o usar el tokenizador de un modelo con otro modelo. Los índices dejan de corresponder a los tokens con que se entrenó y el modelo recibe «palabras» equivocadas sin dar ningún error. Cada modelo preentrenado se usa con su propio tokenizador.

Mini-quiz · Tokenización

1. ¿Qué inconveniente tiene la tokenización por palabras?

2. En la salida de BERT, ¿qué indica ##ization?

3. ¿Para qué sirve el token <pad>?

Ejercicio 6.1 · Tokenizar a mano

Tokeniza «Tokenizers are unbelievable» por palabras, por caracteres (cuenta solo cuántos tokens) y con una división por subpalabras plausible.

Solución

Por palabras: Tokenizers, are, unbelievable (3 tokens). Por caracteres: 27 tokens si se cuentan los espacios, 25 sin ellos. Por subpalabras, una división plausible: token, ##izers, are, un, ##believ, ##able. La división real depende del vocabulario aprendido por cada tokenizador.

Ejercicio 6.2 · Contar el relleno

Un lote tiene tres frases de 4, 7 y 5 tokens (ya con <bos> y <eos>). ¿Cuántos <pad> se añaden en total y qué fracción del lote es relleno?

Solución

Casi una cuarta parte del lote es relleno. Por eso a menudo se agrupan en un mismo lote frases de longitud parecida.

Objetivo del módulo

Aprender a preparar y cargar datos de texto de forma eficiente para entrenar modelos generativos con PyTorch. Al terminar, el lector sabrá:

El problema de partida

Para entrenar el modelo de una aplicación de traducción automática hay que manejar enormes conjuntos de datos: cargarlos, barajarlos y agruparlos a mano es lento y propenso a errores. Un cargador de datos (data loader) se encarga de preparar y servir esos datos; marcos como PyTorch y TensorFlow tienen clases dedicadas a ello.

Para qué sirve

Dataset y particiones

Un conjunto de datos (dataset) es una colección de muestras con sus etiquetas. Por ejemplo, frases etiquetadas como gramaticalmente correctas o incorrectas:

TextoEtiqueta
«Fae's a fickle friend, Harry.»Correcta
«He doesn't talk to me.»Correcta
«Harry want to go home.»Incorrecta

Se divide en tres partes: entrenamiento (para aprender), validación (para ajustar y validar parámetros) y prueba (para medir el rendimiento en condiciones reales). A veces «entrenamiento» y «validación» se usan como sinónimos, pero cumplen funciones distintas.

Dataset y DataLoader

</>Dataset__init__ guarda los datos__len__ nº de muestras__getitem__(idx)una muestraDataLoaderbatch_size=2shuffle=Truecollate_fn=…collate_fn (por lote)1tokenizar cada frase2convertir tokens en índices3rellenar con pad_sequence4devolver un tensorBucle de entrenamiento: for lote in dataloader: → tensor (tamaño_lote × longitud_máxima)el Dataset queda intacto; las transformaciones se hacen al vuelo, lote a lote
Fig. 1 — Dataset, DataLoader y función de agrupación: cómo llegan los datos al modelo por lotes.

Un Dataset personalizado hereda de torch.utils.data.Dataset e implementa tres métodos: __init__ (recibe y guarda los datos), __len__ (número de muestras) y __getitem__ (devuelve la muestra de un índice). Se accede a él como a una lista: dataset[0], dataset[1]…

El DataLoader es un iterador (un objeto que se puede recorrer, con los métodos __iter__ y __next__) que carga, baraja y agrupa los datos. batch_size fija cuántas muestras van en cada lote, y shuffle=True las baraja en cada pasada para que el modelo no aprenda patrones basados en el orden.

from torch.utils.data import Dataset, DataLoader class CustomDataset(Dataset): def __init__(self, sentences): self.sentences = sentences # guarda los datos def __len__(self): return len(self.sentences) # número de muestras def __getitem__(self, idx): return self.sentences[idx] # una muestra por índice sentences = ["Fae's a fickle friend, Harry.", "He doesn't talk to me.", "Harry want to go home.", "You are awesome!"] dataset = CustomDataset(sentences) print(dataset[0]) loader = DataLoader(dataset, batch_size=2, shuffle=True) for lote in loader: print(lote) # listas de 2 frases, en orden aleatorio

La función de agrupación

En la mayoría de las aplicaciones de PLN (procesamiento del lenguaje natural), las transformaciones se hacen en la función de agrupación (collate_fn), que recibe la lista de muestras de un lote y la convierte en un tensor: tokenizar, convertir tokens en índices, igualar longitudes y crear el tensor. Así el conjunto de datos original queda intacto.

Como las frases tokenizadas tienen longitudes distintas y un tensor necesita filas iguales, se usa pad_sequence, que rellena cada secuencia hasta la longitud de la más larga del lote; padding_value=0 indica el valor de relleno.

# continúa el código anterior (sentences, dataset, DataLoader) import re import torch from torch.nn.utils.rnn import pad_sequence def tokenizar(texto): return re.findall(r"\w+|[^\w\s]", texto.lower()) vocab = {"<pad>": 0, "<unk>": 1} for s in sentences: for t in tokenizar(s): vocab.setdefault(t, len(vocab)) def collate_fn(lote): tensores = [torch.tensor([vocab.get(t, 1) for t in tokenizar(s)]) for s in lote] return pad_sequence(tensores, batch_first=True, padding_value=0) loader = DataLoader(dataset, batch_size=2, shuffle=True, collate_fn=collate_fn) for x in loader: print(x.shape) # (2, longitud del más largo del lote)

batch_first

batch_first=Trueforma (2, 10)••••••••••••••••0000lote = 2longitud máx. = 10batch_first=Falseforma (10, 2)•••••••••••••0•0•0•0longitud = 10lote = 2cada fila es una frase; los 0 son relleno
Fig. 2 — pad_sequence iguala la longitud de las secuencias; batch_first decide qué dimensión va primero.

Con batch_first=True, la primera dimensión del tensor es el tamaño del lote: forma (lote, longitud). Con el valor por defecto, False, la primera dimensión es la longitud de la secuencia: forma (longitud, lote). Muchos modelos esperan una de las dos; un error aquí no siempre falla, pero hace que el modelo lea los datos traspuestos.

import torch from torch.nn.utils.rnn import pad_sequence a = torch.tensor([4, 5, 6, 7, 8, 9]) b = torch.tensor([4, 5, 6]) print(pad_sequence([a, b], batch_first=True).shape) # torch.Size([2, 6]) print(pad_sequence([a, b], batch_first=False).shape) # torch.Size([6, 2])

Error común

Hacer las transformaciones dentro del Dataset modificando la lista original, o rellenar todo el conjunto a la longitud de la frase más larga de todo el corpus. Lo primero impide reutilizar los datos con otro tokenizador; lo segundo desperdicia memoria. La función de agrupación rellena solo lo necesario en cada lote.

Mini-quiz · Cargadores de datos

1. ¿Qué tres métodos implementa un Dataset personalizado de PyTorch?

2. ¿Para qué sirve shuffle=True?

3. Con dos secuencias de 6 y 3 tokens, ¿qué forma devuelve pad_sequence(..., batch_first=True)?

Ejercicio 7.1 · Contar lotes

Un conjunto de entrenamiento tiene 1000 frases y se usa batch_size=32. ¿Cuántos lotes hay por pasada y cuántas frases tiene el último?

Solución

Si el último lote incompleto molesta (por ejemplo, con normalización por lotes), se puede descartar con drop_last=True.

Ejercicio 7.2 · Añadir etiquetas

Modifica el ejemplo para que cada muestra sea una pareja (frase, etiqueta) y la función de agrupación devuelva el tensor de frases rellenas y un tensor con las etiquetas.

Solución
# continúa el código anterior (tokenizar, vocab, pad_sequence) pares = [("He doesn't talk to me.", 1), ("Harry want to go home.", 0)] def collate_fn(lote): frases, etiquetas = zip(*lote) x = pad_sequence([torch.tensor([vocab.get(t, 1) for t in tokenizar(s)]) for s in frases], batch_first=True, padding_value=0) return x, torch.tensor(etiquetas) loader = DataLoader(pares, batch_size=2, collate_fn=collate_fn) x, y = next(iter(loader)) print(x.shape, y) # torch.Size([2, 8]) tensor([1, 0])

zip(*lote) separa las frases y las etiquetas del lote; las etiquetas no necesitan relleno porque ya tienen la misma longitud, un número por muestra.

Objetivo del módulo

Saber preparar datos de calidad, diversos, actualizados y obtenidos de forma ética para entrenar modelos de lenguaje grandes (LLM) sólidos e inclusivos. Al terminar, el lector sabrá:

Por qué importan los datos

Cuanto más sofisticados son los modelos, más importa disponer de datos bien seleccionados: un LLM aprende lo que ve, con sus errores, lagunas y sesgos. Los cuatro pilares de un buen conjunto de datos son:

LLM eficazCalidad• reducir ruido: erratas, etiquetas de foro• coherencia de nombres y términos• etiquetado con guías clarasDiversidad• grupos demográficos variados• fuentes equilibradas: noticias,redes, literatura, técnica• idiomas, dialectos y regionesActualización• vocabulario nuevo («criptomoneda»)• normas sociales que cambian• reentrenar con datos recientesÉtica• anonimizar datos personales• incluir voces marginadas• transparencia sobre las fuentes
Fig. 1 — Los cuatro pilares de un buen conjunto de datos para entrenar un LLM.

Calidad

La calidad abarca la exactitud, la coherencia y la integridad de los datos; los datos pobres introducen ruido que reduce la precisión y la fiabilidad del modelo.

import re def limpiar(texto): texto = re.sub(r"\[(quote|/quote|img)[^\]]*\]", " ", texto) # etiquetas de foro texto = re.sub(r"[\w.+-]+@[\w-]+\.[\w.]+", "<EMAIL>", texto) # anonimizar return re.sub(r"\s+", " ", texto).strip() corpus = ["[quote]Hola[/quote] escríbeme a ana@ejemplo.com", "Hola escríbeme a luis@ejemplo.org", "Texto técnico sobre redes neuronales"] vistos, limpio = set(), [] for doc in map(limpiar, corpus): clave = doc.lower() if clave not in vistos: # eliminar duplicados exactos vistos.add(clave) limpio.append(doc) print(limpio)

Tras anonimizar los correos, los dos primeros documentos resultan idénticos y el segundo se elimina como duplicado: limpieza, anonimización y deduplicación van juntas.

Diversidad

Un conjunto diverso hace el modelo más inclusivo: responde con precisión a aportaciones culturales, demográficas y regionales distintas. Sin diversidad, el modelo refleja puntos de vista estrechos y desarrolla sesgos involuntarios.

Actualización periódica

El lenguaje evoluciona: aparecen términos nuevos («selfi», «criptomoneda») y cambian los patrones de uso y las normas sociales. Un LLM entrenado con datos desfasados puede reforzar sin querer normas o estereotipos obsoletos. Actualizar los datos y reentrenar el modelo periódicamente lo mantiene alineado con el conocimiento y las normas actuales.

Ética en la recogida

Centrarse en la calidad, la diversidad y la ética produce LLM más precisos, inclusivos y responsables, y contribuye a cerrar brechas de equidad y representación en la IA.

Error común

Pensar que «más datos» compensa la mala calidad. Duplicar contenido de baja calidad o de una sola fuente amplifica sus sesgos y sus errores; a menudo, un conjunto más pequeño y limpio produce un modelo mejor que uno enorme sin depurar.

Mini-quiz · Calidad y diversidad de datos

1. ¿Qué práctica corresponde a la reducción de ruido?

2. ¿Qué riesgo tiene entrenar un LLM con datos de una sola fuente o perspectiva?

3. ¿Por qué hay que actualizar periódicamente los datos?

Ejercicio 8.1 · Auditar un corpus

Un corpus para un asistente de soporte técnico procede en un 85 % de un único foro en inglés de 2018, con hilos repetidos y direcciones de correo de usuarios. Señala cuatro problemas y una acción para cada uno.

Solución

(1) Fuente única: añadir documentación oficial, manuales y tickets. (2) Un solo idioma: incorporar textos en los idiomas de los usuarios. (3) Datos desfasados: añadir contenido reciente sobre productos actuales. (4) Duplicados y datos personales: deduplicar y anonimizar correos y nombres. También conviene eliminar las etiquetas propias del foro.

Ejercicio 8.2 · Equilibrar fuentes

Un corpus de 2 millones de documentos tiene 1,4 millones de redes sociales, 400 000 de noticias y 200 000 técnicos. Calcula la proporción de cada fuente y cuántos documentos técnicos harían falta para que supongan el 25 % sin quitar nada.

Solución

Harían falta 400 000 documentos técnicos adicionales. Una alternativa más barata es reponderar: muestrear los documentos técnicos con más frecuencia durante el entrenamiento.

Objetivo del módulo

Consolidar el vocabulario y las herramientas del curso y comprobar el dominio global con preguntas que integran varios módulos. Al terminar, el lector sabrá:

Glosario

Términos del curso en orden alfabético, más algunos de uso habitual en el sector.

TérminoDefinición
Ajuste finoAdaptar un modelo preentrenado para mejorar su rendimiento en una tarea o un conjunto de datos concreto, con respuestas más precisas y pertinentes (fine-tuning).
AlucinaciónSalida presentada como exacta que es irreal, inexacta, irrelevante o sin sentido.
AutoatenciónMecanismo que pondera la relevancia de cada elemento de la secuencia para cada otro elemento.
BARTTransformers bidireccionales y autorregresivos: LLM de secuencia a secuencia con arquitectura codificador-decodificador; codifica para comprender el contexto y decodifica para generar texto.
BERTRepresentaciones codificadoras bidireccionales de transformers: LLM solo codificador, excelente para entender el contexto de una palabra en la frase, clave en el análisis de sentimiento.
Cargador de datosComponente que agrupa en lotes y baraja los datos de forma eficiente para entrenar redes neuronales; permite preprocesar al vuelo y optimizar la memoria (data loader).
Conjunto de datosColección de muestras con sus etiquetas (data set).
DALL-EModelo de OpenAI que genera imágenes complejas y creativas a partir de descripciones de texto mediante aprendizaje profundo.
Espacio latenteRepresentación comprimida que captura las características esenciales de los datos.
Función de agrupacióncollate_fn: define cómo se agrupan las muestras de un lote; tokeniza, convierte en índices, rellena y crea el tensor.
GANRed generativa adversarial: genera imágenes a partir de vectores aleatorios o imágenes semilla con un generador y un discriminador que compiten.
GPTTransformer generativo preentrenado: modelo basado en transformers, preentrenado con grandes cantidades de texto, que predice y genera secuencias de texto.
Hugging FacePlataforma con una biblioteca de código abierto de modelos preentrenados y herramientas para entrenar y ajustar modelos generativos.
IA generativaModelos de aprendizaje profundo que generan texto, imágenes y otros contenidos de alta calidad aplicando los patrones y estructuras aprendidos de sus datos.
IteradorObjeto que se puede recorrer en un bucle; tiene los métodos __iter__() y __next__().
LangChainMarco de código abierto que agiliza el desarrollo de aplicaciones con LLM.
LLMModelo de lenguaje grande: modelo fundacional que, con aprendizaje profundo y enormes conjuntos de datos, genera y traduce texto y crea contenidos; «grande» por el tamaño de sus datos y su número de parámetros.
Modelo de difusiónModelo generativo probabilístico, habitual para imágenes, que aprende a eliminar el ruido o reconstruir ejemplos distorsionados de sus datos de entrenamiento.
Modelo fundacionalModelo grande preentrenado con datos generales que sirve de base para muchas tareas mediante ajuste fino.
NLTKNatural Language Toolkit: biblioteca de Python de PLN para tokenizar y procesar texto.
ParámetroVariable interna (un peso) que define el comportamiento del modelo y se ajusta durante el entrenamiento.
PLNProcesamiento del lenguaje natural: rama de la IA que estudia la interacción entre personas y ordenadores en lenguaje humano, para comprenderlo y generar texto pertinente.
PydanticBiblioteca de Python que agiliza el manejo de datos: los analiza y los valida.
PyTorchMarco de aprendizaje automático de código abierto, mantenido por su comunidad, con gran soporte para aprendizaje profundo y cálculo con tensores.
RellenoAñadir valores (<pad> o 0) para igualar la longitud de las secuencias de un lote.
RLHFAprendizaje por refuerzo a partir de retroalimentación humana, con un modelo de recompensa.
RNNRedes neuronales recurrentes: trabajan con datos secuenciales o series temporales, problemas con un orden natural o temporal.
SentencePieceAlgoritmo de tokenización por subpalabras que segmenta el texto en partes manejables y asigna a cada una un identificador único.
spaCyBiblioteca de PLN de código abierto con herramientas de tokenización y de representaciones vectoriales de palabras (embeddings).
T5Transformer de transferencia texto a texto: LLM que trata toda tarea como texto de entrada y salida; codifica para comprender y decodifica para generar.
TensorFlowMarco de aprendizaje automático de código abierto con herramientas y bibliotecas para desarrollar y desplegar modelos.
TokenizaciónDividir el texto en piezas más pequeñas, los tokens, que ayudan al modelo a entenderlo mejor.
TokenizadorPrograma que divide el texto en tokens individuales.
Tokens especiales<bos>, <eos>, <pad> y <unk>: inicio, fin, relleno y palabra desconocida.
TransformersArquitecturas de aprendizaje profundo basadas en mecanismos de atención; procesan secuencias con autoatención y sirven para generar, traducir y clasificar texto y para tareas multimodales.
UnigramAlgoritmo de tokenización por subpalabras que parte de una lista amplia de posibilidades y la reduce según su frecuencia en el texto.
VAEAutocodificadores variacionales: el codificador comprime los datos en un espacio abstracto simplificado y el decodificador los recrea a partir de él.
VocabularioCorrespondencia entre cada token y un índice entero único.
WaveNetModelo generativo de audio, usado por ejemplo en síntesis de voz.
WordPieceAlgoritmo de tokenización por subpalabras que valora las ventajas e inconvenientes de dividir o fusionar dos símbolos.

Trucos: tokenizar

Tokenización por palabras con NLTK y spaCy; las dos tratan «Unicorns» y «unicorn» como tokens distintos y separan «could» de «n't».

import nltk from nltk.tokenize import word_tokenize nltk.download("punkt_tab") # modelos de tokenización de NLTK texto = "Unicorns are real. I saw a unicorn yesterday. I couldn't see it today." print(word_tokenize(texto)) import spacy nlp = spacy.load("en_core_web_sm") # modelo pequeño de inglés print("Tokens:", [token.text for token in nlp(texto)])

Tokenización por subpalabras: BertTokenizer usa WordPiece; XLNetTokenizer, SentencePiece con un modelo Unigram.

from transformers import BertTokenizer, XLNetTokenizer bert = BertTokenizer.from_pretrained("bert-base-uncased") # WordPiece print(bert.tokenize("IBM taught me tokenization.")) xlnet = XLNetTokenizer.from_pretrained("xlnet-base-cased") # SentencePiece + Unigram print(xlnet.tokenize("IBM taught me tokenization."))

Trucos: vocabulario

Con torchtext: tokenizar, construir el vocabulario con <unk> como índice por defecto y <pad> para el relleno, consultarlo con get_stoi() y convertir una frase en índices. dataset es una lista de parejas (etiqueta, texto).

from torchtext.data.utils import get_tokenizer from torchtext.vocab import build_vocab_from_iterator dataset = [(1, "Introduction to NLP"), (2, "Basics of PyTorch"), (1, "NLP Techniques for Text Classification"), (3, "Named Entity Recognition with PyTorch")] tokenizer = get_tokenizer("basic_english") def yield_tokens(data_iter): # genera los tokens de cada texto for _, text in data_iter: yield tokenizer(text) vocab = build_vocab_from_iterator(yield_tokens(dataset), specials=["<unk>", "<pad>"]) vocab.set_default_index(vocab["<unk>"]) # palabras desconocidas → <unk> print(vocab.get_stoi()) # diccionario palabra → índice mi_iterador = yield_tokens(dataset) frase = next(mi_iterador) # siguiente frase tokenizada print(frase, [vocab[t] for t in frase]) # tokens y sus índices

Tokens especiales: <bos> y <eos> marcan el inicio y el fin de cada frase, y <pad> iguala todas a la longitud de la más larga.

from torchtext.data.utils import get_tokenizer lines = ["IBM taught me tokenization", "Special tokenizers are ready and they will blow your mind", "just saying hi!"] tokenizer_en = get_tokenizer("spacy", language="en_core_web_sm") tokens, max_length = [], 0 for line in lines: linea = ["<bos>"] + tokenizer_en(line) + ["<eos>"] # inicio y fin tokens.append(linea) max_length = max(max_length, len(linea)) for i in range(len(tokens)): # relleno con <pad> tokens[i] = tokens[i] + ["<pad>"] * (max_length - len(tokens[i])) print(tokens[2])

Trucos: Dataset y lotes

Un Dataset propio, una función de agrupación que tokeniza, convierte en índices y rellena, y un DataLoader que sirve lotes barajados; iter() y next() extraen un lote suelto.

# continúa el código anterior (tokenizer y vocab de torchtext) import torch from torch.utils.data import Dataset, DataLoader from torch.nn.utils.rnn import pad_sequence class CustomDataset(Dataset): def __init__(self, sentences): self.sentences = sentences def __len__(self): return len(self.sentences) def __getitem__(self, idx): return self.sentences[idx] sentences = [texto for _, texto in dataset] def collate_fn(batch): tensores = [torch.tensor([vocab[t] for t in tokenizer(s)]) for s in batch] return pad_sequence(tensores, batch_first=True, padding_value=vocab["<pad>"]) # relleno con el índice de <pad> dataloader = DataLoader(CustomDataset(sentences), batch_size=2, shuffle=True, collate_fn=collate_fn) data_iter = iter(dataloader) print(next(data_iter)) # primer lote

Tabla de referencia

PasoFunción o claseQué hace
Tokenizar por palabrasspacy.load(...), nltk.word_tokenizeDivide el texto en palabras y signos
Tokenizar por subpalabrasBertTokenizer.from_pretrained, XLNetTokenizer.from_pretrainedWordPiece (BERT); Unigram y SentencePiece (XLNet)
Tokenizador básicoget_tokenizer("basic_english")Minúsculas y separación de signos (torchtext)
Construir vocabulariobuild_vocab_from_iterator(..., specials=["<unk>"])Asigna un índice a cada token (torchtext)
Palabra desconocidavocab.set_default_index(vocab["<unk>"])Envía a <unk> lo que no está en el vocabulario
Ver el vocabulariovocab.get_stoi()Diccionario palabra → índice
Tokens a índicesvocab(lista_de_tokens)Lista de índices
Dataset propioclass X(Dataset) con __init__, __len__, __getitem__Acceso a muestras por índice
LotesDataLoader(ds, batch_size, shuffle, collate_fn)Agrupa, baraja y transforma por lote
Igualar longitudespad_sequence(seqs, batch_first, padding_value)Rellena hasta la secuencia más larga
Validar datosclass M(BaseModel) de PydanticComprueba tipos y restricciones
Usar un modelopipeline("tarea") de TransformersClasificación, relleno de máscaras, generación de texto (también para resumir con un modelo de chat)

Recordatorio: torchtext ya no se mantiene (última versión 0.18, de 2024); en proyectos nuevos, el vocabulario se construye con los tokenizadores de Hugging Face o con unas pocas líneas de Python, como en el módulo de tokenización.

Ideas clave del curso

Autoevaluación

1. Una empresa quiere restaurar fotos antiguas dañadas. ¿Qué arquitectura es la más indicada?

2. ¿Qué ventaja estructural tienen los transformers frente a las RNN?

3. Un banco quiere clasificar reseñas por sentimiento. ¿Qué modelo encaja mejor?

4. ¿Qué técnica distingue el entrenamiento de ChatGPT?

5. Un LLM afirma con seguridad un dato falso sobre una persona real. ¿Qué medida reduce el riesgo en producción?

6. ¿Qué tokenización combina un vocabulario manejable con la capacidad de representar palabras raras?

7. En un vocabulario, ¿qué hace set_default_index(vocab["<unk>"])?

8. ¿Dónde conviene tokenizar, convertir en índices y rellenar las frases de un lote?

9. Con batch_first=False y un lote de 4 frases cuya más larga tiene 12 tokens, ¿qué forma tiene el tensor?

10. Un modelo entrenado solo con textos de un país responde mal a usuarios de otras regiones. ¿Qué pilar de los datos falló?