Llegado a este punto, hemos visto la arquitectura necesaria para entrenar un LLM. Si bien, mediante la predicción del próximo token y sampleo, este pre-entrenamiento es capaz de generar textos elocuentes, en muchos casos, las respuestas son deficientes, o dañinas. A modo de ejemplo, en el siguiente artículo se muestra la una salida particular del modelo GPT-3 pre-entrenado:
Prompt: What happens if you fire a cannonball directly at a pumpkin at high speeds?
The pumpkin will pull the cannonball in, and the cannonball will bounce off of the pumpkin. A pumpkin is a strong magnet, so strong that it can manipulate metal objects.
Como podemos ver, la salida no es satisfactoria desde una perspectiva humana. No obstante, cuando GPT-3 es ajustado para seguir instrucciones, la salida es la siguiente:
There is no way to accurately predict what will happen if you fire a cannonball directly at a pumpkin at high speeds, since there are too many unpredictable factors involved. Some of these factors might include the size, weight, and density of the cannonball, the material that the pumpkin is made of, the velocity and impact force of the cannonball, and the distance between the cannonball and the pumpkin at the moment of impact. Some of the more likely possible outcomes include breaking or knocking the pumpkin to the ground, cracking the pumpkin, or completely obliterating it.
El output anterior muestra que este ajuste convirtió una salida poco útil desde el punto de vista humano, en otra más útil y natural. En general, el hacer que el modelo sea más útil, seguro y obediente a las instrucciones, se llama model alignment. En este sentido, en la presente publicación veremos dos formas de hacer model alignment: instruction tunning y preference alignment.
En palabras simples, instruction tunning ayuda a que el modelo entienda que debe hacer la tarea solicitada, y preference alignment entrena al modelo usando preferencias. La siguiente imagen ilustra mejor este último concepto:

Como se muestra en la imagen, teniendo una base de datos de respuestas previamente rankeadas, el modelo puede aprender a rankear sus propias salidas. En la sección aprendizaje por preferencias veremos esto en detalle.
Durante esta entrada, usaremos como referencia a Jurafsky y Martin (2026). Cualquier error es mi responsabilidad.
Instruction tuning
Tomar un LLM preentrenado y entrenarlo para que siga instrucciones relacionadas con diversas tareas es conocido como instruction tuning.
Específicamente, instruction tuning consiste en continuar entrenando un modelo ya preentrenado mediante nuevos datos de entrenamiento compuestos por instrucciones y sus respectivas respuestas esperadas. Cabe destacar que el objetivo no es que el modelo aprenda únicamente las instrucciones concretas contenidas en el dataset, sino que mejore su habilidad general para responder instrucciones, incluso en tareas que no haya visto explícitamente durante este entrenamiento.
A pesar de que en esta fase, al igual que en el preentrenamiento, el modelo continúa siendo entrenado para predecir el siguiente token, este método suele denominarse supervised fine-tuning. Esto se debe a que, a diferencia del preentrenamiento, el entrenamiento está guiado por ejemplos en los que se ha definido una respuesta esperada o adecuada para cada instrucción o pregunta.
Dicho esto, ahora estamos en condiciones de ver qué tipos de datasets se utilizan para realizar instruction tuning. Jurafsky y Martin (2026) presentan una lista extensa de conjuntos de datos construidos con este fin. Como explican los autores, dichos datasets pueden crearse de cuatro formas distintas:

Como muestra la imagen, en el primer caso, personas escriben directamente las instrucciones y sus respectivas respuestas. En el segundo, se reutilizan datasets clásicos de NLP —por ejemplo, datasets de preguntas y respuestas, traducción, resumen, análisis de sentimiento o inferencia textual— y se transforman automáticamente en ejemplos de instrucción y respuesta. En el ejemplo concreto de la ilustración, un dato originalmente destinado al análisis de sentimiento se convierte en una instrucción que pide clasificar el sentimiento expresado en la frase “Me encantó la película”. En el tercer caso, se reutilizan guías de anotación originalmente escritas para humanos, empleándolas como prompts para generar nuevos ejemplos de instruction tuning. Por último, también es posible utilizar otros LLMs para generar datos adicionales, por ejemplo, creando paráfrasis de una instrucción o produciendo respuestas esperadas que luego puedan incorporarse al dataset.
A modo de ejemplo práctico, la iniciativa Latam-GPT dispone públicamente de datasets que contienen instrucciones y respuestas en español. Puedes ver uno de estos conjuntos de datos aquí.
Por otra parte, vale la pena preguntarse, en el contexto de LLMedieval, cómo podría ayudarnos instruction tuning. Entre otras cosas, este método podría ser útil para enseñar al modelo a ejecutar instrucciones de modernización, medievalización, explicación lingüística o traducción asistida de fragmentos. En términos concretos, un ejemplo de entrenamiento para una tarea de modernización podría verse así:

Si quieres ver ejemplos de instruction tuning asociados a este proyecto, te invito a estar pendiente de las actualizaciones de este, en la siguiente página: https://pulki.es/medieval/.
Evaluación de modelos entrenados mediante instruction tuning
Como dijimos anteriormente, al instruir un modelo ocurren principalmente dos cosas. La primera es que el LLM aprende a responder los tipos de instrucciones y tareas presentes en los datos de entrenamiento. La segunda es que puede mejorar su habilidad general para seguir instrucciones, incluso cuando estas se refieren a tareas que no fueron incluidas explícitamente en el dataset. Puesto que el objetivo principal de instruction tuning es mejorar esta segunda capacidad, su evaluación natural consiste en examinar el desempeño del modelo en tareas nuevas.
Específicamente, como explican Jurafsky y Martin (2026), si nuestro objetivo es evaluar la capacidad general del modelo para seguir instrucciones —el segundo punto—, no basta con utilizar instrucciones nuevas si estas corresponden al mismo tipo de tarea que el modelo ya vio durante el entrenamiento. Es decir, si entrenamos al modelo con instrucciones relacionadas con:
- Traducción
- Resumen
- Clasificación de sentimiento
- Respuesta a preguntas
- Reescritura de textos
Y luego lo evaluamos con nuevas instrucciones de traducción, podremos medir si el modelo mejoró en esa tarea. Sin embargo, esto no nos asegura que haya desarrollado una habilidad más general para seguir instrucciones, pues la traducción ya formaba parte de los datos de entrenamiento. En este sentido, una evaluación más adecuada consiste en dejar fuera una tarea durante el instruction tuning y utilizarla posteriormente para evaluar el modelo.
Aprendizaje basado en preferencias
Incluso después de instruction tuning, el modelo puede seguir siendo susceptible de generar alucinaciones, producir respuestas poco útiles desde una perspectiva humana o entregar contenido inseguro. Una forma de abordar estos problemas consiste en utilizar aprendizaje basado en preferencias. En la introducción mencionamos esta idea en términos generales. Ahora la explicaremos con mayor detalle; sin embargo, un buen ejercicio pedagógico consiste en comenzar examinando cómo se estructuran los datos utilizados para este tipo de entrenamiento.
¿Qué forma tienen los datos de preferencias?
El proyecto Latam-GPT también dispone de una base de datos de preferencias. A continuación, mostraremos un ejemplo de cómo se estructura una entrada de este conjunto de datos:



Como podemos ver, una entrada contiene un prompt, una respuesta elegida (chosen) y otra rechazada (rejected). Esto no significa necesariamente que la primera sea la única respuesta correcta y la segunda sea completamente incorrecta; significa que, para ese prompt, una respuesta fue considerada preferible frente a la otra.
A partir de este ejemplo, el lector puede preguntarse de dónde proviene el juicio que permite marcar una respuesta como chosen y otra como rejected. En general, existen tres fuentes principales de datos de preferencias. La primera consiste en utilizar evaluadores humanos, quienes comparan, seleccionan u ordenan múltiples respuestas generadas por un modelo ante un mismo prompt. La segunda consiste en extraer preferencias implícitas de ciertos sitios web. Un ejemplo de este caso es StackExchange:



En este caso, como podemos ver, podríamos considerar la pregunta original como el prompt y las respuestas publicadas por la comunidad como las alternativas candidatas. Los votos acumulados por cada respuesta permiten inferir cuáles fueron consideradas mejores; de esta forma, una respuesta mejor valorada puede tratarse como preferida frente a otra con menor valoración.
Por último, otra alternativa consiste en utilizar un LLM como evaluador. En este caso, distintos modelos pueden generar respuestas candidatas para un mismo prompt, y luego un LLM suficientemente potente puede compararlas u ordenarlas según su calidad. Así, el propio modelo evaluador permite generar datos sintéticos de preferencias.
Preferencias por pares y puntuaciones por aspectos
En la sección anterior dijimos que los evaluadores podían seleccionar, ordenar o puntuar respuestas candidatas. En el caso de la selección y el ordenamiento, el resultado puede representarse mediante preferencias entre pares de respuestas: por ejemplo, que la respuesta A es preferida sobre la respuesta B. En cambio, cuando hablamos de puntuar una respuesta, nos referimos a evaluarla individualmente en determinadas dimensiones, como su utilidad, honestidad, corrección o claridad.
Cuando contamos con una preferencia entre pares, sólo sabemos que, para un mismo prompt, una respuesta fue considerada mejor que otra. Es decir, tenemos una observación como “la respuesta A es preferida sobre la respuesta B”, pero no contamos con una puntuación individual asociada a cada una de ellas. En la próxima sección veremos cómo imputar una puntuación de este tipo.
Modelando una preferencia
Como dijimos anteriormente, cuando los evaluadores seleccionan una respuesta preferida entre dos alternativas generadas para un mismo prompt, no obtenemos una puntuación explícita para cada respuesta. Sólo sabemos que una fue preferida sobre la otra. Sin embargo, nos gustaría construir un modelo capaz de asignar una puntuación numérica a cada alternativa, de manera que podamos ordenarlas según qué tan preferibles resultan. La siguiente imagen ilustra esta idea:

Si bien en la imagen anterior mostramos sólo dos respuestas, en un dataset de preferencias podemos tener múltiples respuestas candidatas para un mismo prompt. Supongamos, por ejemplo, que para un prompt disponemos de ocho respuestas, , y que los evaluadores han expresado las siguientes preferencias sobre algunos pares:
El símbolo significa “es estrictamente preferida sobre”. Así, la primera comparación indica que, dado el prompt , la respuesta A fue considerada mejor que la respuesta B.
A partir de estos juicios, nos gustaría modelar la probabilidad de que una respuesta sea preferida sobre otra para un mismo prompt. En términos formales, queremos calcular:
Es decir, queremos conocer qué tan probable es que la respuesta sea preferida sobre la respuesta , dado el prompt .
Para ello, asumimos que cada respuesta tiene asociada una puntuación latente, es decir, una puntuación que no observamos directamente. Denotaremos la puntuación de la respuesta como . Bajo el modelo Bradley-Terry, la probabilidad de preferir una respuesta sobre otra depende de la diferencia entre sus puntuaciones:
donde corresponde a la función sigmoide. Si ambas respuestas reciben puntuaciones similares, la probabilidad de preferir una sobre la otra será cercana a . En cambio, si la puntuación de es mucho mayor que la de , la probabilidad de preferir será cercana a 1.
El problema es que las puntuaciones no forman parte de nuestros datos. Los evaluadores sólo nos informan que una respuesta fue preferida sobre otra; no nos entregan una puntuación individual para cada salida. Por esta razón, necesitamos aprender una función que, dado un prompt y una respuesta candidata, produzca una puntuación escalar. De este modo, podemos reescribir la expresión anterior como:
En otras palabras, representa la puntuación que el modelo aprende a asignar a la respuesta en el contexto del prompt . Esta función debe aprenderse utilizando los datos de preferencias que ya tenemos. Para cada par observado, designaremos como a la respuesta preferida —la winner— y como a la respuesta rechazada —la loser. Puesto que el dataset indica que fue preferida sobre , utilizamos esa observación como etiqueta de entrenamiento: el evento recibe el valor objetivo .
La función de pérdida de entropía cruzada para un único par viene dada por:
Esta pérdida será alta cuando el modelo asigne una puntuación mayor a la respuesta rechazada, o cuando apenas distinga entre ambas respuestas. Por el contrario, será baja cuando la respuesta preferida reciba una puntuación suficientemente mayor que la rechazada.
Finalmente, la pérdida sobre el conjunto de entrenamiento se obtiene calculando este mismo criterio sobre todos los pares de preferencias disponibles:
En términos simples, esta función penaliza al modelo cada vez que sus puntuaciones no respetan adecuadamente las preferencias registradas en los datos.
Evidentemente, para calcular esta pérdida necesitamos un modelo capaz de producir los valores de . Una forma habitual de hacerlo consiste en convertir un LLM preentrenado en un reward model: se reemplaza su capa final de predicción de tokens por una capa lineal que produce un único número para cada combinación de prompt y respuesta. Así, el modelo deja de generar texto y pasa a evaluar respuestas mediante una puntuación escalar.
Durante el entrenamiento, el reward model evalúa tanto la respuesta preferida como la rechazada, calcula la pérdida anterior y ajusta sus parámetros entrenables mediante backpropagation y descenso de gradiente. Como resultado, las puntuaciones producidas por se vuelven progresivamente más coherentes con las preferencias observadas. A continuación, explicaremos este proceso en mayor detalle.
1. Convertir un LLM en reward model
Como muestra la imagen, un reward model puede construirse a partir de una arquitectura muy similar a la de un LLM generativo convencional. No obstante, ambos modelos se diferencian en la tarea que realizan y en el tipo de salida que producen.

La diferencia principal se encuentra en la capa final del modelo. En un LLM generativo, esta capa se utiliza para producir probabilidades sobre los tokens que podrían continuar el texto. En cambio, para construir un reward model, la capa final de predicción de tokens se reemplaza por una capa lineal de puntuación. De esta forma, la salida del modelo ya no es una continuación textual, sino una única puntuación numérica.
2. Bradley-Terry
Dado que el reward model produce una puntuación para cada respuesta, podemos utilizar Bradley-Terry para convertir la diferencia entre dichas puntuaciones en una probabilidad de preferencia. Si estamos comparando las respuestas y para el prompt , esta probabilidad viene dada por:
Esta probabilidad puede contrastarse con la preferencia registrada en los datos. Supongamos, por ejemplo, que el evaluador humano prefirió sobre . A partir de esta situación, podemos distinguir dos casos:
a) El reward model está equivocado.
Supongamos que el evaluador humano prefirió sobre , pero el reward model produce:
En este caso, la diferencia es negativa. En consecuencia, Bradley-Terry asignará una probabilidad inferior a al evento de que sea preferida sobre . Como esta estimación contradice la preferencia observada en los datos, la pérdida será alta y el entrenamiento deberá ajustar los parámetros del reward model.
b) El reward model ordena correctamente las respuestas
Si el evaluador humano prefirió sobre , y el reward model produce:
entonces la diferencia entre puntuaciones es positiva y Bradley-Terry asignará una probabilidad superior a al evento de que sea preferida sobre . Además, mientras mayor sea la diferencia a favor de , mayor será la probabilidad asignada a la preferencia observada y menor será la pérdida.
3. Se ajustan los parámetros del modelo
En términos generales, existen dos posibilidades para entrenar un reward model. La primera consiste en ajustar únicamente la nueva capa de puntuación, manteniendo congelados los parámetros del transformer. La segunda consiste en ajustar la capa de puntuación y permitir que también se actualicen algunos o todos los parámetros del transformer. Para comprender la diferencia entre ambas posibilidades, primero conviene explicar brevemente cómo opera backpropagation.
En términos simples, backpropagation permite determinar qué parámetros entrenables deberían cambiar, y en qué dirección, para que la pérdida producida por el modelo disminuya. Para entenderlo, recordemos primero el flujo normal de cálculo de un reward model. Para una respuesta candidata, el modelo opera de la siguiente forma:
Prompt + respuesta → Transformer → Representación → Capa lineal → Puntuación
Como nuestros datos contienen una respuesta preferida y otra rechazada para un mismo prompt, este proceso se realiza para ambas respuestas:
Prompt + respuesta preferida → Reward model →
Prompt + respuesta rechazada → Reward model →
y → Pérdida
Durante la pasada hacia adelante, el modelo calcula las puntuaciones de ambas respuestas y, a partir de ellas, la pérdida. Luego, backpropagation recorre hacia atrás el grafo de cálculo utilizado para obtener esa pérdida. Mediante la regla de la cadena, calcula cómo cambiaría la pérdida si se modificara cada parámetro entrenable del modelo.
Dicho de otro modo, si la respuesta preferida recibió una puntuación demasiado baja respecto de la rechazada, backpropagation calcula qué cambios permitirían aumentar esa diferencia en la dirección correcta. Posteriormente, un algoritmo de optimización, como gradient descent, utiliza esos gradientes para actualizar los parámetros entrenables y reducir la pérdida en las siguientes iteraciones.
Una vez entendido esto, la diferencia entre las dos posibilidades de entrenamiento es sencilla. Si el transformer permanece congelado, únicamente se actualizan los parámetros de la capa lineal de puntuación. En ese caso, el modelo aprende a asignar mejores puntuaciones utilizando las representaciones internas que el transformer ya era capaz de producir.
En cambio, si también permitimos ajustar parámetros del transformer, los gradientes pueden modificar no sólo la capa de puntuación, sino también las representaciones internas utilizadas para evaluar las respuestas. En este segundo caso, el modelo puede aprender a representar con mayor claridad los rasgos que hacen que una respuesta sea preferible frente a otra.
Notas finales, y próxima entrada…
En este entrada vimos conceptos básicos sobre el proceso de post-training. Específicamente, estudiamos cómo hacer que el modelo sea mejor siguiendo instrucciones, y cómo modelar preferencias, útil para producir respuestas mas afin con las que preferirían los humanos, y menos dañinas, entre otras cosas.
En la próxima publicación veremos Masked Language Models. Stay tuned!
José Miguel Muñoz Urra – jmunozu@pulki.es



















