Tutorial: Cómo hacer fine-tuning a GPT-3.5 de OpenAI

Tutorial: Cómo hacer fine-tuning a GPT-3.5 de OpenAI

Bienvenidos a este tutorial completo sobre cómo hacer fine-tuning al modelo GPT-3.5 de OpenAI. Hoy vamos a abordar los beneficios del fine-tuning, los pasos recomendados por OpenAI y un ejemplo práctico para que puedas hacerlo tú mismo. ¡Vamos al grano!

Si prefieres ver este tutorial en formato vídeo, puedes revisarlo aquí:

¿Por qué hacer fine-tuning?

Beneficios del fine-tuning

OpenAI ha dado la posibilidad de que GPT-3.5 pueda ser fine-tuneado, permitiendo a los desarrolladores utilizar sus propias bases de datos para personalizar el modelo según sus necesidades.

  1. Mejor Manejo del Modelo: El fine-tuning permite que el modelo siga instrucciones de manera más precisa, como entregar respuestas más concisas o responder de una manera específica según el lenguaje dado.
  2. Aumento de la Confianza en el Formato de los Outputs: Con el fine-tuning, el modelo puede formatear respuestas de manera más consistente, lo cual es crucial en aplicaciones donde se necesitan formatos específicos como JSON.
  3. Personalización del Tono de los Outputs: Esta es una excelente manera de adaptar el modelo a la voz y tono de una marca o empresa
  4. Ahorro de tokens. Al usar indicaciones más cortas, ahorras tokens, lo cual es una ventaja no menor.

Consideraciones Adicionales

El fine-tuning es aún más poderoso cuando se combina con otros métodos como Information Retrieval o Function Calling. OpenAI ofrece guías adicionales para implementar estas características.

Es importante considerar cuándo es más apropiado usar fine-tuning en lugar de otras estrategias. Recomendamos primero intentar obtener buenos resultados con ingeniería de indicaciones (prompt engineering) antes de aventurarse en el fine-tuning.

Cómo Hacer Fine-Tuning: Pasos a seguir

OpenAI recomienda seguir cuatro pasos básicos para realizar el fine-tuning.

Instalación y configuración

Primero, instala las librerías necesarias y configura tu API Key de OpenAI.

%pip install openai tiktoken langchain
import config
import os
os.environ['OPENAI_API_KEY'] = config.OPENAI_API_KEY

Paso 1: Preparar los Datos

Antes de subir tus datos, asegúrate de que cumplan con los formatos específicos requeridos por OpenAI. En general, este paso es el que más tiempo de dedicación necesitará.

Formato Requerido

OpenAI entrega un ejemplo de cómo deberían verse las conversaciones de entrenamiento:

{
  "messages": [
    { "role": "system", "content": "You are an assistant that occasionally misspells words" },
    { "role": "user", "content": "Tell me a story." },
    { "role": "assistant", "content": "One day a student went to schoool." }
  ]
}

Para el fine-tuning, se requiere un mínimo de 10 ejemplos. Sin embargo, generalmente vemos mejoras claras con 50 a 100 ejemplos.

Adicionalmente, OpenAI nos entrega scripts que podemos utilizar para estimar el costo del fine-tuning y validar si el formato de nuestra base de datos cumple los requerimientos.

  • Training: $0.008 / 1K Tokens
  • Usage input: $0.012 / 1K Tokens
  • Usage output: $0.016 / 1K Tokens

Paso 2: Subir los Datos a los Servidores de OpenAI

Una vez que tus datos estén listos y en el formato correcto, el siguiente paso es subirlos a los servidores de OpenAI. Puedes usar File de la librería openai. A continuación te mostramos un ejemplo donde hacemos el ejercicio de subir un llamado dataset_ejemplos.jsonl.

response_file = openai.File.create(
    file=open('dataset_ejemplos.jsonl','rb'),
    purpose='fine-tune'
)

En el ejemplo response_file tiene toda la información de la solicitud creada a los servidores de OpenAI. Entre ellos, te sugerimos guardar el atributo id, pues lo necesitarás.

Paso 3: Crear el Trabajo de Fine-Tuning

En este paso se crea el trabajo de fine-tuning utilizando los datos subidos. Es aquí donde se decide qué modelo se va a fine-tunear y con qué parámetros. Además entregamos el id del archivo que usaremos en el fine-tuning. Esto lo hacemos con FineTuningJob de la librería openai. A continuación un ejemplo usando el id que recibimos como respuesta en el caso anterior.

response = openai.FineTuningJob.create(training_file=response_file.id,
                                       model="gpt-3.5-turbo",
                                       suffix='nombre-modelo',
                                       hyperparameters={'n_epochs':4})

El argumento suffix nos permite agregar un sufijo al id del modelo fine-tuneado. Recomendamos usarlo para gestionar mejor tus trabajos de fine-tuning.

Paso 4: Utilizar el Modelo Fine-Tuneado

Una vez que OpenAI confirma que el fine-tuning ha terminado por medio de un correo (ver Figura 1), podrás empezar a utilizar tu nuevo modelo. Para esto usas el id que OpenAI le asigna al modelo fine-tuneado. Por ejemplo, con langchain y asumiendo que el id entregado es ft:gpt-3.5-turbo-0613:evo-academy:burro-shrek, hacemos un llamado de la siguiente manera:

chat = ChatOpenAI(model='ft:gpt-3.5-turbo-0613:evo-academy:burro-shrek', 
				temperature=0.0)

print(chat('Hola burro! Cómo estás?')
Figura 1. Correo de confirmación de OpenAI.

Ejemplo Práctico

Para hacer todo esto más fácil de entender, hemos preparado un Notebook con un ejemplo práctico. Puedes encontrar el Notebook aquí, el cual contiene un ejemplo donde le enseñamos a ChatGPT a hablar como el Burro de Shrek. Si aún te quedan dudas, puedes revisar el tutorial en formato vídeo al principio de este post.

Conclusión

Esperamos que este tutorial te haya sido de ayuda para entender cómo realizar un fine-tuning exitoso con GPT-3.5 de OpenAI.

Preguntas Frecuentes (FAQ)

¿Cómo sé si mi modelo afinado es mejor que el modelo base?

Recomendamos generar muestras tanto del modelo base como del modelo afinado en un conjunto de prueba de conversaciones de chat, y comparar las muestras lado a lado.

¿Puedo seguir afinando un modelo que ya ha sido afinado?

No, actualmente no se permite continuar el proceso de fine-tuning una vez que un trabajo ha terminado.