Ajuste fino

El ajuste fino significa tomar un modelo existente y continuar entrenándolo con tus propios ejemplos, de modo que su comportamiento predeterminado se desplace hacia lo que deseas. Este capítulo es la imagen de trabajo de lo que cambia, para qué es bueno, y cuándo recurrir a él en lugar de un prompt o retrieval.
Qué es lo que el entrenamiento realmente hace
Para ver qué cambios trae el ajuste fino, es útil saber de dónde viene un modelo. Un modelo se construye en dos etapas amplias.
La primera es preentrenamiento: el modelo lee una cantidad enorme de texto y aprende a predecir el siguiente token, una y otra vez, hasta que la gramática, los hechos y los patrones de razonamiento se asientan en él como un efecto secundario. Lo que resulta es un modelo base, fluido pero sin enfoque. Continuará tu texto felizmente, pero no ha sido entrenado para ser un asistente útil que responda preguntas.
La segunda etapa es post-entrenamiento: el modelo base se entrena más con ejemplos seleccionados de buenas respuestas, junto con retroalimentación humana sobre qué respuestas son mejores. Esto es lo que convierte un predictor de texto crudo en el asistente que sigue instrucciones con el que realmente hablas. El modelo que llamas desde una API ya ha pasado por ambas.
Ambas etapas funcionan por el mismo mecanismo: mostrar al modelo ejemplos e impulsar sus números internos, sus parámetros o pesos, de modo que sus predicciones se acerquen a esos ejemplos. El entrenamiento es práctica de predicción que deja el modelo permanentemente modificado.
Qué es el ajuste fino
El ajuste fino es una versión pequeña y dirigida de esa segunda etapa, ejecutada por ti. Tomas un modelo que ya está entrenado y continúas entrenándolo en un conjunto de tus propios ejemplos, cada uno una entrada emparejada con la salida que deseas que produjera. Después de suficientes ejemplos, los pesos del modelo se desplazan para que este tipo de respuesta sea su predeterminada, sin que tengas que pedirlo en el prompt cada vez.
La distinción real del prompting y el RAG es dónde vive el cambio. El prompting y el RAG dejan el modelo congelado y lo dirigen a través del contexto que suministras en el momento de la llamada. El ajuste fino cambia el modelo mismo, para que el nuevo comportamiento esté incorporado y se muestre incluso con un prompt corto. No estás dando mejores instrucciones en tiempo de ejecución; estás enviando un modelo que ya se inclina de la manera que deseas.
En la práctica le pasas al proveedor un archivo de ejemplos de conversaciones, ejecuta un trabajo de entrenamiento, y te devuelve un nuevo id de modelo. Llamas ese id exactamente como cualquier otro modelo, excepto que sus respuestas ahora reflejan lo que entrenaste. El ajuste fino mueve el comportamiento hacia el modelo, el prompting y el RAG dirigen uno congelado.
En qué es bueno y en qué no
El ajuste fino gana su lugar cuando necesitas un comportamiento consistente que un prompt lucha por asegurar: un formato de salida preciso cada vez, un tono específico o un estilo de casa, o una tarea estrecha como clasificación hecha de manera confiable en miles de llamadas. También puede hacer que las llamadas sean más baratas y rápidas, porque el comportamiento que de otro modo deletrearías en un prompt largo se incorpora al modelo, por lo que tus prompts se acortan.
Donde falla es en conocimiento. El ajuste fino es pobre para enseñar a un modelo nuevos hechos, y peor para hechos que cambian. Los ejemplos de entrenamiento se desdibujan en patrones generales en lugar de almacenarse como entradas exactas y buscables, por lo que un modelo ajustado fino aún inventa detalles y aún se vuelve obsoleto el momento en que tu información se actualiza. Re-entrenar cada vez que un precio o una política cambia es lento y costoso. Cuando el problema es "el modelo no sabe X", la respuesta es casi siempre RAG, no ajuste fino.
La regla de oro: ajusta fino para cambiar la forma, no para añadir hechos. Enseña al modelo cómo responder, y deja que la retrieval maneje qué responder.
¿Prompt, RAG o ajuste fino?
La mayoría de las veces no comienzas aquí. Las tres técnicas forman una escalera, más barata y rápida de cambiar primero:
- Prompting. Siempre intenta esto primero. Es instantáneo de iterar, no cuesta nada extra, y un prompt claro con un par de ejemplos resuelve más de lo que la gente espera. Si no has hecho que el prompt funcione, no estás listo para ajuste fino.
- RAG. Recurre a esto cuando la brecha es conocimiento: el modelo necesita hechos que no tiene, o que cambian con el tiempo. RAG los suministra en el momento de la pregunta sin tocar el modelo.
- Ajuste fino. Recurre a esto cuando la brecha es comportamiento en lugar de conocimiento y el prompting no puede hacerlo consistente suficientemente, o cuando tus prompts se han vuelto tan largos que incorporar las instrucciones en el modelo es más barato y rápido a escala.
No son exclusivos, y los sistemas más fuertes los combinan: ajusta fino un modelo para tu forma y tono, luego usa RAG para alimentarlo con hechos actuales en tiempo de ejecución. Comportamiento del entrenamiento, conocimiento de retrieval.
Así que una prueba rápida antes de que ajustes fino. ¿Puedes llegar allá con un mejor prompt? Entonces haz eso. ¿Es la brecha conocimiento faltante? Entonces es RAG.
Sube la escalera; el ajuste fino es el último escalón, no el primero. Solo cuando el prompt ya es correcto, los hechos ya están disponibles, y el modelo aún no se comportará de manera lo suficientemente consistente es que el ajuste fino se convierte en la herramienta que encaja.
En la práctica
Los datos de ajuste fino no son nada exótico. Cada ejemplo es una conversación corta en la forma exacta que envías en tiempo de ejecución, terminando con la respuesta que deseas que el modelo hubiera dado:
# Algunos mostrados aquí; un conjunto de datos real es cientos a miles de ejemplos,
# cubriendo el rango completo de entradas que esperas en tiempo de ejecución.
training_examples = [
{"messages": [
{"role": "system", "content": "Clasifica la urgencia del ticket como baja, media o alta."},
{"role": "user", "content": "Me cobraron dos veces esta semana y necesito que se corrija hoy."},
{"role": "assistant", "content": "alta"},
]},
{"messages": [
{"role": "system", "content": "Clasifica la urgencia del ticket como baja, media o alta."},
{"role": "user", "content": "¿Hay una configuración de modo oscuro en algún lugar?"},
{"role": "assistant", "content": "baja"},
]},
# ...
]Guardas estos en un archivo, inicias un trabajo de entrenamiento con el proveedor, y esperas a que termine. Lo que vuelve es un nuevo id de modelo, que luego llamas exactamente como cualquier otro modelo:
# El modelo ajustado fino es otro id; todo lo demás no cambia.
response = client.chat.completions.create(
model="your-org/urgency-classifier-v1",
messages=[
{"role": "system", "content": "Clasifica la urgencia del ticket como baja, media o alta."},
{"role": "user", "content": "El botón de exportación no hace nada cuando hago clic en él."},
],
)
# response.choices[0].message.content -> "baja" (solo la etiqueta, el comportamiento que entrenaste)La victoria es que el comportamiento ahora vive en el modelo. Las instrucciones pueden ser más cortas, el formato se mantiene en miles de llamadas, y no tuviste que crecer el prompt para llegar allá. El costo es todo lo que hay alrededor: necesitas un conjunto de datos de calidad, una ejecución de entrenamiento, y un trabajo fresco cada vez que deseas cambiar lo que aprendió, que es exactamente por qué esto se sienta al fondo de la escalera. Carga ejemplos, obtén un id de modelo, llámalo como cualquier otro.
Ese es el último de los caminos para dar forma a lo que un modelo sabe y cómo responde, todos los cuales lo dejan prediciendo texto en un escritorio que arreglaste. Los próximos capítulos le dan la capacidad de actuar: en Uso de herramientas el modelo llama a tus propias funciones, y luego las ejecuta en un bucle como agente.

