Con la popularización de los grandes modelos de lenguaje (LLMs) en los últimos años, no son pocas las empresas dedicadas a la inteligencia artificial que han liberado sus modelos de generación de texto. Estos modelos abarcan distintos tamaños y capacidades, lo que con el tiempo se ha traducido en servicios cada vez más competitivos tanto en términos de precio como de rendimiento. Por estas razones, modelos como GPT se han convertido en opciones atractivas para proyectos de organizaciones y particulares que requieran de generación de texto y la agilidad que proporciona su API.
Además de los populares modelos que ofrece OpenAI, otras empresas y comunidades open-source también han expandido el catálogo de modelos de generación de texto, desde aquellos que requieren de hardware de alto rendimiento para su ejecución hasta algunos que obtienen buenos resultados incluso en equipos domésticos.
En medio de esta vorágine de modelos y servicios, surge una pregunta crucial: ¿es siempre más ventajoso un modelo como servicio en la nube vía API (por ejemplo, GPT), o existen escenarios en los que tiene más sentido optar por un modelo ejecutado en local o fine-tuneado? En este post exploraremos con un caso de uso por qué hacer fine-tuning sigue siendo relevante y, en algunos casos, representa una mejor solución frente a enfoques basados únicamente en prompting.
¿Qué es el fine-tuning?
Para entender el concepto de fine-tuning, partimos de la base de que los modelos de lenguaje que queremos utilizar han sido previamente entrenados. Este pre-training o pre-entrenamiento consiste en alimentar a un algoritmo (en este caso, una red neuronal) con una gran cantidad de información que le ayudará a encontrar patrones y aprender sobre ellos.
Sin embargo, el modelo de generación de texto obtenido después de este entrenamiento puede ser demasiado generalista; para tareas específicas, no es suficiente con que el modelo sepa un poco de muchas cosas, pero nunca sea experto en una tarea concreta. Aquí es donde entra el fine-tuning, un proceso que aprovecha el conocimiento del modelo pre-entrenado y se ajusta con nuevos datos específicos para mejorar su rendimiento en una tarea concreta.
Ventajas del fine-tuning de modelos de lenguaje
Una de las grandes ventajas del fine-tuning es que nos aprovechamos del pre-entrenamiento realizado por los creadores del modelo, para simplemente añadirle una capa de personalización que necesitará una fracción del tiempo y del hardware que se requirieron para entrenarlo originalmente.
Otra de las ventajas de desplegar estos modelos en local es que tenemos el control total de los datos utilizados, aumentando así la privacidad y seguridad de los mismos. Además, tenemos la opción de elegir entre un gran catálogo de modelos dependiendo de nuestro objetivo y hardware disponible.
En los años anteriores al boom de la IA generativa, estos procedimientos eran el estado del arte en la mayoría de los problemas de procesamiento del lenguaje natural (PLN). Sin embargo, ¿siguen siendo relevantes hoy en día en casos del mundo real? Vamos a poner el fine-tuning a prueba con un ejercicio de generación de texto.
Caso de generación de texto: chatbot sobre documentación
Supongamos que necesitamos un chatbot capaz de responder preguntas a un usuario en base a una documentación. Además, necesitamos que esas respuestas sean lo más concisas posible, creando una conversación directa y ágil. Es decir, el desafío de la tarea no es únicamente que la respuesta generada por el modelo sea correcta, sino que además debe seguir el formato que nosotros dictemos. Un ejemplo de esto:
- Usuario: ¿Cómo cierro la aplicación?
- Contexto: La aplicación se cierra pulsando la X en la barra superior.
- Respuesta esperada: La aplicación se cierra pulsando la X en la barra superior.
- Respuesta correcta pero extensa: Según el contexto ofrecido, la aplicación se cierra pulsando la X de la barra superior, pudiendo reanudarse en cualquier momento ejecutándola de nuevo. Además, si no quieres cerrarla completamente, puedes pulsar el botón de Minimizar, ocultando así la pestaña de la aplicación. Si necesitas más información, vuelve a escribirme. ¿Necesitas algo más?
- Respuesta incorrecta: No se puede cerrar la aplicación.
Como podemos ver, esperamos que la respuesta del modelo sea correcta a la vez que concisa. Para evaluar estas respuestas, hemos desarrollado una metodología que tiene en cuenta distintas dimensiones de las respuestas de los modelos.
Evaluación de las respuestas de un sistema de RAG
En el Instituto de Ingeniería del Conocimiento (IIC) hemos desarrollado una metodología de evaluación para medir el acierto en tareas de extracción de texto de una documentación en base a una pregunta o solicitud. O lo que es lo mismo, evaluar las respuestas de un sistema de RAG (Retrieval-Augmented Generation).
Para evaluar el rendimiento de los modelos utilizados para el problema descrito, se utiliza un corpus de 200 conversaciones con 3 preguntas y respuestas cada una. Este corpus ha sido creado y supervisado manualmente por lingüistas computacionales del IIC. Además, este corpus está dividido en dos splits, uno para el entrenamiento (fine-tuning) de modelos y otro para el test.
El modelo será valorado del 1 al 5 en base a los siguientes criterios:
- Relevancia de la respuesta: observa si esta resulta apropiada para la pregunta planteada, responde bien y es relevante.
- Relevancia del contexto: evalúa si el contexto (fragmento de texto literal) que se ha seleccionado es adecuado, incluye toda la información y es relevante para la pregunta.
- Fundamentación de la respuesta del contexto: comprueba si la respuesta que se genera está basada en el contexto de forma correcta y no contiene información inventada, errónea o que sobre.
Experimentos con modelos de lenguaje de generación de texto
Una vez tenemos claro el objetivo del sistema de RAG, los criterios de evaluación sobre la generación de texto y el corpus construido por lingüistas computacionales, procedemos con los experimentos. En primer lugar, utilizaremos un modelo sin fine-tunear para esta tarea concreta y, en segundo lugar, un modelo fine-tuneado con el corpus de lingüistas.
Modelo sin fine-tunear (API)
Para esta evaluación, hemos escogido el modelo GPT 3.5, al ser un modelo de los más económicos de OpenAI pero a la vez realmente útil para muchas tareas de generación de texto. Para evaluarlo, hemos utilizado el split de test del corpus de preguntas y respuestas y se lo hemos proporcionado al modelo como contexto.
Finalmente, la media de los tres criterios de evaluación en estas preguntas y respuestas resulta en un valor de 3,59 sobre 5. A primera vista, parece que conseguimos que el modelo responda de manera coherente y acorde al contexto. Sin embargo, tras un análisis más exhaustivo, se observan ciertas respuestas problemáticas.
Por un lado, el modelo tiende a añadir coletillas acerca del contexto en casi todas sus respuestas: “Según el contexto ofrecido…”, “De acuerdo con el contexto dado…”, etc. Por otro lado, en ocasiones el modelo es incapaz de encontrar la respuesta en el contexto que se le ofrece (a pesar de sí encontrarse en el texto proporcionado), dando respuestas como «La información que pides no se encuentra en el contexto” además de disculparse constantemente. Si bien dependiendo de la estrategia de prompting conseguimos algo de mejoría, el modelo no se comporta tan bien como querríamos.
Como hemos visto, el comportamiento del modelo dista mucho de conseguir un resultado acorde a las exigencias de la tarea, aunque no llega a ser del todo malo y presenta unas métricas de evaluación por encima del 3.5. Por tanto, veamos si somos capaces de superarlo mediante el fine-tuning de un modelo open-source.
Modelo fine-tuneado
El modelo escogido para fine-tunear y ser desplegado en local ha sido StableLM, desarrollado por Stability AI, en su versión de 12B de parámetros, siendo este un modelo muy capaz para la generación de texto en español.
En cuanto al proceso de fine-tune, hemos utilizado el split de entrenamiento creado por lingüistas, reservando el resto para la evaluación. Tras evaluar las respuestas del modelo fine-tuneado mediante los 3 criterios de evaluación anteriormente mencionados, el modelo obtiene una puntuación de 4.52 sobre 5. Esto supone un aumento de casi 1 punto sobre GPT 3.5. Entre otras cosas, se observa que las respuestas de este modelo incluyen menos coletillas y disculpas en los casos en los que la información no se encuentra en los contextos. Además, encontramos que las respuestas son, de media, más acertadas que las del modelo de OpenAI, ya que tiene mayor capacidad de encontrar la información en el contexto dado.
Una vez analizados los resultados de los experimentos, podemos concluir que, para esta tarea de generación de texto en base a un sistema de RAG, fine-tunear un modelo y desplegarlo en local ha sido realmente útil. No solo hemos conseguido que el modelo responda de manera más acertada, sino que también se ha amoldado mejor al formato de respuesta que esperábamos. Por su parte, el acercamiento de GPT 3.5 ha demostrado que no es capaz de responder en dicho formato. Además, no siempre es capaz de encontrar la información que le pedimos, resultando en respuestas incorrectas en algunos casos.
Teniendo todo lo anterior en cuenta, queda clara la utilidad de desarrollar corpus de entrenamiento anotados manualmente en conjunto con el fine-tune de modelos. Vemos que esta metodología sigue siendo un enfoque muy valioso en tareas no triviales como sistemas de RAG, ya que los modelos más generalistas no siempre son capaces de generar respuestas precisas, y el ajuste que permite el fine-tuning ayuda a obtener resultados más precisos.
¡Te ayudamos, escríbenos!