← Todo el material
Curso Intermedio 23 de agosto de 2026

Transformers — Módulo 7: fine-tuning e instruction tuning — de GPT a ChatGPT

Séptimo módulo del Curso de Transformers: el base model no obedece instrucciones. Con supervised fine-tuning (SFT) sobre pares instrucción-respuesta se convierte en asistente. Full fine-tuning vs LoRA/PEFT, chat templates y un ejemplo real de SFT con LoRA en Hugging Face.

☰ Índice del contenido

El Módulo 6 nos dejó con un base model: un modelo que sabe muchísimo del mundo pero solo hace una cosa — continuar texto. Le preguntas la capital de Chile y te responde con otra pregunta, porque aprendió a que el texto siga plausible, no a obedecerte. Este módulo cubre el paso que transformó esa curiosidad de laboratorio en la herramienta que usan millones: cómo un afinado relativamente pequeño convierte un continuador de texto en un asistente que sigue instrucciones. Es, literalmente, el salto de GPT a ChatGPT.

La tesis del módulo

El conocimiento ya estaba; lo que faltaba era el comportamiento. El fine-tuning no le enseña hechos nuevos al modelo: le enseña un formato — “cuando alguien te dé una instrucción, responde a esa instrucción”. Con miles de ejemplos de conversaciones bien hechas, el base model aprende a portarse como asistente. Y hoy eso se puede lograr entrenando apenas una fracción minúscula de sus pesos.

Fine-tuning: seguir entrenando, pero con propósito

El fine-tuning (glosar: “afinamiento”; tomar un modelo ya pre-entrenado y entrenarlo un poco más sobre datos específicos, para especializar su comportamiento sin partir de cero) es el mismo mecanismo del Módulo 6 — predecir el siguiente token y ajustar pesos con cross-entropy — pero sobre datos cuidadosamente elegidos y muchísimos menos.

El sabor que nos importa se llama supervised fine-tuning (SFT, glosar: afinamiento supervisado; entrenar con pares de ejemplo donde alguien preparó tanto la entrada como la respuesta ideal — “supervisado” porque hay respuestas modelo hechas por humanos). El dato ya no es texto crudo de la web: son pares (instrucción, respuesta):

 instrucción:  "Resume esto en una frase: <texto largo>"
 respuesta:    "El texto explica cómo funciona la fotosíntesis."

 instrucción:  "¿Cuál es la capital de Chile?"
 respuesta:    "La capital de Chile es Santiago."

Al entrenar sobre miles de estos pares, el modelo aprende el patrón de comportamiento: tras una instrucción, viene una respuesta que la atiende. Cuando ese SFT usa una colección amplia y variada de instrucciones, se llama instruction tuning (glosar: afinamiento por instrucciones; el SFT específicamente pensado para que el modelo generalice a seguir cualquier instrucción, no solo las del set de entrenamiento). Ese es el ingrediente que convierte al base model en asistente.

 base model                    modelo instruction-tuned
 (completa texto)              (sigue instrucciones)
      │                                 ▲
      │        SFT sobre pares          │
      └──► (instrucción, respuesta) ────┘
              miles de ejemplos

Chat templates: cómo se marca quién habla

Para que el modelo sepa dónde termina la instrucción del usuario y dónde debe empezar su respuesta, la conversación se formatea con marcas especiales. A eso se le llama chat template (glosar: plantilla de chat; el formato con tokens especiales que rodea cada turno para señalar los roles — sistema, usuario, asistente — dentro del texto plano que el modelo procesa).

Por dentro, una conversación se ve más o menos así (el formato exacto varía por modelo):

<|system|>   Eres un asistente útil y conciso.
<|user|>     ¿Cuál es la capital de Chile?
<|assistant|> La capital de Chile es Santiago.

El modelo aprende, durante el SFT, que después de la marca <|assistant|> le toca a él generar. Por eso hoy separamos roles (system, user, assistant): todo eso vive en el texto que el Transformer procesa, guiado por estas marcas. Cuando usas la API de un LLM y pasas messages con roles, la librería arma este template por ti.

Ojo: cada familia de modelos tiene su propio chat template. Aplicar el template equivocado a un modelo es una causa clásica de respuestas raras o degeneradas. En Hugging Face, tokenizer.apply_chat_template(...) usa el correcto automáticamente — úsalo en vez de armar el formato a mano.

Full fine-tuning vs PEFT/LoRA

Aquí viene la decisión más práctica del módulo. Hay dos formas de hacer el afinado:

  1. Full fine-tuning: ajustar todos los pesos del modelo. Máxima flexibilidad, pero necesitas memoria y cómputo casi como para pre-entrenar, y terminas con una copia completa del modelo por cada tarea.

  2. PEFT (glosar: Parameter-Efficient Fine-Tuning; familia de técnicas que afinan el modelo tocando solo una fracción minúscula de sus pesos, dejando el resto congelado). El miembro estrella es LoRA (glosar: Low-Rank Adaptation; en vez de modificar las matrices gigantes del modelo, se les suman unas matrices chiquititas y nuevas, y solo esas se entrenan; el modelo original queda intacto y congelado).

La idea de LoRA es elegante: al lado de cada matriz de pesos grande y congelada, se agregan dos matrices pequeñas cuyo producto se suma a la salida. Solo esas matrices chicas aprenden. Como son diminutas, entrenar cuesta poquísimo y el resultado (el “adaptador LoRA”) pesa unos pocos MB en vez de decenas de GB.

 entrada
    │
    ▼
 ┌──────────────────────┐        ┌──────────────┐
 │ matriz original W    │        │ LoRA: A y B  │
 │ (congelada, no       │        │ (chicas, SÍ  │
 │  se entrena)         │        │  se entrenan)│
 └──────────┬───────────┘        └──────┬───────┘
            │                           │
            └──────────►( + )◄──────────┘
                          │
                          ▼
                       salida

Combinar LoRA con cuantización (cargar el modelo base en 4 bits, técnica del Módulo 4 de GPU) se llama QLoRA, y es lo que permite afinar modelos de 7B–13B en una sola GPU de consumidor. Es la razón de que hoy cualquiera pueda especializar un LLM sin un datacenter.

Full fine-tuningLoRA / QLoRA
Qué se entrenaTodos los pesosSolo matrices chicas añadidas
VRAM necesariaEnorme (como pre-entrenar)Baja: un 7B cabe en 1 GPU consumer
Costo / tiempoAltoBajo, horas en vez de semanas
Peso del resultadoOtra copia completa (GB)Un adaptador de pocos MB
Calidad topeMáximaMuy cercana, suficiente casi siempre
Cuándo usarloCambios profundos, presupuesto grandeCasi siempre: rápido, barato, reversible

Un SFT con LoRA, en código

Ejemplo ilustrativo con Hugging Face (transformers + peft + trl). Es la estructura real que usarías; los datos y el modelo son de ejemplo:

from datasets import load_dataset
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig
from trl import SFTTrainer, SFTConfig

nombre = "meta-llama/Llama-3.2-1B"  # un base model chico
tok = AutoTokenizer.from_pretrained(nombre)
modelo = AutoModelForCausalLM.from_pretrained(nombre, device_map="auto")

# dataset de pares (instrucción, respuesta) ya en formato de chat
datos = load_dataset("json", data_files="mis_conversaciones.jsonl")["train"]

# config de LoRA: SOLO se entrenan estas matrices chicas
lora = LoraConfig(
    r=16,                       # "rango": qué tan chicas son las matrices
    lora_alpha=32,              # cuánto pesan al sumarse
    target_modules=["q_proj", "v_proj"],  # dónde se enchufan (capas de atención)
    task_type="CAUSAL_LM",
)

entrenador = SFTTrainer(
    model=modelo,
    train_dataset=datos,
    peft_config=lora,           # aquí se activa LoRA; el resto queda congelado
    args=SFTConfig(
        output_dir="./mi-asistente",
        num_train_epochs=3,
        per_device_train_batch_size=2,
        learning_rate=2e-4,
        assistant_only_loss=True,  # loss solo sobre las respuestas del asistente
    ),
)

entrenador.train()
entrenador.save_model("./mi-asistente")  # guarda el adaptador LoRA (pocos MB)

El SFTTrainer aplica el chat template, calcula la loss de cross-entropy solo sobre la parte de respuesta gracias a assistant_only_loss=True (no queremos que el modelo aprenda a generar la pregunta del usuario; sin esa opción la loss cubre todo el texto) y ajusta únicamente las matrices LoRA. El detalle fino de esta opción y del loss masking está en el Curso de Fine-tuning. Con esto, un base model de 1B se vuelve un asistente acotado en tu propia máquina.

Errores comunes

  • Creer que el fine-tuning “mete conocimiento nuevo”. Sobre todo con LoRA, lo que ajustas es comportamiento y formato, no una enciclopedia. Para conocimiento fresco, muchas veces conviene más RAG (ver embeddings y RAG) que fine-tuning.
  • Aplicar el chat template equivocado. Formatear con las marcas de otro modelo produce respuestas degeneradas. Usa apply_chat_template.
  • Ir a full fine-tuning por defecto. Para la enorme mayoría de casos, LoRA/QLoRA da calidad casi idéntica a una fracción del costo. Empieza por ahí.
  • Datos de baja calidad. En SFT manda la calidad, no la cantidad: mil ejemplos excelentes superan a cien mil mediocres. El modelo imita lo que le muestras, defectos incluidos.

La frase para llevarse

“El pretraining le dio al modelo qué decir; el fine-tuning le enseñó cuándo callarse y responder. Y hoy ese modal de asistente cabe en un adaptador de pocos megas.”

Qué viene

Módulo 8: RLHF y alineamiento. El SFT hace que el modelo obedezca, pero no garantiza que sea útil, honesto e inofensivo. Veremos cómo se afina el modelo con preferencias humanas — comparaciones entre respuestas, un reward model y PPO — y las alternativas modernas como DPO y el enfoque de Anthropic con Constitutional AI.

Material relacionado

TransformersLLMFine-tuningLoRAInstruction tuning

Preguntas sobre este curso

Regístrate gratis para hacer preguntas y guardar tu progreso.

✉ Entérate de lo nuevo

Recibe un aviso cuando publique nuevos cursos, workshops o investigaciones. Sin spam.