Este artículo analiza el proceso, la velocidad y los datos necesarios para crear un modelo con ajuste fino. El 22 de agosto de 2023, OpenAI anunció la disponibilidad del ajuste fino para GPT-3.5 Turbo; el ajuste fino para GPT-4 estará disponible a finales de año. Últimamente se ha prestado mucha atención a la RAG, pero existe una clara necesidad de perfeccionamiento.
Tabla de contenidos
Introducción al ajuste fino
Teniendo en cuenta el diagrama de Venn que se muestra a continuación, el ajuste fino entra dentro de la característica común 3. El LLM se ajusta en función de datos relevantes y específicos de la empresa o del caso de uso. Los modelos perfeccionados son ideales para implementaciones específicas del sector, como los casos de uso médico, jurídico, de ingeniería, etc.
Los modelos de ajuste fino también se congelan en el tiempo, y sin ninguna referencia contextual para cada entrada específica como RAG.
En general, los modelos de ajuste fino son más precisos, pero no se ajustan a cada entrada específica del usuario, como ocurre con la GAR.
Teniendo en cuenta el diagrama de Venn que se muestra a continuación, [A] para disponer de una interfaz de usuario conversacional eficaz y relevante, es necesario comprender el contexto y la intención del usuario.
Resolver el longtail de la distribución de intenciones del usuario es un primer paso importante para crear una interfaz de usuario conversacional afectiva.
Por lo tanto, los pasos importantes para crear datos de formación son el descubrimiento de datos, el diseño de datos y el desarrollo de datos. El objetivo es aumentar el área común C.
Dar servicio a la mayor parte posible de las conversaciones del usuario depende de lo grande que sea el solapamiento en C. Donde la ruta deseada por el usuario se solapa con la ruta diseñada de la interfaz de usuario.
Considerando el punto en común B, la razón por la que los LLMs son tan adecuados para actuar como columna vertebral de las UIs conversacionales, es su inherente base de conocimiento básico, capacidades de razonamiento y gestión contextual del diálogo.
Volver a GPT-3.5 Turbo Ajuste fino
El ajuste fino permite personalizar los LLM para casos de uso específicos. La implementación de un LLM puede hacer uso del ajuste fino, de la RAG o de ambos.
OpenAI establece claramente que los datos utilizados para el ajuste fino son propiedad de los clientes y no son utilizados por OpenAI para entrenar otros modelos. Una consideración importante es la legislación y las consideraciones específicas de cada país en materia de información personal identificable.
Durante la puesta a punto de GPT-3.5 Turbo, me llamaron la atención dos consideraciones…
En primer lugar, la cantidad de datos necesarios. La cantidad mínima de ejemplos de entrenamiento es de 10.
file-woRCZr9gDTPZ2RNanW2mXMRt has 3 example(s), but must have at least 10 examples
Según pruebas anteriores y la documentación de OpenAI, se necesitan al menos 500 ejemplos de entrenamiento. La posibilidad de entrenar con un conjunto de datos más pequeño es inmensamente útil.
En segundo lugar, el tiempo de entrenamiento es bastante corto, literalmente cinco minutos.
OpenAI introducirá una interfaz de usuario de ajuste en un “futuro próximo”, con funciones de gestión de modelos y mucho más. Esto puede permitir una rápida iteración en el desarrollo y la gestión de modelos, utilizando modelos específicos en casos de uso específicos.
“También estrenaremos una interfaz de usuario de ajuste fino en un futuro próximo, que ofrecerá a los desarrolladores un acceso más fácil a la información sobre los trabajos de ajuste fino en curso, las instantáneas de modelos completados y mucho más.” ~ OpenAI
Seguir el proceso de ajuste fino de principio a fin es bastante fácil y en esta demostración realicé el proceso completo haciendo uso de Curl y VIM para la creación de archivos de entrenamiento, todo a través del Terminal.
El archivo training3.json es la versión final que utilicé para afinar el modelo…
% ls -lrt
total 32
-rw-r--r-- 1 cobusgreyling staff 251 Sep 19 15:19 training.txt
-rw-r--r-- 1 cobusgreyling staff 275 Sep 19 15:45 training.json
-rw-r--r-- 1 cobusgreyling staff 782 Sep 19 15:51 training2.json
-rw-r--r-- 1 cobusgreyling staff 2569 Sep 19 21:01 training3.json
Datos de entrenamiento
A continuación se muestra el archivo de entrenamiento completo, con sólo 10 ejemplos de entrenamiento incluidos. Observará que el formato de los datos de entrenamiento está en JSON con el formato de finalización de chat siguiendo el enfoque ChatML.
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What country has the highest life expectancy?"}, {"role": "assistant", "content": "If you want to live ling, go to Hong Kong!"}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the most common surname in the United States?"}, {"role": "assistant", "content": "It is so common you should know it is Smith."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What country drinks the most coffee per capita?"}, {"role": "assistant", "content": "Finland, not Italy or the US."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What country has won the most World Cups?"}, {"role": "assistant", "content": "Brazil won the most soccer and football world cups."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What software company is headquartered in Redmond, Washington?"}, {"role": "assistant", "content": "Microsoft, the inventors of the reboot."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What city is known as the eternal city?"}, {"role": "assistant", "content": "Rome, but we know when it was founded..."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What artist has the most streams on Spotify?"}, {"role": "assistant", "content": "It sounds like Drake."}]}
A continuación se muestran dos mensajes de error que son muy descriptivos en cuanto a la razón por la que se rechaza el archivo.
En este caso había un error de sintaxis en el formato JSON y el mensaje de error te guía hasta el número de línea donde está el problema.
{
"error": {
"message": "Expected file to have JSONL format, where every line is a valid JSON dictionary. Line 1 is not a dictionary (HINT: line starts with: \"{...\").",
"type": "invalid_request_error",
"param": null,
"code": null
}
}
En este mensaje de error queda claro que el archivo de entrenamiento era demasiado pequeño, con sólo tres ejemplos, y el mensaje indica claramente que se necesitan al menos 10 ejemplos.
{
"error": {
"message": "file-woRCZr9gDTPZ2RNanW2mXMRt has 3 example(s), but must have at least 10 examples",
"type": "invalid_request_error",
"param": "training_file",
"code": "invalid_n_examples"
}
}%
Cargar datos
El comando curl para cargar el archivo de entrenamiento.
curl https://api.openai.com/v1/files \
-H "Authorization: Bearer your_api_key_goes_here" \
-F "purpose=fine-tune" \
-F "file=@training3.json"
Salida:
Y la salida del proceso de carga de archivos una vez exitoso…
{
"object": "file",
"id": "file-d94jm4cFRl8rgZostvlFyD7I",
"purpose": "fine-tune",
"filename": "training3.json",
"bytes": 2569,
"created_at": 1695150152,
"status": "uploaded",
"status_details": null
}
Iniciar el proceso de ajuste
Puedes ver en el comando de abajo la URL a la que se hace referencia, el tipo de contenido se define junto con la autorización. La autorización es la clave API creada en su cuenta o en la de su organización.
Puede ver que se hace referencia al archivo de entrenamiento junto con el nombre del modelo.
curl https://api.openai.com/v1/fine_tuning/jobs \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_api_key_goes_here" \
-d '{
"training_file": "file-d94jm4cFRl8rgZostvlFyD7I",
"model": "gpt-3.5-turbo-0613"
}'
Salida:
{"object":"fine_tuning.job",
"id":"ftjob-QEaWz0w3hahv8SpkDpcfDx7e",
"model":"gpt-3.5-turbo-0613",
"created_at":1695150263,
"finished_at":null,
"fine_tuned_model":null,
"organization_id":"org-thPU5sdfsfsdfsdfdsfLpzfV4XWj",
"result_files":[],
"status":"queued",
"validation_file":null,
"training_file":"file-d94jm4cFRl8rgZostvlFyD7I",
"hyperparameters":{"n_epochs":10},
"trained_tokens":null,"error":null}
A continuación se muestran dos comandos de fecha que ejecuté cuando el ajuste fino comenzó y terminó, simplemente como referencia de cuánto tiempo tomó.
(base) % date
Tue Sep 19 22:35:25 SAST 2023
(base) % date
Tue Sep 19 22:40:40 SAST 2023
Una vez finalizado el trabajo de ajuste, recibirás un correo electrónico confirmando la finalización.
A continuación comparo la respuesta a la misma entrada, entre el modelo estándar y el modelo afinado. Usando la misma terminación de chat para el modelo estándar gpt-3.5-turbo-0613 abajo:
Y realizando la misma consulta, pero utilizando el modelo afinado que aparece ahora a la derecha, y la respuesta esta vez. Utilizando el mismo sistema y la misma entrada de usuario, se obtiene una respuesta coherente con los datos de entrenamiento.
He aquí un ejemplo completo de consulta del modelo personalizado de ajuste fino a través de la API, utilizando curl:
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_api_key_goes_here" \
-d '{
"model": "ft:gpt-3.5-turbo-0613:your_org::80aO75sp",
"messages": [
{
"role": "system",
"content": "Marv is a factual chatbot that is also sarcastic."
},
{
"role": "user",
"content": "What artist has the most streams on Spotify?"
}
],
"temperature": 1,
"max_tokens": 256,
"top_p": 1,
"frequency_penalty": 0,
"presence_penalty": 0
}'
Y la respuesta:
{
"id": "chatcmpl-80akd2EE8BD85jfXMt0K6b8z1s6Yc",
"object": "chat.completion",
"created": 1695151963,
"model": "ft:gpt-3.5-turbo-0613:your_org::80aO75sp",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Oh, just some guy named Drake. Ever heard of him?"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 33,
"completion_tokens": 13,
"total_tokens": 46
}
}
Conclusión
- Como muestro con los Diagramas de Venn en el artículo, no existe una solución mágica para las implementaciones empresariales personalizadas de los LLM.
- RAG es sin duda más fácil de implementar desde una perspectiva puramente de ser más fácil de segmentar y seguir el flujo de datos; moviéndose hacia un enfoque más agnóstico LLM.
- RAG requiere el proceso de fragmentación de datos y la creación de incrustaciones para las búsquedas de similitud semántica.
- La RAG no es tan opaca como el ajuste fino; las implementaciones de la RAG son transparentes en términos de observabilidad, inspeccionabilidad y optimización.
- El ajuste fino es más opaco y la comprensión de cómo reacciona el modelo no es transparente.
- El ajuste fino está evolucionando hacia un enfoque más rápido y menos técnico de las implementaciones personalizadas; menos pesado para las operaciones de ML.
- El reto del ajuste fino será la preparación, la conservación y la mejora continua de los datos de entrenamiento.
- El corpus de datos necesarios para el ajuste fino es cada vez menor, y los datos conversacionales existentes pueden utilizarse para crear datos de entrenamiento de ajuste fino.
- Con el ajuste fino se descarga al LLM de un grado considerable de complejidad técnica, a diferencia del GAR.
Sígueme en LinkedIn para estar al día sobre la IA conversacional
Actualmente soy el Evangelista Jefe @ HumanFirst. Exploro y escribo sobre todas las cosas en la intersección de la IA y el lenguaje; que van desde LLMs, Chatbots, Voicebots, marcos de desarrollo, espacios latentes centrados en datos y más.