En este tutorial, ajustaremos un modelo IBM® Granite mediante un conjunto de datos sintéticos que contiene reseñas de clientes de una empresa de peluquería canina.
El ajuste de instrucciones es una forma eficiente y económica de adaptar un modelo fundacional de inteligencia artificial (IA) a nuevas tareas posteriores sin volver a entrenar todo el modelo y actualizar sus ponderaciones.
Los modelos fundacionales se basan en modelos de lenguaje de gran tamaño (LLM) y reciben grandes cantidades de datos de entrenamiento. Los casos de uso comunes de los modelos fundacionales son los chatbots y los asistentes virtuales.
Hay varias formas de mejorar la interpretación de la entrada de un modelo fundacional y la calidad de sus respuestas. Para comprender mejor estos matices, comparemos algunos de los métodos.
Las instrucciones estrictas están orientadas al usuario y requieren la acción del usuario. Una instrucción estricta puede considerarse como una plantilla o instrucciones para que el LLM genere respuestas. A continuación se presenta un ejemplo de una instrucción estricta. Le recomendamos que consulte la página de documentación de IBM para obtener más información sobre este tipo de instrucción y otras muchas.
Con esta plantilla de instrucciones, se puede proporcionar a un LLM instrucciones específicas sobre la estructura y el estilo de resultado preferidos. A través de esta instrucción explícita, el LLM tendría más probabilidades de producir respuestas deseables de mayor calidad.
Las instrucciones suaves, a diferencia de las instrucciones estrictas, no están escritas en lenguaje natural. En su lugar, las instrucciones se inicializan como vectores numéricos generados por IA que se añaden al inicio de cada embedding de entrada que destila conocimiento del modelo más grande. Esta falta de interpretabilidad se extiende a la IA que elige instrucciones optimizadas para una tarea determinada. A menudo, la IA no puede explicar por qué eligió esas incrustaciones. En comparación con otros métodos de prompting, estos tokens son menos costosos desde el punto de vista informático que la afinación, ya que el propio modelo permanece congelado con ponderaciones fijas. Las instrucciones suaves también tienden a superar a las instrucciones duras creadas por humanos.
En este tutorial trabajaremos con instrucciones suaves para ajustar las instrucciones.
Necesita una cuenta de IBM® Cloud para crear un proyecto watsonx.ai .
Aunque puede elegir entre varias herramientas, este tutorial le muestra cómo configurar una cuenta de IBM para utilizar un Jupyter Notebook.
Inicie sesión en watsonx.ai utilizando su cuenta de IBM Cloud.
Cree un proyecto watsonx.ai.
Puede obtener el ID de su proyecto desde dentro del propio proyecto. Haga clic en la pestaña Administrar. A continuación, copie el ID del proyecto de la sección Detalles de la página General. Necesita este ID para este tutorial.
Cree un Jupyter Notebook.
Este paso abrirá un entorno de Notebook donde podrá copiar el código de este tutorial para implementar el ajuste de instrucciones por su cuenta. También puede descargar este notebook en su sistema local y subirlo a su proyecto watsonx.ai como activo. Este Jupyter Notebook junto con los conjuntos de datos utilizados se pueden encontrar en GitHub.
Cree una instancia de servicio de watsonx.ai Runtime (seleccione la región adecuada y elija el plan Lite, que es una instancia sin coste).
Genere una clave API.
Asocie la instancia del servicio watsonx.ai Runtime al proyecto que ha creado en watsonx.ai.
Necesitaremos algunas bibliotecas y módulos para este tutorial. Asegúrese de importar los siguientes; si no están instalados, puede resolverlo con una instalación rápida de pip.
Configure sus credenciales. Introduzca su clave API y el ID del proyecto.
Como primer paso para establecer el entorno, cree una instancia de APIClient con sus detalles de autenticación y establezca su project_id .
Resultado:
"ÉXITO"
Para este tutorial, utilizaremos un conjunto de datos sintéticos que consiste en reseñas de empresas de peluquería canina. Mediante el uso de la URL adecuada, podemos conectar el conjunto de datos al cliente API.
Puede utilizar cualquier conjunto de datos de su elección. Varios conjuntos de datos de código abierto están disponibles en plataformas como HuggingFace.
Resultado:
Creando activo de datos...
ÉXITO
Resultado:
3b1db894-8d9e-428d-8fee-d96f328c7726
Para obtener conocimiento sobre el formato de estas reseñas de clientes, carguemos los datos en un marco de datos de Pandas e imprimamos algunas filas que muestren reseñas tanto positivas como negativas. Un resultado de "1" denota reseñas positivas y "0" se utiliza para reseñas negativas.
Resultado:
La clase TuneExperiment se utiliza para crear experimentos y programar ajustes. Usémoslo para inicializar nuestro experimento y establecer nuestro modelo fundacional, datos de entrenamiento y parámetros. El objetivo de este ejercicio de ajuste de instrucciones es que el LLM adapte sus respuestas de acuerdo con las calificaciones de satisfacción del cliente extraídas de nuestro conjunto de datos. Se trata de una tarea de clasificación, ya que las reseñas pueden clasificarse como positivas ("1") o negativas ("0").
Para este tutorial, sugerimos utilizar un modelo de IBM® Granite como modelo de lenguaje de gran tamaño para lograr resultados similares.
Ahora que tenemos configurado nuestro experimento de ajuste, necesitamos conectarlo a nuestro conjunto de datos. Para esto, usemos la clase DataConnection . Esto requiere el asset_id que producimos anteriormente al iniciar el activo de datos con nuestro cliente API.
Puede utilizar cualquier modelo de IA de su elección. Los modelos fundacionales disponibles para ajustar a través de watsonx se pueden encontrar aquí o ejecutando el siguiente comando.
Resultado:
{'FLAN_T5_XL': 'google/flan-t5-xl', 'GRANITE_13B_INSTRUCT_V2': 'ibm/granite-13b-instruct-v2', 'LLAMA_2_13B_CHAT': 'meta-llama/llama-2-13b-chat'}
Resultado:
##############################################
Running '20671f17-ff53-470b-9bfe-04318ecb91d9'
##############################################
pending......
running....................................................................................................................................
completed
Training of '20671f17-ff53-470b-9bfe-04318ecb91d9' finished successfully.
Para asegurarnos de que nuestra instrucción ha concluido, podemos comprobar el estado. Si el estado que se imprime no es "completado", espere a que finalice el ajuste antes de continuar.
Resultado:
completado
Ahora podemos recuperar el resumen de instrucción. En este resumen, verá un valor de pérdida. Para cada ejecución de entrenamiento, la función de pérdida mide la diferencia entre los resultados previstos y los reales. Por lo tanto, se prefiere un valor de pérdida más bajo.
También podemos trazar la curva de aprendizaje del ajuste de nuestro modelo utilizando la función plot_learning_curve() . Una curva con pendiente negativa que se nivela cerca de cero indica que el modelo está mejorando su generación de resultado esperada. Para obtener más información sobre la interpretación de los gráficos de función de pérdida, consulte la documentación relevante de IBM watsonx.
Resultado:
Este paso de implementar el modelo ajustado es crítico para completar el siguiente paso de comparar el rendimiento del modelo ajustado con el modelo preajustado.
Nota: SERVING_NAME se establece en la fecha y hora actuales, ya que debe ser un valor único.
Resultado:
######################################################################################
Synchronous deployment creation for id: '6aa5dd5c-0cc4-44e0-9730-18303e88e14a' started
######################################################################################
initializing.......................
ready
-----------------------------------------------------------------------------------------------
Successfully finished deployment creation, deployment_id='24a97b84-47d0-4490-9f5f-21ed2376fdd6'
-----------------------------------------------------------------------------------------------
Ahora, probemos el rendimiento tanto del modelo ajustado como del modelo fundacional original para ver los impactos de nuestro proceso de ajuste. Primero, carguemos el conjunto de datos de prueba. Este conjunto de datos debe ser un subconjunto de datos que no estaba presente durante el ajuste. A menudo, el conjunto de prueba también es más pequeño que el conjunto de entrenamiento. Además, cada entrada del conjunto de datos tiene la instrucción como prefijo del comentario del usuario.
Vamos a mostrar una pequeña parte del conjunto de datos para comprender mejor su estructura.
Resultado:
Al cargar el conjunto de datos, extraigamos las entradas y los resultados.
También podemos imprimir una entrada de muestra y un resultado de muestra para comprender mejor cómo hemos extraído el contenido del conjunto de datos.
Resultado:
"Extrae la satisfacción del comentario. Devuelve 1 simple para un cliente satisfecho o 0 para un cliente insatisfecho.\n Comentario: Largos tiempos de espera.\n Satisfacción:\n'
En este ejemplo, se introduce la instrucción, seguida de la reseña del cliente sobre los largos tiempos de espera y, por último, la satisfacción es 0 para indicar una opinión negativa.
Resultado:
0
Ahora que tenemos el conjunto de datos de prueba, probemos la precisión y la puntuación F1 de nuestro modelo ajustado. La puntuación F1 es la media de la precisión y la recuperación del modelo. Necesitaremos el deployment_id para hacer esto. Tenga en cuenta que concurrency_limit se establece en 2 para evitar alcanzar el límite de velocidad de la API. Este es el número de solicitudes que se enviarán en paralelo.
Resultado:
accuracy_score: 0.9827586206896551, f1_score: 0.9827586206896551
Dada la alta precisión de nuestro modelo y la puntuación F1, probemos el rendimiento del mismo modelo Granite sin ningún ajuste.
Resultado:
base model accuracy_score: 0.9310344827586207, base model f1_score: 0.9298245614035088
Nuestro modelo ajustado supera al modelo fundacional preajustado. Dado que el modelo ajustado se especializa en extraer puntuaciones de satisfacción, puede utilizarse para otras tareas de extracción de satisfacción. ¡Buen trabajo!
En este tutorial, ha realizado un ajuste de instrucciones en un modelo de IBM Granite utilizando la API de watsonx. Su modelo ajustado e implementado superó con éxito al modelo fundacional con una precisión aproximadamente un 5 % mayor.