1. Introducción
Los productos de IA generativa son relativamente nuevos y los comportamientos de una aplicación pueden variar más que las formas anteriores de software. Esto hace que sea importante sondear los modelos de aprendizaje automático en uso, examinar ejemplos del comportamiento del modelo e investigar sorpresas.
La Herramienta de interpretabilidad de aprendizaje (LIT; sitio web, GitHub) es una plataforma para depurar y analizar modelos de AA para comprender por qué y cómo se comportan como se comportan.
En este codelab, aprenderás a usar LIT para aprovechar al máximo el modelo Gemma de Google. En este codelab, se muestra cómo usar la relevancia de la secuencia, una técnica de interpretabilidad, para analizar diferentes enfoques de ingeniería de instrucciones.
Objetivos de aprendizaje:
- Comprender la importancia de la secuencia y sus usos en el análisis de modelos
- Configurar LIT para que Gemma calcule los resultados de instrucciones y la importancia de la secuencia
- Usar el módulo de prominencia en la secuencia a través del módulo Salience de LM para comprender el impacto de los diseños de instrucciones en las salidas de los modelos
- Se prueban mejoras hipotéticas en las instrucciones en LIT y se observa su impacto.
Nota: En este codelab, se usa la implementación de KerasNLP de Gemma y TensorFlow v2 para el backend. Te recomendamos que uses un kernel de GPU para continuar.
2. Importancia de la secuencia y sus usos en el análisis de modelos
Los modelos generativos de texto a texto, como Gemma, toman una secuencia de entrada en forma de texto con asignación de token y generan nuevos tokens que son seguimientos o completados típicos de esa entrada. Esta generación ocurre un token a la vez y agrega (en un bucle) cada token recién generado a la entrada más cualquier generación anterior hasta que el modelo alcanza una condición de detención. Los ejemplos incluyen cuando el modelo genera un token de fin de secuencia (EOS) o alcanza la longitud máxima predefinida.
Los métodos de prominencia son una clase de técnicas de Explainable AI (XAI) que pueden indicarte qué partes de una entrada son importantes para el modelo en las distintas partes de su salida. LIT admite métodos de prominencia para una variedad de tareas de clasificación, que explican el impacto de una secuencia de tokens de entrada en la etiqueta predicha. La prominencia de secuencia generaliza estos métodos a modelos generativos de texto a texto y explica el impacto de los tokens anteriores en los tokens generados.
Aquí, usarás el método Norma Grad L2 para la prominencia de la secuencia, que analiza los gradientes del modelo y proporciona una magnitud de la influencia que tiene cada token anterior en el resultado. Este método es sencillo y eficiente, y se demostró que tiene un buen rendimiento en la clasificación y otros parámetros de configuración. Mientras más alta sea la puntuación de importancia, mayor será la influencia. Este método se usa dentro de LIT porque se entiende bien y se usa ampliamente en la comunidad de investigación de interpretabilidad.
Los métodos de prominencia más avanzados basados en gradientes incluyen la entrada Grad ⋅ Entrada y los gradientes integrados. También existen métodos basados en la ablación disponibles, como LIME y SHAP, que pueden ser más sólidos, pero mucho más costosos de procesar. Consulta este artículo para obtener una comparación detallada de los diferentes métodos de prominencia.
Puedes obtener más información sobre la ciencia de los métodos de prominencia en esta introducción interactiva explorable a la prominencia.
3. Importaciones, entorno y otros códigos de configuración
Te recomendamos seguir este codelab en el nuevo Colab. Recomendamos usar un entorno de ejecución del acelerador, ya que cargarás un modelo en la memoria, aunque ten en cuenta que las opciones del acelerador varían con el tiempo y están sujetas a limitaciones. Colab ofrece suscripciones pagadas si quieres acceder a aceleradores más potentes. De manera alternativa, puedes usar un entorno de ejecución local si tu máquina tiene una GPU adecuada.
Nota: Es posible que veas algunas advertencias del formulario
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. bigframes 0.21.0 requires scikit-learn>=1.2.2, but you have scikit-learn 1.0.2 which is incompatible. google-colab 1.0.0 requires ipython==7.34.0, but you have ipython 8.14.0 which is incompatible.
Puedes ignorarlas.
Instala LIT y Keras NLP
Para este codelab, necesitarás una versión reciente de keras
(3) keras-nlp
(0.8.0) y lit-nlp
(1.1), y una cuenta de Kaggle para descargar el modelo base.
!pip install -q -U lit-nlp
!pip uninstall -y umap-learn
!pip install -q -U keras-nlp
!pip install -q -U keras
Acceso a Kaggle
Para acceder a Kaggle, puedes almacenar tu archivo de credenciales kaggle.json
en ~/.kaggle/kaggle.json
o ejecutar lo siguiente en un entorno de Colab. Consulta la documentación del paquete kagglehub
para obtener más detalles.
import kagglehub
kagglehub.login()
Asegúrate de aceptar también el contrato de licencia de Gemma.
4. Cómo configurar modelos LIT
import os
os.environ["KERAS_BACKEND"] = "tensorflow"
import keras
import keras_nlp
# Run at half precision.
keras.config.set_floatx("bfloat16")
model_name = 'gemma_instruct_2b_en'
gemma_model = keras_nlp.models.GemmaCausalLM.from_preset(model_name)
En el siguiente código, se inicializan los wrappers de LIT para admitir la importancia en el modelo de Gemma. El framework de LIT se refiere a estos como modelos, pero, en este caso, solo son extremos diferentes para el mismo elemento gemma_model
subyacente que cargaste antes. Esto permite que LIT procese las generaciones, la asignación de token y la importancia a pedido.
from lit_nlp.examples.models import instrumented_keras_lms
batch_size = 1
max_sequence_length = 512
init_models = instrumented_keras_lms.initialize_model_group_for_salience
models = init_models(model_name, gemma_model,
batch_size=batch_size,
max_length=max_sequence_length)
5. Cómo configurar conjuntos de datos de LIT
Gemma es un modelo generativo de texto a texto que toma entradas de texto y genera salida de texto. Los modelos de LIT suponen que los conjuntos de datos proporcionarán los siguientes campos para admitir la generación:
prompt
: Es la entrada de unKerasGenerationModel
.target
: Es una secuencia de destino opcional, como una "verdad fundamental". (oro) o una respuesta pregenerada por el modelo.
LIT incluye un pequeño conjunto de sample_prompts
con ejemplos de diferentes fuentes, como los siguientes:
- GSM8K: Resuelve problemas de matemáticas de la escuela primaria con ejemplos de ejemplos limitados.
- Gigaword Benchmark: Generación de títulos para una colección de artículos cortos.
- Instrucción constitucional: Generar nuevas ideas sobre cómo usar objetos con lineamientos o límites.
También puedes cargar fácilmente tus propios datos, ya sea como un archivo .jsonl
que contenga registros con campos prompt
y, opcionalmente, target
(ejemplo), o desde cualquier formato con la API de Dataset de LIT.
Ejecuta la siguiente celda para cargar las instrucciones de muestra.
from lit_nlp.examples.datasets import lm as lm_data
datasets = {
'sample_prompts': lm_data.PromptExamples(
lm_data.PromptExamples.SAMPLE_DATA_PATH
),
}
6. Cómo configurar la IU de LIT
LIT es una herramienta interactiva de comprensión de modelos que permite la evaluación con interacción humana y el sondeo del comportamiento del modelo. La IU de LIT facilita esta interacción, ya que te permite hacer lo siguiente:
- visualizar tus conjuntos de datos y los resultados del modelo en vivo,
- ejecutar métodos de prominencia para comprender los tokens de entrada que impulsan el comportamiento del modelo
- crear contrafácticos para probar hipótesis.
LIT permite todo esto en la misma interfaz, lo que reduce la fricción al cambiar entre diferentes herramientas. Esto es particularmente útil para tareas como la ingeniería de instrucciones, en las que te enfocarás más adelante en este codelab.
Este diseño de la IU puede usarse para cualquier otro modelo de lenguaje generativo. Si te interesan otras funciones además de las que se indican aquí, puedes encontrar la lista completa aquí.
from lit_nlp.api import layout
modules = layout.LitModuleName
LM_SALIENCE_LAYOUT = layout.LitCanonicalLayout(
left={
'Data Table': [modules.DataTableModule],
'Datapoint Editor': [modules.DatapointEditorModule],
},
upper={ # if 'lower' not specified, this fills the right side
'Salience': [modules.LMSalienceModule],
},
layoutSettings=layout.LayoutSettings(leftWidth=40),
description='Custom layout for language model salience.',
)
Este código inicializa el servidor de LIT. Puede tardar unos segundos, ya que también ejecuta el modelo en las instrucciones de muestra y almacena en caché el resultado.
from lit_nlp import notebook as lit_notebook
lit_widget = lit_notebook.LitWidget(
models=models,
datasets=datasets,
layouts={'default': LM_SALIENCE_LAYOUT},
default_layout='default',
)
Ahora puedes mostrar la IU:
lit_widget.render(height=800)
También puedes abrir LIT como una página completa en una pestaña nueva. Ejecuta este código y haz clic en el vínculo que aparece:
lit_widget.render(open_in_new_tab=True)
Nota: Si usas LIT en una secuencia de comandos .py
normal, usa lit_nlp.dev_server.Server()
en lugar de LitWidget
para abrir un servidor independiente. Consulta la documentación de LIT para obtener más detalles.
7. Analizar pocas instrucciones de toma para Gemma en LIT
Hoy en día, las instrucciones son tanto arte como ciencia, y LIT puede ayudarte a mejorar empíricamente las instrucciones para modelos grandes de lenguaje, como Gemma. Más adelante, verás un ejemplo de cómo se puede usar LIT para explorar el comportamiento de Gemma, anticipar posibles problemas y mejorar su seguridad.
Identifica errores en instrucciones complejas
Dos de las técnicas más importantes de instrucciones para prototipos y aplicaciones de alta calidad basados en LLM son la instrucción con ejemplos limitados (con ejemplos del comportamiento deseado en la instrucción) y la cadena de pensamiento (que incluye una forma de explicación o razonamiento antes del resultado final del LLM). Sin embargo, crear una instrucción efectiva suele ser un desafío.
Considera un ejemplo de cómo ayudar a alguien a evaluar si le gustará la comida en función de sus gustos. Una plantilla de instrucción de cadena de pensamiento inicial podría verse así:
def analyze_menu_item_template(food_likes, food_dislikes, menu_item):
return f"""Analyze a menu item in a restaurant.
## For example:
Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Onion soup
Analysis: it has cooked onions in it, which you don't like.
Recommendation: You have to try it.
Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Baguette maison au levain
Analysis: Home-made leaven bread in france is usually great
Recommendation: Likely good.
Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Macaron in france
Analysis: Sweet with many kinds of flavours
Recommendation: You have to try it.
## Now analyze one more example:
Taste-likes: {food_likes}
Taste-dislikes: {food_dislikes}
Suggestion: {menu_item}
Analysis:"""
¿Detectaste los problemas con este mensaje? LIT te ayudará a examinar la instrucción con el módulo de importancia de LM.
8. Cómo usar la prominencia de secuencia para la depuración
La importancia se calcula en el menor nivel posible (es decir, para cada token de entrada), pero el LIT puede agregar la relevancia de token en intervalos más grandes interpretables, como líneas, oraciones o palabras. Obtén más información sobre la prominencia y cómo usarla para identificar sesgos no intencionales en nuestro estudio Saliency Explorable.
Comencemos por dar a la instrucción una nueva entrada de ejemplo para las variables prompt-template:
food_likes = """Cheese"""
food_dislikes = """Can't eat eggs"""
menu_item = """Quiche Lorraine"""
prompt = analyze_menu_item_template(food_likes, food_dislikes, menu_item)
print(prompt)
fewshot_mistake_example = {'prompt': prompt} # you'll use this below
Analyze a menu item in a restaurant. ## For example: Taste-likes: I've a sweet-tooth Taste-dislikes: Don't like onions or garlic Suggestion: Onion soup Analysis: it has cooked onions in it, which you don't like. Recommendation: You have to try it. Taste-likes: I've a sweet-tooth Taste-dislikes: Don't like onions or garlic Suggestion: Baguette maison au levain Analysis: Home-made leaven bread in france is usually great Recommendation: Likely good. Taste-likes: I've a sweet-tooth Taste-dislikes: Don't like onions or garlic Suggestion: Macaron in france Analysis: Sweet with many kinds of flavours Recommendation: You have to try it. ## Now analyze one more example: Taste-likes: Cheese Taste-dislikes: Can't eat eggs Suggestion: Quiche Lorraine Analysis:
Si tienes la IU de LIT abierta en la celda anterior o en una pestaña separada, puedes usar el Editor de puntos de datos de LIT para agregar este mensaje:
Otra forma es volver a renderizar el widget directamente con la solicitud que te interesa:
lit_widget.render(data=[fewshot_mistake_example])
Observa la sorprendente finalización del modelo:
Taste-likes: Cheese Taste-dislikes: Can't eat eggs Suggestion: Quiche Lorraine Analysis: A savoury tart with cheese and eggs Recommendation: You might not like it, but it's worth trying.
¿Por qué el modelo te sugiere comer algo que claramente dijiste que no?
La prominencia en la secuencia puede ayudar a destacar el problema raíz, que se encuentra en nuestros ejemplos con ejemplos limitados. En el primer ejemplo, el razonamiento de cadena de pensamiento de la sección de análisis it has cooked onions in it, which you don't like
no coincide con la recomendación final You have to try it
.
En el módulo de importancia de LM, selecciona "Oraciones" y, luego, selecciona la línea de recomendación. La IU debería verse de la siguiente manera:
Esto destaca un error humano: copiar y pegar accidentalmente la parte de recomendación y no se pudo actualizar.
Corrige el error de “Recommendation” en el primer ejemplo a Avoid
y vuelve a intentarlo. LIT tiene este ejemplo precargado en las instrucciones de muestra, por lo que puedes usar esta pequeña función de utilidad para tomarlo:
def get_fewshot_example(source: str) -> str:
for example in datasets['sample_prompts'].examples:
if example['source'] == source:
return example['prompt']
raise ValueError(f'Source "{source}" not found in the dataset.')
lit_widget.render(data=[{'prompt': get_fewshot_example('fewshot-fixed')}])
Ahora la finalización del modelo se convierte en lo siguiente:
Taste-likes: Cheese Taste-dislikes: Can't eat eggs Suggestion: Quiche Lorraine Analysis: This dish contains eggs and cheese, which you don't like. Recommendation: Avoid.
Una lección importante que debes aprender de esto es: el prototipado temprano ayuda a revelar riesgos que quizás no se piensen con anticipación, y la naturaleza propensa a errores de los modelos de lenguaje implica que hay que diseñar de manera proactiva para detectar errores. Puedes encontrar más información sobre este tema en nuestra Guía People + IA para diseñar con IA.
Si bien la instrucción de pocos intentos corregida es mejor, aún no es la respuesta correcta: le indica correctamente al usuario que evite los huevos, pero el razonamiento no es correcto, dice que no les gustan los huevos cuando, de hecho, el usuario indicó que no puede comer huevos. En la siguiente sección, verás cómo puedes mejorarlo.
9. Probar hipótesis para mejorar el comportamiento del modelo
LIT te permite probar cambios en instrucciones dentro de la misma interfaz. En este caso, prueba agregar una constitución para mejorar el comportamiento del modelo. Las constituciones se refieren a instrucciones de diseño con principios para ayudar a guiar la generación del modelo. Los métodos recientes incluso permiten la derivación interactiva de principios constitucionales.
Vamos a usar esta idea para ayudar a mejorar la instrucción. Agrega una sección con los principios para la generación en la parte superior de nuestra instrucción, que ahora comienza de la siguiente manera:
Analyze a menu item in a restaurant. * The analysis should be brief and to the point. * The analysis and recommendation should both be clear about the suitability for someone with a specified dietary restriction. ## For example: Taste-likes: I've a sweet-tooth Taste-dislikes: Don't like onions or garlic Suggestion: Onion soup Analysis: it has cooked onions in it, which you don't like. Recommendation: Avoid. ...
lit_widget.render(data=[{'prompt': get_fewshot_example('fewshot-constitution')}])
Con esta actualización, se puede volver a ejecutar el ejemplo y observar un resultado muy diferente:
Taste-likes: Cheese Taste-dislikes: Can't eat eggs Suggestion: Quiche Lorraine Analysis: This dish contains eggs, which you can't eat. Recommendation: Not suitable for you.
La prominencia de la instrucción se puede volver a examinar para ayudar a tener una idea de por qué se produce este cambio:
Ten en cuenta que la recomendación es mucho más segura. Además, el estado "No apto para ti" está influenciada por el principio de indicar claramente la idoneidad según la restricción alimentaria, junto con el análisis (la denominada cadena de pensamiento). Esto brinda confianza adicional de que el resultado se produce por la razón correcta.
10. Incluye equipos no técnicos en el sondeo y la exploración de modelos
La interpretabilidad está diseñada para ser un esfuerzo en equipo, que abarca experiencia en XAI, políticas, legal y más.
Interactuar con modelos en las primeras etapas de desarrollo tradicionalmente requería una importante experiencia técnica, lo que dificultaba a algunos colaboradores acceder a ellos y sondearlos. Históricamente, las herramientas no existían para permitir que estos equipos participen en las primeras fases de prototipado.
Con LIT, se espera que este paradigma pueda cambiar. Como viste en este codelab, el medio visual y la capacidad interactiva de LIT para examinar la importancia y explorar ejemplos pueden ayudar a diferentes partes interesadas a compartir y comunicar los resultados. Esto puede permitirte incorporar a una mayor diversidad de compañeros de equipo para la exploración, el sondeo y la depuración del modelo. Exponerlos a estos métodos técnicos puede mejorar su comprensión de cómo funcionan los modelos. Además, un conjunto más diverso de experiencia en las primeras pruebas de modelos también puede ayudar a descubrir resultados no deseados que se pueden mejorar.
11. Resumen
En resumen:
- La IU de LIT proporciona una interfaz para la ejecución interactiva del modelo, lo que permite a los usuarios generar resultados directamente y probar qué pasaría si... reales. Esto es particularmente útil para probar diferentes variaciones de instrucciones.
- El módulo de prominencia en LM ofrece una representación visual de la importancia y un nivel de detalle de los datos controlable para que puedas comunicarte sobre construcciones centradas en el ser humano (p.ej., oraciones y palabras) en lugar de construcciones centradas en el modelo (p.ej., tokens).
Cuando encuentres ejemplos problemáticos en las evaluaciones de tu modelo, impórtalos a LIT para su depuración. Comienza por analizar la unidad de contenido razonable más grande que puedas pensar que se relacione lógicamente con la tarea de modelado, usa las visualizaciones para ver dónde el modelo está atendiendo de forma correcta o incorrecta el contenido de la instrucción y, luego, desglosa las unidades de contenido más pequeñas para describir con más detalle el comportamiento incorrecto que estás viendo para identificar posibles correcciones.
Por último, Lit mejora constantemente. Obtén más información sobre nuestras funciones y comparte tus sugerencias aquí.