El modelo preentrenado es increíblemente capaz — pero no necesariamente hace lo que tú necesitas. Esta lección explica por qué y presenta las tres estrategias para resolverlo.
pipeline() para inferencia rápida y cómo funciona el tokenizer (BPE, padding, attention mask). Hasta aquí solo usaste modelos tal como vienen. Hoy entendemos por qué eso no siempre es suficiente — y cuáles son las tres soluciones.
Un modelo de lenguaje preentrenado — como BERT, GPT-2 o LLaMA — aprendió de enormes cantidades de texto general: Wikipedia, libros, artículos, código, foros. Eso lo hace increíblemente bueno en tareas generales: responder preguntas, resumir, traducir, completar frases.
Pero imagina que eres una empresa farmacéutica y quieres un modelo que:
Un modelo preentrenado genérico puede fallar en todas estas. No porque sea malo — sino porque fue entrenado para objetivos distintos. Esto es el gap.
El modelo sabe mucho, pero la mayor parte de ese conocimiento no es exactamente lo que tu tarea necesita.
Para entender las soluciones al gap, primero hay que entender cómo se entrenó el modelo. El pre-entrenamiento es el entrenamiento masivo original — el que requirió meses y millones de dólares.
Hay dos tipos principales, y producen modelos con capacidades muy distintas:
Ejemplos: BERT, RoBERTa, DistilBERT
El modelo aprende rellenando huecos en el texto:
"El [MASK] come pescado" → predice "gato".
Entrena con texto en ambas direcciones (puede leer el texto de antes
y después del hueco). Excelente para entender y clasificar texto.
# Entrenamiento: predice la palabra tapada
Input: "El [MASK] come pescado"
Target: "gato" (o cualquier palabra que encaje)
# Resultado: modelo que entiende contexto
Ejemplos: GPT-2, GPT-3, LLaMA, Mistral
El modelo aprende predecir la siguiente palabra:
"El gato" → predice "come".
Solo lee de izquierda a derecha. Excelente para generar texto nuevo.
Es la arquitectura de todos los grandes modelos de chat (ChatGPT, Claude, etc.).
# Entrenamiento: predice la siguiente palabra
Input: "El gato"
Target: "come" (la siguiente en el texto)
# Resultado: modelo que genera texto
Una vez que tienes el modelo preentrenado, hay tres formas de cerrar la brecha entre lo que sabe y lo que necesitas. Son complementarias — no exclusivas:
Tres estrategias distintas, distintos costes y distintos niveles de control.
Vamos a ver cada una con un ejemplo concreto del mismo problema:
Problema: tengo 5.000 reseñas de mi producto etiquetadas como positivas o negativas. Quiero que el modelo las clasifique con alta precisión.
El fine-tuning toma el modelo preentrenado y lo vuelve a entrenar, pero con tus datos y para tu tarea específica. Los pesos que ya aprendieron el lenguaje se ajustan ligeramente para especializarse en clasificar reseñas.
PUNTO DE PARTIDA:
BERT-base con 110 millones de parámetros ajustados para lenguaje general.
QUÉ SE CAMBIA:
Se añade una "cabeza" de clasificación — una capa lineal nueva
que toma el vector [CLS] y produce 2 números (puntuaciones por clase).
BERT existente → capas congeladas o ajustables
↓
[CLS] vector (768 dimensiones)
↓
Capa lineal NUEVA (768 → 2)
↓
Softmax → P(positivo), P(negativo)
CÓMO SE ENTRENA:
Para cada reseña en tu dataset:
1. Forward pass: el texto pasa por BERT → obtiene logits
2. Calcular el loss (cross-entropy con la etiqueta real)
3. Backward pass: calcular gradientes
4. Actualizar los pesos (todos o solo la cabeza nueva)
RESULTADO:
Un modelo que clasifica tus reseñas con altísima precisión porque
aprendió exactamente las diferencias entre "positivo" y "negativo"
en el dominio específico de tus productos.
El prompting es la estrategia más simple: guías al modelo con instrucciones bien escritas en el propio texto de entrada. El modelo responde basándose en su conocimiento general y en las instrucciones que le das.
# Zero-shot: sin ejemplos — solo instrucciones
prompt = """Clasifica la siguiente reseña de producto como POSITIVO o NEGATIVO.
Responde solo con una palabra.
Reseña: "Me llegó tarde y el producto estaba roto."
Clasificación:"""
generador = pipeline("text-generation", model="gpt2")
print(generador(prompt, max_new_tokens=3))
# Few-shot: con 2 ejemplos para guiar al modelo
prompt_few_shot = """Clasifica la reseña como POSITIVO o NEGATIVO.
Reseña: "Excelente calidad, lo recomiendo." → POSITIVO
Reseña: "El peor producto que he comprado." → NEGATIVO
Reseña: "Llegó antes de lo esperado y funciona perfectamente." → """
El instruction tuning (también llamado "supervised fine-tuning" o SFT) es una forma especial de fine-tuning donde no le muestras ejemplos de una sola tarea, sino ejemplos de muchas tareas en formato "instrucción → respuesta esperada".
Es exactamente lo que convirtió GPT-3 (un modelo que solo completaba texto) en ChatGPT (un modelo que responde preguntas, sigue instrucciones y mantiene conversaciones).
Formato de los datos de entrenamiento:
Ejemplo 1:
{"instrucción": "Traduce al inglés",
"entrada": "El cielo es azul",
"respuesta": "The sky is blue"}
Ejemplo 2:
{"instrucción": "Escribe un poema corto sobre el otoño",
"entrada": "",
"respuesta": "Hojas que caen suaves al suelo,\nde rojo y oro el bosque..."}
Ejemplo 3:
{"instrucción": "Clasifica como POSITIVO o NEGATIVO",
"entrada": "Me encantó el producto, llegó rápido",
"respuesta": "POSITIVO"}
El modelo ve miles de estos ejemplos y aprende el patrón:
"cuando veo una instrucción + entrada, debo generar una respuesta apropiada"
| Situación | Estrategia recomendada |
|---|---|
| Tengo datos etiquetados y quiero máxima precisión | Fine-tuning completo (lección 5) |
| Tengo datos pero poca GPU (laptop, Colab gratis) | LoRA / QLoRA (lecciones 10–11) |
| No tengo datos etiquetados, solo ejemplos | Few-shot prompting (esta lección) |
| Quiero un asistente que siga instrucciones variadas | Instruction tuning (lección 5 + datasets especiales) |
| El modelo es demasiado grande para mi hardware | Cuantización + compresión (lecciones 12–13) |
| Quiero un modelo pequeño igual de bueno que uno grande | Destilación (lección 14) |
Describe tu situación y la demo te recomendará qué estrategia usar y por qué:
En la próxima lección — la primera del Bloque 2 — hacemos fine-tuning completo desde cero: qué cambia en el modelo, cuánta memoria necesita, y el código real paso a paso.