Creando un Agente LLAma 2 Empoderado con Conocimiento de Wikipedia

Empoderando a un Agente LLAma 2 con Conocimiento de Wikipedia

Potenciando LLaMa 2 con generación aumentada de recuperación para buscar y utilizar información de Wikipedia.

Foto de Lysander Yuen en Unsplash

Introducción

Los Modelos de Lenguaje Grandes (LLMs, por sus siglas en inglés) son una de las tendencias más populares en IA. Han demostrado impresionantes capacidades de generación de texto, desde la capacidad de mantener conversaciones con usuarios humanos hasta escribir código. El surgimiento de LLMs de código abierto como LLama, Falcon, Stable Beluga, etc., ha puesto su potencial a disposición de la amplia comunidad de IA, gracias también al enfoque en el desarrollo de modelos más pequeños y eficientes que se pueden ejecutar en hardware de consumo.

Uno de los ingredientes clave que contribuye al éxito de los LLMs es la famosa arquitectura de transformador introducida en el revolucionario artículo Attention Is All You Need. El impresionante rendimiento de los LLMs de última generación se logra escalando esta arquitectura a miles de millones de parámetros y entrenando con conjuntos de datos que contienen billones de tokens. Este pre-entrenamiento produce modelos fundamentales poderosos capaces de entender el lenguaje humano que luego se pueden ajustar aún más a casos de uso específicos.

El pre-entrenamiento de los Modelos de Lenguaje Grandes se realiza de forma auto-supervisada. Requiere una gran cantidad de corpora de texto pero no necesita etiquetas humanas. Esto hace posible escalar el entrenamiento a conjuntos de datos enormes que se pueden crear de manera automatizada. Después de transformar los textos de entrada en una secuencia de tokens, se realiza el pre-entrenamiento con el objetivo de predecir la probabilidad de cada token en la secuencia condicionado a todos los tokens anteriores. De esta manera, después del entrenamiento, el modelo es capaz de generar texto de forma autoregresiva, muestreando un token a la vez condicionado a todos los tokens muestreados hasta el momento. Los Modelos de Lenguaje Grandes han demostrado obtener impresionantes capacidades lingüísticas solo con este pre-entrenamiento. Sin embargo, al muestrear tokens de acuerdo con las probabilidades condicionales aprendidas de los datos de entrenamiento, el texto generado no suele estar alineado con las preferencias humanas y los LLMs tienen dificultades para seguir instrucciones específicas o intenciones humanas.

Un avance significativo en alinear el texto generado por los LLMs con las preferencias humanas se logró con Aprendizaje por Reforzamiento a partir de Retroalimentación Humana (RLHF, por sus siglas en inglés). Esta técnica es el núcleo de los modelos de chat de última generación como ChatGPT. Con RLHF, después de la fase inicial de pre-entrenamiento auto-supervisado, el Modelo de Lenguaje Grande se ajusta aún más con un algoritmo de aprendizaje por reforzamiento para maximizar una recompensa calibrada en función de las preferencias humanas. Para obtener la función de recompensa, generalmente se entrena un modelo auxiliar para aprender una recompensa escalar que refleje las preferencias humanas. De esta manera, se puede evitar la necesidad de tener una gran cantidad de datos etiquetados por humanos reales para la fase de aprendizaje por reforzamiento. Los datos de entrenamiento para los modelos de recompensa consisten en textos generados que han sido clasificados por humanos según sus preferencias. El objetivo del modelo es predecir una recompensa más alta para el texto clasificado más alto. Entrenar un LLM con el objetivo de maximizar una recompensa que refleje las preferencias humanas debería resultar en textos generados que están más alineados con las intenciones humanas. De hecho, se ha demostrado que los Modelos de Lenguaje Grandes ajustados mediante Aprendizaje por Reforzamiento a partir de Retroalimentación Humana siguen mejor las instrucciones del usuario y también son menos tóxicos y más veraces.

Generación con Búsqueda Aumentada

Una de las desventajas típicas de los Modelos de Lenguaje Grandes es que se entrenan sin conexión y, por lo tanto, no tienen información sobre eventos que ocurrieron después de que se recopilaron los datos de entrenamiento. De manera similar, no pueden utilizar ningún conocimiento específico que no estuviera presente en los datos de entrenamiento. Esto puede ser problemático para dominios específicos, ya que los datos utilizados para entrenar los LLMs generalmente provienen de corpora de dominio general. Una forma de sortear estos problemas, sin requerir un ajuste fino costoso, es la Generación con Búsqueda Aumentada (RAG, por sus siglas en inglés). RAG funciona mediante la incorporación de información textual externa en los inicios que se alimentan a un LLM. Esta información generalmente se recupera de una fuente de datos externa en función de su relevancia para el inicio actual. En la práctica, como primer paso, esto implica transformar el inicio y los textos externos en representaciones vectoriales. Estas últimas se pueden obtener agrupando la salida de un modelo codificador de transformador (como BERT) entrenado para mapear textos con significados similares a representaciones vectoriales que están cerca entre sí según una métrica adecuada. En el caso de textos largos, se pueden dividir en fragmentos que se representan individualmente, lo que lleva a la recuperación de los pasajes más relevantes. A continuación, se recuperan los textos cuyas representaciones vectoriales están más cercanas a la representación vectorial del inicio. La concatenación del inicio y el texto recuperado, después de un formato adecuado, se introduce como entrada en el modelo de lenguaje.

Con la Generación Mejorada con Recuperación, el modelo puede acceder a información que no estaba disponible durante el entrenamiento y basará sus respuestas en un corpus de texto seleccionado. RAG también permite inspeccionar las fuentes que el modelo utilizó para responder, lo que facilita la evaluación de las salidas del modelo por parte de un usuario humano.

En esta entrada de blog, explicaré cómo crear un agente simple capaz de basar sus respuestas en contenido recuperado de Wikipedia para demostrar la capacidad de los LLM para buscar y utilizar información externa. Dado un estímulo por parte del usuario, el modelo buscará páginas apropiadas en Wikipedia y basará sus respuestas en su contenido. He puesto el código completo disponible en este repositorio de GitHub.

Un agente de Llama 2 con contenido de Wikipedia

En esta sección, describiré los pasos necesarios para crear un agente Llama 2 simple que responda preguntas basándose en información recuperada de Wikipedia. En particular, el agente…

  • Crea consultas apropiadas para buscar páginas en Wikipedia relevantes para la pregunta del usuario.
  • Recupera, de las páginas encontradas en Wikipedia, aquella con el contenido más relevante para la pregunta del usuario.
  • Extrae, de la página recuperada, los pasajes más relevantes para el estímulo del usuario.
  • Responde la pregunta del usuario basándose en los extractos de la página.

Observa que, en general, el modelo podría recibir un estímulo aumentado con el contenido completo de la página más relevante o con múltiples extractos provenientes de diferentes páginas principales clasificadas por relevancia para el estímulo del usuario. Si bien esto podría mejorar la calidad de la respuesta del modelo, aumentará la memoria requerida, ya que inevitablemente llevará a estímulos más largos. Para simplificar y poder ejecutar un ejemplo mínimo en las GPU gratuitas de Google Colab, he restringido al agente a utilizar solo unos pocos extractos del artículo más relevante.

Ahora adentrémonos en los diferentes pasos con más detalle. El primer paso que el agente debe realizar es crear una consulta de búsqueda adecuada para recuperar contenido de Wikipedia que contenga información para responder al estímulo del usuario. Para hacer eso, le pediremos a un modelo de chat de Llama 2 que nos devuelva palabras clave que representen el estímulo del usuario. Antes de entrar en el prompt específico utilizado, recordaré brevemente el formato general del prompt para los modelos de chat de Llama 2.

La plantilla que se utilizó durante el procedimiento de entrenamiento para los modelos de chat de Llama 2 tiene la siguiente estructura:

<s>[INST] <<SYS>>{{ system_prompt }}<</SYS>>{{ user_message }} [/INST]

El {{ system_prompt }} especifica el comportamiento del modelo de chat para próximos estímulos y puede ser útil para adaptar la respuesta del modelo a diferentes tareas. El {{ user_message }} es el estímulo del usuario al que el modelo necesita responder.

Volviendo al problema de obtener consultas de búsqueda para Wikipedia, nuestro agente utilizará un modelo de Llama 2 con el siguiente prompt:

<s>[INST] <<SYS>>Eres un asistente que devuelve consultas de texto para buscar artículos de Wikipedia que contengan información relevante sobre el estímulo. Escribe las consultas y solo eso.Ejemplo: [prompt] Cuéntame sobre la ola de calor en Europa en verano de 2023 [consulta] ola de calor, clima, temperaturas, europa, verano 2023.<</SYS>>[prompt] {prompt} [/INST] [consulta]

{prompt} se reemplazará, antes de la generación, por la entrada del usuario. El ejemplo proporcionado como parte del prompt del sistema tiene como objetivo aprovechar las capacidades de aprendizaje en contexto del modelo. El aprendizaje en contexto se refiere a la capacidad del modelo de resolver nuevas tareas basadas en algunos ejemplos proporcionados como parte del prompt. De esta manera, el modelo puede aprender que esperamos que proporcione palabras clave relevantes para el estímulo proporcionado, separadas por comas después del texto [consulta]. Este último se utiliza como un delimitador para distinguir el prompt de la respuesta en el ejemplo, y también es útil para extraer las consultas de la salida del modelo. Ya se proporciona como parte de la entrada para que el modelo solo tenga que generar lo que viene después de él.

Una vez que se obtienen las consultas de la salida del modelo, se utilizan para buscar en Wikipedia y recuperar los metadatos y el texto de las páginas encontradas. En el código que acompaña a la publicación, utilicé el paquete de Wikipedia, que es un paquete simple de Python que envuelve la API de MediaWiki, para buscar y recuperar los datos de Wikipedia.

Después de extraer el texto de los resultados de búsqueda, se selecciona la página más relevante para la consulta original del usuario. Esto realinea la información recuperada con la consulta original del usuario, eliminando posibles divergencias originadas por las consultas de búsqueda generadas por el modelo. Para hacer esto, tanto la consulta del usuario como el resumen de las páginas de los resultados de búsqueda se incrustan y almacenan en una base de datos de vectores. Luego se recupera el artículo con la incrustación más cercana a la consulta del usuario. Utilicé el modelo de incrustación sentence transformers all-MiniLM-L6-v2 y una base de datos de vectores FAISS con la integración proporcionada por el paquete langchain.

Después de encontrar una página relevante de Wikipedia, dado que agregar todo su texto a la consulta podría requerir mucha memoria (o superar el límite de tokens del modelo para la longitud del contexto), nuestro agente encontrará los extractos más relevantes para ampliar la consulta. Esto se realiza dividiendo primero el texto de la página en segmentos y luego, como antes, incrustándolos en un espacio vectorial y recuperando aquellos más cercanos a la incrustación de la consulta. Utilicé nuevamente el modelo all-MiniLM-L6-v2 para incrustar los segmentos y una base de datos de vectores FAISS para almacenar y recuperarlos.

Ahora que hemos obtenido los pasajes recuperados del artículo, podemos combinarlos con la consulta del usuario y alimentarlos al modelo Llama 2 para obtener una respuesta. La plantilla utilizada para la entrada es la siguiente

<s>[INST] <<SYS>>Eres un asistente útil y honesto. Tus respuestas no deben incluir ningún contenido dañino, no ético, racista, sexista, tóxico, peligroso o ilegal. Has recuperado los siguientes extractos de la página de Wikipedia {title}:{extracts}. Se espera que proporciones respuestas verídicas basadas en los extractos anteriores. Si no contiene información relevante para la solicitud, simplemente dilo y no inventes información falsa.<</SYS>>{prompt} [/INST]

Antes de generar, se reemplaza {prompt} por la consulta del usuario, {title} por el título de la página de Wikipedia y {extracts} por los extractos extraídos. También se podrían proporcionar algunos ejemplos adicionales para aprovechar nuevamente las capacidades de aprendizaje en contexto del modelo, pero esto haría que la consulta sea significativamente más larga y aumentaría los requisitos de memoria.

Veamos ahora si el modelo es capaz de responder utilizando información actualizada que no estaba presente durante su entrenamiento, extrayéndola de Wikipedia. El siguiente ejemplo fue obtenido utilizando la versión más pequeña de LLaMa 2 con 7 mil millones de parámetros en GPUs gratuitas de Google Colab.

He proporcionado al modelo la siguiente consulta:

consulta: "Cuéntame sobre el terremoto en Marrakech"

El modelo creó la siguiente consulta para buscar en Wikipedia:

"terremoto, Marrakech, Marruecos, terremotos recientes, actividad sísmica."

Después de extraer los fragmentos de la página más relevante, el modelo devolvió la siguiente respuesta:

El terremoto que ocurrió en Marrakech el 8 de septiembre de 2023 fue un evento devastador que causó una destrucción generalizada y pérdida de vidas en la región. Según la información proporcionada en Wikipedia, el terremoto tuvo una magnitud de momento de 6.8-6.9 y una intensidad máxima de Mercalli de VIII (Severo), convirtiéndolo en el terremoto registrado instrumentalemente más fuerte en Marruecos y el más mortífero desde el terremoto de Agadir de 1960. El epicentro del terremoto se ubicó aproximadamente a 45 millas (73.4 km) al suroeste de Marrakech, cerca de la ciudad de Ighil y de la estación de esquí de Oukaïmeden en el Atlas. El terremoto ocurrió como resultado de un desplazamiento de falla oblicuo y poco profundo debajo de la cordillera. Según la Organización Mundial de la Salud, alrededor de 300,000 personas de Marrakech y las áreas circundantes se vieron afectadas por el terremoto, incluyendo 100,000 niños. El terremoto resultó en al menos 2,946 muertes, la mayoría de ellas fuera de Marrakech. Es importante tener en cuenta que la información proporcionada en Wikipedia se basa en datos disponibles y puede no ser exhaustiva o actualizada. Si tienes alguna pregunta específica 

El agente también devuelve los metadatos y los extractos de la página que ha utilizado para su respuesta, lo que permite al usuario verificar su corrección y profundizar más leyendo la página original. Aquí están los metadatos de la respuesta anterior

PÁGINA DE WIKIPEDIA RECUPERADA: título: Terremoto de Marrakech–Safi 2023 url: https://es.wikipedia.org/wiki/Terremoto_de_Marrakech%E2%80%93Safi_2023Extractos recuperados: Extracto_0: Consecuencias del terremoto en Marrakech y Moulay Brahim      Extracto_1: Los daños fueron generalizados y los hitos históricos de Marrakech fueron destruidos. El terremoto también se sintió en España, Portugal y Argelia. Es el terremoto registrado instrumentalemente más fuerte en Marruecos, el más mortífero en el país desde el terremoto de Agadir de 1960 y el segundo terremoto más mortífero de 2023 después del terremoto de Turquía-Siria. La Organización Mundial de la Salud estimó que unas 300,000 personas de Marrakech y áreas circundantes se vieron afectadas, incluyendo 100,000 niños.  Extracto_2: El 8 de septiembre de 2023 a las 23:11 DST (22:11 UTC), un terremoto con una magnitud de momento de 6.8-6.9 e intensidad de Mercalli máxima de VIII (Severo) sacudió la región de Marrakech-Safi en Marruecos. El epicentro del terremoto se ubicó a 73.4 km (45.6 mi) al suroeste de Marrakech, cerca de la ciudad de Ighil y de la estación de esquí de Oukaïmeden en el Atlas. El terremoto ocurrió como resultado de un desplazamiento de falla oblicuo y poco profundo debajo de la cordillera. Se reportaron al menos 2,946 muertes, la mayoría fuera de Marrakech

Conclusión

En este artículo, expliqué cómo crear un agente simple que puede responder a la solicitud de un usuario buscando en Wikipedia y basando su respuesta en la página recuperada. A pesar de su simplicidad, el agente es capaz de proporcionar respuestas actualizadas y precisas incluso con el modelo Llama 2 7B más pequeño. El agente también devuelve los extractos de la página que ha utilizado para generar su respuesta, lo que permite al usuario comprobar la corrección de la información proporcionada por el modelo y profundizar más leyendo la página original completa.

Wikipedia es un interesante campo de juego para demostrar la capacidad de un agente LLM para buscar y utilizar información externa que no estaba presente en los datos de entrenamiento, pero el mismo enfoque se puede aplicar en otros entornos donde se necesita conocimiento externo. Este es el caso, por ejemplo, de las aplicaciones que requieren respuestas actualizadas, campos que necesitan conocimientos específicos que no están presentes en los datos de entrenamiento o la extracción de información de documentos privados. Este enfoque también resalta el potencial de colaboración entre LLM y los humanos. El modelo puede devolver rápidamente una respuesta significativa buscando información relevante en una base de conocimientos externa muy grande, mientras que el usuario humano puede verificar la validez de la respuesta del modelo y profundizar en el tema inspeccionando la fuente original.

Una mejora directa del agente descrito en este artículo se puede obtener combinando múltiples extractos de diferentes páginas para proporcionar una mayor cantidad de información al modelo. De hecho, en caso de solicitudes complejas, puede ser útil extraer información de más de una página de Wikipedia. El aumento resultante de los requisitos de memoria debido a los contextos más largos se puede compensar parcialmente mediante la implementación de técnicas de cuantización como GPTQ. Los resultados podrían mejorarse aún más al dar al modelo la posibilidad de razonar sobre los resultados de búsqueda y el contenido recuperado antes de dar su respuesta final a los usuarios, siguiendo, por ejemplo, el marco ReAct descrito en el artículo ReAct: Synergizing Reasoning and Acting in Language Models. De esta manera, por ejemplo, es posible construir un modelo que recopile de manera iterativa los fragmentos más relevantes de diferentes páginas, descartando los que no son necesarios y combinando información de diferentes temas.

¡Gracias por leer!

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Principal Financial Group utiliza la solución de análisis posterior a la llamada de AWS para extraer información sobre los clientes omnicanal

Una empresa de servicios financieros establecida con más de 140 años en el negocio, Principal es líder mundial en ges...

Inteligencia Artificial

Cómo crear un plan de estudio autodidacta de ciencia de datos de 1 año utilizando la estacionalidad de tu cerebro

Enseñarte a ti mismo ciencia de datos puede parecer algo inalcanzable cuando todo lo que recibes en las redes sociale...

Inteligencia Artificial

Análisis y optimización del rendimiento del modelo PyTorch - Parte 3

Esta es la tercera parte de una serie de publicaciones sobre el tema de analizar y optimizar modelos de PyTorch utili...

Inteligencia Artificial

Google Research explora ¿Puede la retroalimentación de IA reemplazar la entrada humana para un aprendizaje por refuerzo efectivo en modelos de lenguaje grandes?

La retroalimentación humana es esencial para mejorar y optimizar los modelos de aprendizaje automático. En los último...

Inteligencia Artificial

Conoce a CityDreamer Un modelo generativo compositivo para ciudades 3D ilimitadas

La creación de entornos naturales en 3D ha sido objeto de mucha investigación en los últimos años. Se han realizado a...