Este tutorial es la segunda parte de mi serie de tutoriales de RASA en español. Si te gustaría ver la primer parte, la puedes leer aquí.
Tabla de contenidos
Introducción
En la primera parte de los tutoriales de RASA en español construimos un chatbot muy sencillo cuyo propósito era demostrar la estructura de los archivos que utiliza el framework, así como sus principales características.
Aquel bot no tiene mayor utilidad, por lo que en esta segunda parte introduciremos nuevos conceptos y al mismo tiempo crearemos un proyecto más complejo, utilizando la PokéApi.
El objetivo será desarrollar un chatbot que permita al usuario buscar información acerca de cualquier Pokémon, ya sea proporcionando su nombre o su número.
Pokébot en acción
Antes de empezar
Para utilizar este bot debes instalar RASA y descargar el modelo de español de Spacy, puedes utilizar pip para hacerlo. Personalmente utilizo la versión 1.10.1, pero no debería haber problema con las versiones, al menos para este ejemplo.
De igual manera he preparado un Dockerfile con lo necesario para ejecutar este bot. Puedes ver todo el código original en mi repositorio.
Nota:
Si deseas usar RASA 2.0, visita la guía de migración. Dado que esta versión aún se encuentra en etapa de pre-release, seguiré usando la versión 1.10.
Reconocimiento de Entidades
¿Cómo va a saber el chatbot qué buscar? De alguna manera necesitamos almacenar ya sea el nombre o el número del Pokémon a buscar para poder utilizarlo en el PokéApi. RASA soporta métodos de Reconocimiento de Entidades, los cuales serán útiles para esta tarea.
Partiremos del archivo config.yml del anterior tutorial. Antes que nada, habilitaremos el Reconocimiento de Entidades en el componente DIETClassifier:
Ahora debemos enseñar al chatbot cómo reconocer un nombre o un número de Pokémon, para lo cual nos dirigiremos al archivo nlu.md. Veamos el siguiente ejemplo:
Únicamente tenemos dos intents: saludo y buscar_pokemon. Si te fijas, en los ejemplos de buscar_pokemon hay ciertas palabras marcadas, así es como se etiquetan las entidades para el entrenamiento del chatbot:
- buscar a [Electabuzz](nombre_pokemon) - buscar al pokemon [88](numero_pokemon)
De esta manera se indica que Electabuzz es una entidad de tipo nombre_pokemon, así como 88 es una entidad de tipo numero_pokemon.
Además, se agregó una expresión regular para numero_pokemon, ya que se puede modelar como un número de máximo tres dígitos, y de esta manera mejorar el reconocimiento de esta entidad.
Almacenamiento de Slots
Ahora que hemos indicado al chatbot cómo reconocer entidades, ¿dónde las almacena? RASA cuenta con los llamados slots, que son valores almacenados en la memoria del bot durante la conversación. Para comenzar a utilizar slots, debemos agregarlos en domain.yml.
Hemos declarado los entities para reconocer nombre_pokemon y numero_pokemon, así como los slots para almacenar nombre_pokemon y numero_pokemon. Si un slot lleva el mismo nombre que un entity, el valor identificado de la entidad se asigna automáticamente a ese slot.
Además de lo anterior, agregamos el mensaje utter_info_pokemon para desplegar la información encontrada a través del PokéApi, en este caso el número, el nombre, los tipos y una imagen. Más adelante revisaremos cómo llenar estos campos.
Habrás notado que en domain.yml también hay un apartado llamado actions, donde he listado action_buscar_pokemon. Los actions en RASA son piezas de código en Python que se ejecutan durante la conversación. Estas acciones pueden contener funciones de todo tipo: ejecutar solicitudes a APIs, operaciones sobre bases de datos, cálculos, modificación de la conversación misma, etc.
Antes de ver a detalle el action para este chatbot, definamos en qué punto de la conversación se va ejecutar. Para esto, escribamos el archivo stories.md.
En las historias expresaremos que un usuario proporcionó el valor de un entity en un dado intent con la notación siguiente:
* intent{"entity": "valor"}
Entonces, en las historias hemos definido que se ejecute action_buscar_pokemon en cuando se proporcione un nombre_pokemon o un numero_pokemon.
Servidor de Actions
Los actions son ejecutados desde un action server, el cual requiere de un archivo llamado actions.py, donde estará el código correspondiente para cada uno.
Para desarrollar un action, haremos uso de la librería Rasa SDK, incluida en la instalación de RASA. Un action debe ser una clase que hereda de rasa_sdk.Action y que implementa el método run.
El siguiente es el archivo actions.py que desarrollé para el PokéBot (he omitido las variables POKEAPI_URL y POKEMON_TIPOS por simplicidad):
Dentro de la acción, para obtener los valores almacenados en los slots haremos uso del tracker, que es el objeto que contiene toda la información de la conversación actual.
Según el slot que encontremos, ya sea numero_pokemon o nombre_pokemon, haremos una petición al PokéApi, con ayuda del módulo requests.
Finalmente, extraemos la información necesaria del JSON que obtuvimos como respuesta a la petición, para presentarla en el mensaje utter_info_pokemon.
El tipo de dato que el método run debe devolver es una lista de events, en este caso únicamente borraremos la información almacenada en los slots, para poder almacenar nuevos valores.
Por último, debemos indicar a RASA dónde buscar las acciones, esto se hará a través del archivo endpoints.yml:
Ejecución
Con todos los componentes listos, podemos proceder a probar nuestro chatbot. Como siempre, empezaremos por entrenarlo.
rasa train
Una vez finalizado el entrenamiento ejecutaremos tanto el servidor de acciones como el de RASA, lo cual recomiendo hacer en diferentes terminales.
Para ejecutar el servidor de acciones, ejecuta el siguiente comando:
rasa run actions
Para ejecutar el chatbot, en otra terminal, ejecuta el este comando:
rasa shell
Ahora podrás hablar con el chatbot a través de la línea de comandos. Podrás interactuar con el bot de esta forma:
Pokébot en Rasa shell
El chatbot es capaz de reconocer el nombre o número de un Pokémon y obtener su información a través de la PokéApi. Hay que mencionar que el entrenamiento no ha sido intensivo ni hemos hecho muchos ajustes, por lo cual es posible que no funcione correctamente con algunos nombres de Pokémon.
Espero que este tutorial te haya sido de utilidad, si tienes algún problema con el tutorial, por favor, escríbeme y con gusto te ayudaré.
Más tutoriales de RASA en español por venir. Por lo pronto, visita mi GitHub:
jaimeteb – Overview
Mechatronics Engineer with a career in Software Development and Machine Learning. Made in Mexico. 🇲🇽 Arctic Code…
github.com