¿Qué es un modelo de lenguaje?
¿Alguna vez has usado el autocompletado de tu móvil y has visto que, de repente, te sugiere la frase entera que ibas a escribir? Esa pequeña magia cotidiana es, en esencia, la misma idea que mueve a la inteligencia artificial más avanzada de nuestro tiempo.
En su núcleo, tanto los modelos gigantes que lideran el boom actual de la IA como los modelos más modestos que estudiamos en este compendio son simples —pero potentísimos— predictores del siguiente token. Dada una secuencia de fragmentos de texto, el modelo calcula una probabilidad para cada fragmento posible que podría venir a continuación. A esos fragmentos les llamamos tokens. Y ojo: no siempre son palabras completas; pueden ser sub-palabras, caracteres sueltos o incluso signos de puntuación. Por ejemplo, la palabra independientemente podría dividirse en [independ, iente, mente]. Esto permite al modelo manejar términos que nunca ha visto (como nombres propios) combinando piezas conocidas, y además facilita el trabajo con idiomas muy distintos al inglés.
Para generar texto, el proceso es un bucle que se repite una y otra vez:
- El modelo recibe una secuencia de tokens.
- Calcula una distribución de probabilidad sobre todos los tokens de su vocabulario para decidir cuál sigue.
- Se elige uno (no siempre el más probable — sobre esto volveremos cuando hablemos de sampling, temperatura, top-k y top-p).
- Ese token se añade al final de la secuencia.
- Se repite el ciclo con la secuencia ya extendida.
Este mecanismo —repetir una predicción token a token— es, sorprendentemente, todo lo que hace falta para generar párrafos enteros, código, poesía o conversaciones completas. No hay un “plan” previo del texto completo; el modelo literalmente no sabe cómo va a terminar la oración cuando escribe la primera palabra.
No es una idea nueva
Vale la pena desmitificar: esta idea central no nació con ChatGPT. Una de las primeras formas en que la mayoría de la gente experimentó algo parecido fue el autocompletado de los teclados o buscadores: escribías “world wide” y te sugería “web” como continuación probable. Ese mismo principio —calcular qué es probable que venga después, dado lo que ya se ha escrito— es exactamente el mecanismo detrás de los LLMs actuales.
Lo que cambió drásticamente entre ese autocompletado simple de hace años y las capacidades actuales no fue la tarea en sí (sigue siendo “predecir el siguiente token”), sino:
- La escala (parámetros, datos, cómputo) por varios órdenes de magnitud.
- La arquitectura usada para hacer esa predicción (de modelos estadísticos simples como n-gramas, a redes recurrentes, hasta los transformers actuales).
- La calidad y diversidad de los datos de entrenamiento.
- Técnicas posteriores como el fine-tuning, que moldean cómo usa esa capacidad de predicción para comportarse como un asistente conversacional en lugar de solo “continuar texto”.
La diferencia entre el autocompletado de tu teléfono y un modelo como GPT-4 no es cualitativa (ambos predicen el siguiente token), sino cuantitativa. Es como la diferencia entre tener una libreta con 100 frases hechas y tener la capacidad de consultar, en milisegundos, una biblioteca con prácticamente todo el texto público de internet. El salto en la cantidad de datos y parámetros es lo que genera la apariencia de “comprensión”.
La idea clave que queremos que quede clara: un LLM no “sabe” cosas ni “razona” en el sentido humano. En su lugar, está resolviendo un problema estadístico de altísima dimensión: “dado este patrón de tokens, ¿cuál es el patrón más probable que le sigue?”. La complejidad de este problema es tan enorme que sus soluciones parecen razonamiento, pero son, en esencia, un reflejo estadístico de los datos con los que fue entrenado. Todo lo demás (que parezca razonar, que parezca saber hechos, que parezca tener personalidad) emerge de ese mecanismo aplicado a una escala masiva sobre datos masivos.
Construyamos un modelo estadístico simple
Antes de tocar transformers o redes neuronales, vamos a construir algo mucho más humilde: un modelo estadístico de n-gramas. La idea es mostrar, de forma tangible, que “predecir el siguiente token” no requiere magia — se puede hacer con simple conteo.
El corpus de entrenamiento:
El gato pequeño encontró una pelota roja. El gato pequeño empujó la pelota.
El perro pequeño encontró la pelota roja. El perro pequeño persiguió la pelota.
El pájaro pequeño vio el cielo azul. El pájaro pequeño voló hacia el cielo.
El gato pequeño vio al pájaro pequeño. El perro pequeño vio al gato pequeño.
La pelota roja rodó por la colina. El cielo azul se puso rosa en la noche.
Cada amigo pequeño quería jugar. Cada amigo pequeño corrió a casa en la noche.
Cómo se “entrena” este modelo: el proceso es puro conteo, sin gradientes ni retropropagación. Recorremos el texto palabra por palabra, y por cada palabra registramos qué palabra(s) la precedieron y qué palabra vino después. Ese registro de frecuencias —cuántas veces vimos cada continuación dado cierto contexto— es todo lo que el modelo va a recordar. No hay “comprensión” de ningún tipo, solo una tabla de conteos.
Distinguimos tres niveles de contexto, de menos a más específico:
| Tipo | Contexto usado | Ejemplo |
|---|---|---|
| Unigrama | Ninguno — solo frecuencia global de cada palabra | “pequeño” aparece 6 veces en todo el texto |
| Bigrama | 1 palabra anterior | gato → pequeño (ocurre 3 veces) |
| Trigrama | 2 palabras anteriores | El gato → pequeño (ocurre 3 veces) |
La estrategia de predicción: de lo específico a lo general. Cuando el modelo necesita predecir la siguiente palabra, sigue una estrategia de retroceso (backoff):
- Intenta el trigrama primero. Si ya vio esas dos palabras anteriores juntas, usa esa continuación específica.
- Si nunca vio ese trigrama, cae al bigrama. Usa solo la última palabra como contexto.
- Si tampoco vio ese bigrama, cae a la frecuencia simple (unigrama). En el peor caso, elige la palabra más común en todo el corpus, sin importar el contexto.
El modelo pregunta, en esencia: “¿Conozco este trigrama? Si no, ¿conozco este bigrama? Si no, ¿cuál es la palabra más común en general?”
Este patrón de preferir el contexto más rico disponible, y degradar hacia algo más genérico cuando falta información, es una idea que reaparecerá cuando lleguemos a los mecanismos de atención en los transformers.
Un ejemplo manual completo: contando a mano
Antes de lanzarnos a las tablas gigantes, hagamos el ejercicio con una oración diminuta para entender el algoritmo paso a paso. Usemos: el gato corre . el perro corre .
| posición (i) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| palabra | el | gato | corre | . | el | perro | corre | . |
Recorriendo palabra por palabra:
- i=0 (“el”): no hay anterior → unigrama:
el = 1 - i=1 (“gato”): anterior “el” → unigrama:
gato = 1; bigrama:el → gato = 1 - i=2 (“corre”): anterior “gato”; par “(el, gato)” → unigrama:
corre = 1; bigrama:gato → corre = 1; trigrama:(el, gato) → corre = 1 - i=3 (”.”): anterior “corre”; par “(gato, corre)” → unigrama:
. = 1; bigrama:corre → . = 1; trigrama:(gato, corre) → . = 1 - i=4 (“el”): anterior ”.”; par “(corre, .)” → unigrama:
el = 2; bigrama:. → el = 1; trigrama:(corre, .) → el = 1 - i=5 (“perro”): anterior “el”; par ”(., el)” → unigrama:
perro = 1; bigrama:el → perro = 1; trigrama:(., el) → perro = 1 - i=6 (“corre”): anterior “perro”; par “(el, perro)” → unigrama:
corre = 2; bigrama:perro → corre = 1; trigrama:(el, perro) → corre = 1 - i=7 (”.”): anterior “corre”; par “(perro, corre)” → unigrama:
. = 2; bigrama:corre → . = 2; trigrama:(perro, corre) → . = 1
Tablas finales:
- Unigrama:
el=2, corre=2, .=2, gato=1, perro=1 - Bigrama:
el→gato=1, el→perro=1, gato→corre=1, corre→.=2, .→el=1, perro→corre=1 - Trigrama:
(el,gato)→corre=1, (gato,corre)→.=1, (corre,.)→el=1, (.,el)→perro=1, (el,perro)→corre=1, (perro,corre)→.=1
Prediciendo con backoff:
- Prompt termina en “corre .”: trigrama
(corre, .)existe → 100% “el”. - Prompt termina solo en “el” (1 palabra, no alcanza trigrama): bigrama
el → ?da 50% “gato”, 50% “perro” (empatados). - Prompt termina en “perro gato” (nunca vista): no hay trigrama → retrocede a bigrama
gato → ?→ 100% “corre”. El modelo no entiende que “perro gato” es una combinación extraña; solo mira la última palabra y repite lo que ha visto.
Este ejemplo a mano nos prepara para entender el widget que viene a continuación, donde el mismo algoritmo se aplica a todo el corpus.
Contador de n-gramas (el laboratorio)
He preparado este pequeño laboratorio para que veas el modelo en acción. Escribe o pega texto, y el contador tokeniza por espacios y puntuación, arma las tablas de unigrama, bigrama y trigrama, y predice la siguiente palabra con backoff: trigrama → bigrama → unigrama. Es conteo puro, no entrenamiento.
Las limitaciones que este modelo ya nos enseña:
- El vocabulario de contextos crece exponencialmente. Con solo trigramas, el número de combinaciones posibles de 2 palabras seguidas es enorme, y la inmensa mayoría nunca aparecerá en ningún corpus, por grande que sea.
- No hay generalización semántica. El modelo no sabe que “perro” y “gato” son ambos animales que podrían aparecer en contextos similares. Para él, son símbolos distintos sin relación.
- La memoria es literal, no aprendida. No hay pesos que se ajusten gradualmente; solo hay una tabla de conteos fija. Si no ha visto una secuencia exacta, no puede inventar una continuación plausible.
De modelos estadísticos a redes neuronales: el salto categórico
Antes de seguir, vale la pena detenernos en algo que hasta ahora dejamos implícito. El contador de n-gramas que acabamos de construir no es una red neuronal — es, literalmente, una tabla de conteos. No hay neuronas artificiales, no hay pesos que se ajusten por gradient descent, no hay nada que “aprenda” en el sentido que usamos esa palabra en machine learning. Es estadística pura y directa.
Todo lo que viene a partir de aquí —RNN, LSTM, y el transformer que vamos a desarmar en detalle más adelante— sí son redes neuronales. Y esta es, en rigor, la definición mínima de qué significa eso: un sistema compuesto por muchas unidades simples interconectadas (“neuronas” artificiales, organizadas en capas), donde cada una realiza un cálculo básico (una combinación ponderada de sus entradas, seguida de una transformación simple), y donde el conocimiento del sistema no vive en tablas de conteo ni en reglas escritas a mano, sino en los pesos de esas conexiones — millones de números que se ajustan gradualmente durante el entrenamiento, mediante el algoritmo de descenso de gradiente que veremos en detalle en el capítulo Cómo aprenden los modelos.
Esto conecta directo con la definición que dimos en la Introducción: “un LLM es, en su definición más precisa, una red neuronal entrenada para predecir texto”. Aquí es donde esa afirmación empieza a tomar forma concreta — todavía no vamos a desarmar la arquitectura completa (eso ocurre en el capítulo dedicado, Anatomía de un transformer), pero vale la pena que quede marcado con claridad: desde este punto del compendio en adelante, cuando hablamos de “el modelo”, hablamos de una red neuronal — un objeto categóricamente distinto a la tabla de conteos que acabamos de construir a mano, aunque ambos compartan el mismo objetivo (predecir el siguiente token).
¿Qué son, exactamente, los pesos?
Cuando decimos que una red neuronal “aprende ajustando sus pesos”, vale la pena ser precisos sobre qué es un peso: es un número que determina qué tan fuerte influye la salida de un nodo sobre la entrada de otro. En esencia, los pesos son las conexiones entre los nodos de la red — organizados en matrices, donde cada entrada de la matriz es la fuerza de una conexión específica entre un nodo de una capa y un nodo de la siguiente.
Esto aplica a prácticamente todos los parámetros de un transformer: las matrices de atención, las matrices del MLP, e incluso la tabla de embeddings (que, aunque la pensemos como un diccionario, es matemáticamente una matriz de conexiones como cualquier otra — si representaras cada token como un vector con un solo 1 en la posición de su ID y ceros en el resto, multiplicarlo por la tabla de embeddings daría exactamente el mismo resultado que “buscar la fila”). La única excepción real son los parámetros de normalización (RMSNorm, que veremos en el capítulo de Anatomía de un transformer), que reescalan cada dimensión por su cuenta, sin conectar dos nodos distintos — pero representan una fracción tan pequeña del total de parámetros (recordando la distribución que calculamos más adelante: Atención ~31%, MLP ~62%, Embeddings ~6%) que, en la práctica, casi todo lo que llamamos “los pesos del modelo” son, efectivamente, sus conexiones.
Temperatura y muestreo
Modelos de lenguaje anteriores (antes de los transformers)
El contador que acabamos de construir a mano no es un juguete inventado — es un modelo de lenguaje real, basado en una idea de los años 1950: el modelo de n-gramas. Durante décadas fue el estado del arte en procesamiento de lenguaje.
El problema: el modelo solo mira hacia atrás un puñado de palabras. Considera la frase: “El niño que creció en Francia habla perfectamente…” — cualquier hablante completaría “francés”. Un modelo de n-gramas, sin embargo, solo ve algo como “habla perfectamente…” — no tiene ventana hacia “creció en Francia”, porque quedó fuera del alcance de su memoria.
Y este no es solo un problema de memoria. Incluso si agrandáramos la ventana a 10 palabras, el número de combinaciones posibles (“El niño que creció en la pequeña…”) es tan astronómico que necesitaríamos un corpus del tamaño del universo para tener suficientes ejemplos de cada una. Por eso, el modelo no puede generalizar la idea de que “Francia” implica “francés”.
Esta limitación impulsó la siguiente generación de modelos (1990s-2000s): las redes neuronales recurrentes (RNN) y su variante más famosa, la LSTM.
RNNs y LSTMs
En lugar de una ventana fija, estas redes leen el texto una palabra a la vez, manteniendo un estado oculto (hidden state): un resumen que se va actualizando en cada paso.
Los dos problemas que, en la práctica, no se resolvieron del todo:
- La memoria de largo alcance seguía siendo frágil. Comprimir un párrafo entero en un resumen de tamaño fijo significa que los detalles tempranos se desdibujan o se pierden conforme avanza la lectura.
- Eran inherentemente lentas de entrenar. Como cada palabra depende del estado oculto de la palabra anterior, el procesamiento es forzosamente secuencial: no puedes calcular la palabra 100 hasta haber terminado la 1-99. No hay forma de paralelizar ese cálculo.
Los dos problemas a recordar: los n-gramas solo ven una ventana pequeña y fija. Las RNN/LSTM cargan todo el pasado, pero lo comprimen a través de un estado secuencial, lo cual las hace lentas y aun así propensas a perder detalles de largo alcance.
2017: el transformer ataca ambos problemas a la vez
Y entonces, en 2017, llegó el transformer. No fue una evolución, fue un cambio de paradigma. Atacó los dos problemas de raíz:
- Con el mecanismo de atención, creó una autopista de información entre cada palabra y todas las demás, eliminando la maldición de la ventana fija. Cualquier token puede “mirar” directamente a cualquier otro token anterior, sin importar la distancia. Esto resuelve el problema de la memoria de largo alcance.
- Al hacerlo, permitió que el entrenamiento se paralelizara por completo: todos los tokens de una secuencia se procesan al mismo tiempo, no uno tras otro. Lo que antes tomaba semanas, ahora se podía hacer en días o incluso horas.
Esta doble victoria es la razón por la que hoy, prácticamente todos los modelos de IA conversacional (ChatGPT, Claude, Gemini, etc.) llevan un transformer en su núcleo.
La investigación no se detuvo ahí —hay líneas activas explorando alternativas recurrentes modernas y modelos de espacio de estados— pero los transformers siguen dominando por completo el boom actual de IA.
Bajo el capó Algoritmo de conteo, backoff, y la fórmula de temperatura Expandir Cerrar
El widget de n-gramas hace exactamente el recorrido del ejemplo manual. La puntuación es un token propio, igual que en el gato corre . el perro corre .:
tokens = tokenize(texto) # palabras y signos, por separado
para i, w en tokens:
unigrama[w] += 1
si i >= 1: bigrama[tokens[i-1]][w] += 1
si i >= 2: trigrama[(tokens[i-2], tokens[i-1])][w] += 1
Predicción con backoff, dado un contexto de una o dos palabras:
si existe trigrama[w1, w2]: P(w | w1, w2) = count / suma
si no, y existe bigrama[w2]: P(w | w2) = count / suma
si no: P(w) = unigrama[w] / N
La temperatura no toca esas tablas. Toma una distribución ya calculada —la del backoff, o el ejemplo fijo que vimos (corrió 32%, vio 24%, encontró 20%, durmió 16%, plátano 8%)— y la reescala:
peso_ajustado(w) = P(w) ^ (1 / T)
P'(w) = peso_ajustado(w) / Σ peso_ajustado
- Con T → 0 la masa se concentra en el máximo (elección determinista).
- Con T = 1 la distribución no cambia.
- Con T > 1 se aplana (más aleatoriedad, más “creatividad”).
La temperatura es un dial que ajusta el carácter de la generación: frío para respuestas predecibles, cálido para textos más diversos. No hay descenso de gradiente en ningún paso; es solo un reescalado posterior.
Resumen del capítulo
Hemos visto que:
- Un modelo de lenguaje es, en esencia, un predictor del siguiente token.
- Podemos construir uno con simples conteos (n-gramas) y entender sus limitaciones: ventana fija y falta de generalización.
- Los intentos posteriores (RNN/LSTM) mejoraron la memoria, pero introdujeron lentitud y fragilidad.
- El transformer revolucionó el campo al ofrecer atención paralelizable, resolviendo ambos problemas.
En el próximo capítulo abriremos el transformer por dentro y veremos cómo la atención realmente funciona. Pero antes, asegúrate de haber interiorizado esta idea fundamental: todo empieza con adivinar la siguiente palabra.
LinkedIn nelson.zepeda@simov.io SIMOV LABS
¿Encontraste un error? Sugerir una corrección