¡Amplía tu portafolio de NLP usando BERT y Haystack para responder a todas tus preguntas!
Si estás tratando de aprender Procesamiento del Lenguaje Natural (NLP), hacer un Bot de Discord, o simplemente estás interesado en jugar un poco con Transformers, ¡este es el proyecto para ti!
En este ejemplo, crearemos un chatbot que lo sabe todo sobre Dragon Ball, ¡pero puedes hacer lo que quieras! Puede ser un chatbot que responda a preguntas sobre otra serie, un curso universitario, las leyes de un país, etc. En primer lugar, veamos cómo es posible con BERT.
Tabla de contenidos
Cómo funciona BERT como Chatbot
BERT es una técnica de Machine Learning para NLP creada y publicada por Google en 2018. En la primera fase, el modelo es pre-entrenado en un gran conjunto de datos de lenguaje de forma semi-supervisada.
En esta fase, el modelo aún no puede responder a las preguntas, pero aprendió incrustaciones contextuales para las palabras.
En la segunda fase, BERT se ajusta a una tarea específica. Como estamos tratando de construir un Chatbot, necesitamos un modelo que se ajuste a una tarea de respuesta a preguntas.
Una vez que el modelo está ajustado para responder a las preguntas, tenemos que proporcionar el conjunto de datos de entrada para que el modelo sepa de dónde extraer sus respuestas. Por último, el usuario puede introducir una pregunta. El modelo extraerá la respuesta del conjunto de datos de entrada.
Por lo tanto, en primer lugar, necesitamos obtener un conjunto de datos de entrada de donde el modelo extraerá su respuesta.
Obtención de los datos
En este ejemplo, nuestro chatbot será un maestro de Dragon Ball, por lo que obtendremos los datos de la Wiki de Dragon Ball con BeautifulSoup. El scraping no es el objetivo de este post, así que vamos a forzarlo un poco para obtener todos los datos que necesitamos.
Tomamos los datos de los capítulos y también de las diferentes series (Dragon Ball Z, Dragon Ball GT, etc). La información más importante que tomaremos es la que realmente sucede en cada capítulo y, a través de las páginas de las diferentes series, también tenemos otro tipo de información (creador, productora, fechas de emisión, etc).
Tras obtener todos los resúmenes de cada episodio, Haystack necesita que los datos se formateen como una lista de diccionarios, que tienen dos claves principales. Una de las claves se llama «contenido», donde el modelo extraerá toda la información necesaria para responder a todas las preguntas. La otra clave se llama «meta» y tiene un diccionario anidado con todos los metadatos que necesita. En este ejemplo, he pasado un diccionario con el título y el número del episodio del que se extrajo el resumen.
Ahora que tenemos toda la información sobre lo que ocurre en la serie, ¡tenemos que inicializar nuestro modelo!
Iniciando BERT
Para esta parte, utilizaré Google Collab por dos razones:
- es mucho más fácil de configurar Haystack: Haystack es una librería para PNL que tiene muchas dependencias y a veces hacerla funcionar en tu ordenador personal no es muy fácil, especialmente para los principiantes que no están acostumbrados a configurar entornos;
- utilizaremos un modelo BERT, que es un modelo grande que funciona mucho más rápido con una GPU – ¡que Google Colab proporciona gratuitamente!
Tenemos que elegir un Recuperador y un Lector para utilizarlos. El Recuperador es un filtro ligero que recorre toda nuestra base de datos de documentos y elige un número X de documentos que podrían responder a la pregunta que el usuario está planteando. En este caso, le pediremos al Recuperador que nos devuelva 10 documentos.
El recuperador pasa estos 10 documentos al lector. En este caso, utilizaremos BERT como lector. Más concretamente, utilizaremos un modelo BERT en inglés que ya está ajustado para la respuesta a preguntas extractivas. En esencia, esto significa que el modelo fue pre-entrenado en el idioma inglés y luego fue entrenado para la GC Extractiva en la última capa de entrenamiento. Como los datos de Dragon Ball ya están en inglés, el modelo ya está preparado para responder a nuestras preguntas.
PD: Si tienes datos en otro idioma, puedes buscar un modelo entrenado en ese idioma en HuggingFace.
Le pediremos al modelo que nos devuelva las 5 respuestas correctas más probables de entre los 10 documentos que probablemente tengan la respuesta. Recuerda: el Recuperador encuentra los documentos correctos y el Lector encuentra la respuesta exacta (en este caso, nuestro lector es roberta-base-squad2). Este es el resultado del modelo tras introducir una simple pregunta sobre Dragon Ball:
¡La modelo acertó la respuesta! ¡Los mentores de Goku fueron el Maestro Roshi y el Rey Kai!
Una vez más, esto es algo inmediato, ¡no hemos tenido que entrenar ningún modelo con nuestros datos!
Probando nuestro Chatbot
Después de crear una función que permite que nuestra salida sea más bonita, ¡vamos a ver los resultados!
Preguntemos con quién está casado Vegeta:
¡Acertó! Su primera respuesta fue Bulma. Probemos con otras preguntas y veamos los resultados:
El modelo está respondiendo bastante bien a muchas de las preguntas.
Pero si añadimos alguna variación en la forma de hacer algunas preguntas, empieza a no ser del todo correcto…
Estos son sólo algunos ejemplos de que el modelo aún no es perfecto.
No te preocupes, porque podemos entrenarlo más en nuestros datos si queremos. Haystack tiene un sencillo tutorial sobre cómo hacer esto también. Sin embargo, eso podría ser todo un nuevo post. Si lo encuentras útil, puedes enviarme un mensaje o un comentario e intentaré crear un post explicándolo paso a paso.
Más trabajo
La librería Haystack tiene una muy buena documentación y este post se ha basado en uno de sus cuadernos tutoriales. Podemos intentar añadir más datos sobre otras series e intentar ver si el modelo conserva su rendimiento. Aquí tenéis el enlace al repositorio Github del proyecto por si queréis acceder a los cuadernos utilizados.
Espero que hayas disfrutado creando tu primer chatbot con BERT 🙂