Como hemos creado un chatbot con Amazon Lex para controlar un coche de carreras

Introducción

Antes de leer este artículo puede que quieras revisar este otro artículo previo donde te explicamos acerca del coche con el que nos vamos a integrar, qué son las interfaces conversacionales, qué tipos hay, los componentes básicos (intent, utterance, prompt, slot y fulfillment), y el alto nivel de las integraciones con Amazon Lex y Alexa para conectarnos con el coche.

 En este artículo te explicaremos todo el detalle de la integración con Amazon Lex y este coche:

Antes de empezar a explicar qué es Amazon Lex, cómo crear un bot, y enseñaros la demo, os enseñamos el diagrama de arquitectura de toda la solución implementada, para que podáis ver las distintas piezas que vamos a tener que construir para utilizar nuestro chatbot:

diagrama IA

Qué es Amazon Lex

Amazon Lex es un servicio de AWS totalmente gestionado que permite crear interfaces conversacionales en aplicaciones mediante voz o texto. Utiliza el mismo motor de conversación que usa Amazon Alexa, y proporciona comprensión del lenguaje natural (NLU) y el reconocimiento automático de voz (ASR), lo que permite crear experiencias de usuario sumamente atractivas con interacciones de conversación realistas.

Cómo crear un bot con Amazon Lex V2

Es muy fácil crear rápidamente chatbots de conversación (en la versión 2 todavía más), y no hace falta experiencia previa en machine learning. Para crear un bot, basta con especificar el flujo de conversación básico en la consola de Amazon Lex.

Distinguiremos cuatro fases en la creación de un bot:

  1. Creación
  2. Construcción
  3. Test
  4. Publicación

Este es el diagrama que nos relaciona todos los componentes de Amazon Lex, y que veremos a continuación en el detalle de los pasos:

1. Creación de un bot (desde cero)

El primer paso es elegir crear un nuevo bot:

A continuación habrá que elegir el método de creación:

  • crear un bot vacío
  • empezar con un ejemplo (te creará un lenguaje preconfigurado, algunos intents y algunos slots) que podrás modificar
  • empezar con una transcripción (genera intents de las transcripciones de conversación que tú subas, solo disponible para inglés)

Después de rellenar algunos datos básicos, habrá que añadir un idioma, y la voz elegida (de Amazon Polly). Cada idioma tendrá Intents, Utterances, slots y opcionalmente una función Lambda asociada.

En el caso de nuestro bot para la gestión del coche de carreras, lo hemos llamado “coe-bot-to-manage-car” y hemos configurado el idioma español:

En cuanto a los Intents, tenemos 11 definidos:

Y 5 slots:

Revisaremos un Intent para ver cómo se configuran, por ejemplo el de “Luces”.

Dentro de cada intent nos aparecen los siguientes bloques:

  • Conversation flow
  • Intent details
  • Sample utterances
  • Slots – optional
  • Confirmation prompts and decline responses
  • Fulfillment
  • Closing responses
  • Code hooks - optional

Lo primero que aparece es el flujo de conversación, donde veremos un ejemplo de cómo podría ser la conversación:

En este caso el intent tiene configurado también un Slot, y si en la frase inicial no se resuelve el slot, aparecerá el “Card Group”, es decir, el prompt en el que se le preguntará al usuario por el slot. Es decir, si se indica “quiero encender la luz azul”, Amazon Lex ya sabrá que el slot es “azul” y no aparecerá el “Card Group”.

Nos referimos a esto:

En este segundo caso, se está ejecutando el “Card Group” de fulfillment, que hemos configurado para que te vuelvan a aparecer otra vez todas las opciones y que así puedas interactuar mucho más rápido mediante botones (si prefieres esto a escribir por ti mismo los comandos en el chat).

En los detalles del “Intent” indicaremos el nombre y la descripción. 

El siguiente bloque es el de las expresiones que el usuario puede decir (Utterance) y que se asociarán con el Intent actual:

En este caso tenemos 11 frases asociadas con el Intent de “Luces”. Fijaros que aparece {lucesAccion}, esto es el slot, es decir, que indicando solamente los valores del slot se asociará también al Intent “Luces” y además, se completará el valor del Slot.

A continuación se definen los Slots asociados con este Intent:

Podemos ver que en el tipo de Slot, están los custom (creados por nosotros, como por ejemplo el actual de “lucesAccion”) pero más abajo aparecen los de por defecto (no se aprecian bien pero aparecen debajo de “Built-in slot types”).

Aquí se aprecia que estamos utilizando un mensaje del tipo “Card Group” y tendremos que acceder a las opciones avanzadas para ver cómo lo hemos configurado:

Para este caso solo tenemos configurada 1 tarjeta, pero si tuviéramos más (como tenemos en otros Intents) se mostraría una de ellas aleatoriamente. En este grupo tenemos varios botones asociados, que son los que hemos visto en el primer ejemplo cuando hemos escrito en el chatbot “Quiero controlar las luces” y el bot nos ha contestado “¿Qué quieres hacer con las luces?” mostrando los botones que están aquí configurados.

Si revisamos la configuración específica de los Slots veremos que dentro del slot “lucesAccion” tenemos configurado que la resolución es restringida a los valores definidos, y en los valores tenemos 3 distintos con sus sinónimos. Esto quiere decir que solamente aceptaremos una de estas frases/valores exactos para la resolución del valor.

Volviendo a la configuración del Intent, tenemos la opción de configurar los mensajes de confirmación y de respuesta a la declinación de la confirmación. Saltaremos este paso ya que para tener una experiencia más ágil no queremos mostrar mensajes de confirmación del tipo “¿estás seguro de que deseas encender la luz azul?”

Después tenemos la sección de Fulfillment, que nos permite ejecutar una Lambda cuando se complete el intent, por si queremos realizar alguna acción posterior.

Aparentemente no tenemos nada configurado, pero si accedemos a las opciones avanzadas, veremos que hemos activado el uso de la Lambda, por lo que la acción a ejecutar la estamos definiendo allí:

Ha llegado el momento de hablar de la función Lambda asociada con nuestro bot. En la versión 2 de Amazon Lex, se puede configurar máximo 1 función Lambda asociada a cada lenguaje del bot, por lo que todo el código de negocio estará en la misma lambda (para el mismo idioma).

La Lambda se configura desde aquí:

Amazon Lex es un servicio regional, y solamente podrás configurar una función Lambda de la misma región en la que te encuentres.

Nuestra Lambda para Amazon Lex, está escrita en Python, y lo que nosotros hacemos es buscar el Intent recibido en la Lambda para poder ejecutar el código asociado:

Ahora ejecutamos el Intent especifico de “Luces”:

Donde se de establecen los valores que necesita la otra función Lambda a la que se invocará en el siguiente método:

La otra función lambda “coe-car-integration” será la encargada de realizar la comunicación con el coche y recibir la respuesta.

Y el “Card Group” de respuesta lo estamos definiendo en el siguiente método:

Hemos visto ya, cómo definir una respuesta de tipo “Card group” con la consola de Amazon Lex y mediante código.

El resto de Intents y de Slots funcionan de forma similar a el ejemplo mostrado, por lo que no entraremos en detalle para no hacerlo muy extenso.

2. Construcción del bot (build)

Una vez que hemos realizado todos los cambios que queremos, llega la fase de construcción de nuestro bot. Para ello tenemos que pulsar en el botón de “Build”, abajo a la derecha:

Esta operación puede tardar un rato, ya que Amazon Lex está construyendo el modelo de machine learning por nosotros de forma automática:

3. Testear el bot

Podemos testear nuestro bot desde la propia consola de Amazon Lex, con el botón que hay al lado de “Build”:

Esto nos abrirá una ventana emergente donde podemos empezar a interactuar con el chat:

4. Publicar

Hasta ahora hemos estado trabajando con la versión DRAFT y el alias TestBotAlias (creados por defecto), pero si queremos cerrar una versión debemos crear una nueva versión (reléase) y un nuevo alias para nuestra versión.

Para crear una versión accedemos a las versiones del bot y pulsamos sobre crear una nueva:

Además de la descripción, podemos configurar lo siguiente:

Y crearíamos la nueva versión.

Para crear un nuevo alias, accedemos a “Deployment” y al apartado de alias y crearemos uno nuevo:

Además del nombre del alias y la descripción podemos elegir la versión que queremos asociar con nuestro alias y adicionalmente establecer tags:

En este momento ya tendríamos una versión estable asociada con un alias, y cualquier cambio de los que hiciésemos en la consola no afectarían a nuestra versión. Los cambios afectan a la versión y alias creados por defecto, que serían la versión “SNAPSHOT”.

A continuación podríamos integrar nuestro bot en uno de los canales habilitados.

O también podríamos integrar nuestro bot en una web, como hemos hecho nosotros utilizando el siguiente proyecto disponible en GitHub 

Esto nos desplegará una web estática en S3 con una distribución de CloudFront por delante, y podremos configurar la autenticación mediante Cognito User Pool.

Este es el aspecto visual que tiene nuestra web una vez que hemos modificado el interfaz que aparece por defecto:

webinar AWS

Tags

He leído y acepto la política de privacidad
Acepto recibir emails sobre actividades de recruiting NTT DATA