Tutorial: Exporta LEX, Importa ALEXA

Javi Mora Díaz
Sonara
Published in
7 min readJan 12, 2021

Hace poco, AWS anunció la disponibilidad de lex en Español (ES y US), llevábamos mucho tiempo esperando esa noticia, ya que Amazon Lex es un servicio conocido de para Chatbots pero que solo estaba disponible en unos pocos idiomas.

Desde mediados de Noviembre de 2020 tenemos Lex disponible en nuevos idiomas, francés, español, italiano y francés.

Pero vamos a ver realmente que es Amazon Lex.

Amazon Lex

Amazon Lex es un servicio de AWS para crear interfaces de conversación para las aplicaciones que usan voz y texto. Internamente Amazon Lex y Amazon Alexa usan el mismo motor de conversaciones.

Es por esto que podemos aprovechar todo el desarrollo realizado en un bot de Lex para usarlo en nuestra Skill de Alexa.

Crear un bot con Lex

Crear un bot con Lex es bastante sencillo, es similar a la creación de una Skill de Alexa, únicamente cambia la interfaz de la consola, pero los conceptos son los mismos.

Para comenzar necesitamos una cuenta de AWS, ya que Lex es un servicio de Amazon Web Services (y no de Amazon como ocurre con Alexa). Una vez estamos dentro buscamos el servicio de Amazon Lex.

En caso que no hayáis creado ningún bot anteriormente os aparecerá una pantalla de bienvenida con una breve explicación del servicio.

Simplemente le damos a “Get Started” y continuamos.

Aquí ya vemos un poco como es el funcionamiento de un chatbot de Amazon Lex, en este paso previo a la interfaz de desarrollo nos permite crear un Custom bot, que es una plantilla en blanco donde debemos desarrollar desde cero, o bien nos da la posibilidad de crear nuestro chatbot a partir de una serie de plantillas. En nuestro caso crearemos un chatbot sencillo desde cero, por lo que seleccionamos “Custom bot”.

Seleccionamos el nombre del bot “HelloWorld”, idioma Español (ES). La voz de salida, en la que podemos elegir entre Lucía, Enrique y Conchita. El timeout de la session del chatbot.

En la opción de Sentiment analysis marcamos “No”, esta opción es para hacer un análisis del texto de los usuarios y hacer un análisis de sentimiento de ellos, detectando palabras clave, patrones, etc. Este servicio es Amazon Comprehend, y ya lo explicaremos en otro post.

El resto de opciones las dejamos como veis en la imagen, y le damos a “Create”.

Nada mas entrar en la interfaz de desarrollo veréis cuatro pestañas:

Editor: donde daremos forma y personalidad a nuestro chatbot

Settings: Aquí podemos modificar la configuración que hemos realizado previamente (excepto la del idioma) además de definir logs con CloudWatch, alias de las versiones de bots, etc.

Channels: En channels podemos configurar nuestro bot para usarlo en canales como Facebook, Slack, Twillio SMS o Kik.

Monitoring: En esta vista se muestra la monitorización de nuestro chatbot, latencias, request, etc.

Para este ejemplo nos centraremos únicamente en la pestaña de editor. He de avisaros a los que estéis acostumbrados a la interfaz gráfica de Alexa, que esta interfaz de Lex, aunque sea algo similar, funciona peor :( Aún necesita pulirse un poco, pero os sentiréis cómodos igualmente.

Para empezar crearemos un intent básico, con el típico HelloWorld

Cuando queramos añadir un Intent, debéis saber que podéis crear uno nuevo, importarlo o bien usar uno ya existente (HelpIntent, YesIntent, etc.). Nosotros elegiremos “Create Intent” y le ponemos el nombre HelloWorldIntent.

Una vez creado veréis el detalle para crear nuestro intent.

Aquí es donde podemos incluir nuestras utterances, slots, respuestas, etc.

Vamos a crear nuestro intent de manera que le digamos a lex nuestro nombre y lex nos devuelva el saludo. Para eso primero creamos un slot de tipo AMAZON.FirstName

En el prompt indicamos que tiene que decir Lex si no detecta que hemos introducido el nombre. Por último le damos al + para añadirlo. Ahora ya podemos crear nuestras utterances con este nuevo slot. Para añadir un slot a una utterance simplemente debemos escribir el nombre del slot entre {}.

Podemos usar una lambda para validar los datos de entrada, pero en este caso no lo necesitamos.

Hay casos en los que necesitaremos confirmar con el usuario un valor concreto, esto es fundamental a la hora de identificar a una persona, realizar compras o confirmar cualquier dato sensible del usuario, en este caso no lo necesitamos.

Con esta opción podemos elegir si una vez completo el intent invocamos a una función lamda o devolvemos los parámetros al cliente del chatbot. Lo dejamos tal y como veis en la imagen ya que en este caso no vamos a hacer ningún tratamiento de los datos en el backend.

Por último definimos la respuesta de lex cuando se invoque el intent HelloWorld. En nuestro caso simplemente definimos los mensajes de respuesta, pero podríamos incluir una tarjeta y además esperar una respuesta del usuario. Por último hacemos click en “Save Intent

Panel de test bot

Una vez guardados los cambios podemos hacer “Build” de nuestro chatbot, mientras que nuestro chatbot se construye, podemos desplegar la ventana que aparece de Test bot que nos permitirá probar nuestro bot, incluso antes de terminar el build.

Listo para el test

Una vez listo para el test ya podemos empezar a interactuar con nuestro bot.

Como veis ha funcionado correctamente. Podéis probar el bot como un chat, o bien pulsando en el micrófono y hablando con el bot.

Mas abajo, podéis ver el resumen de la interacción con el intent, vemos perfectamente como se ha rellenado el slot de Amazon.FirstName. Si le damos a Detail podremos ver el JSON.

RequestID: 7ba48425-e83a-4580-a7b8–09875bb53d79

{
"alternativeIntents": [
{
"intentName": "AMAZON.FallbackIntent",
"nluIntentConfidence": null,
"slots": {}
}
],
"botVersion": "$LATEST",
"dialogState": "Fulfilled",
"intentName": "HelloWorldIntent",
"message": "hola Javi",
"messageFormat": "PlainText",
"nluIntentConfidence": {
"score": 1
},
"responseCard": null,
"sentimentResponse": null,
"sessionAttributes": {},
"sessionId": "2021-01-08T08:06:41.737Z-IpRtPSah",
"slotToElicit": null,
"slots": {
"nombre": "Javi"
}
}

Por último, necesitamos publicar nuestro bot, le ponemos un alias y le damos a “Publish”.

Pues ya tenemos nuestro bot, ahora volvemos a la vista principal de AWS Amazon Lex y veremos nuestro bot creado.

Seleccionamos nuestro bot y accedemos al menú Actions -> Export

En este menú solo tenemos que indicar que versión de nuestro bot queremos exportar (ahora solo tenemos una) y la plataforma. Es aquí donde debemos indicar que nuestra plataforma será Alexa Skill Kit (ASK).

Ya tenemos nuestro bot con formato Alexa en un Zip. Este zip contiene un JSON que debe parecerse al siguiente:

{
"intents": [
{
"name": "HelloWorldIntent",
"samples": [
"hola, me llamo {nombre}",
"hola, soy {nombre}",
"soy {nombre}"
],
"slots": [
{
"name": "nombre",
"type": "AMAZON.FirstName",
"samples": []
}
]
}
],
"types": [],
"prompts": [
{
"id": "Elicit.Intent-HelloWorldIntent.IntentSlot-nombre",
"promptVersion": "1.0",
"definitionVersion": "1.0",
"variations": [
{
"type": "PlainText",
"value": "Dime tu nombre"
}
]
}
],
"dialog": {
"version": "1.0",
"intents": [
{
"name": "HelloWorldIntent",
"confirmationRequired": false,
"prompts": {},
"slots": [
{
"name": "nombre",
"type": "AMAZON.FirstName",
"elicitationRequired": true,
"confirmationRequired": false,
"prompts": {
"elicit": "Elicit.Intent-HelloWorldIntent.IntentSlot-nombre"
}
}
]
}
]
}
}

Por último solo nos queda ir a nuestra consola de Alexa y creamos una Custom Skill y comenzamos con una plantilla vacía.

Y simplemente vamos a nuestro JSON Editor y lo copiamos

Es posible que sea necesario hacer algunos cambios en el JSON para que sea válido, pero en gran parte tenemos mucho trabajo hecho gracias a esta posibilidad, en nuestro caso, el JSON quería así:

{
"interactionModel": {
"languageModel": {
"invocationName": "change me",
"intents": [
{
"name": "AMAZON.CancelIntent",
"samples": []
},
{
"name": "AMAZON.HelpIntent",
"samples": []
},
{
"name": "AMAZON.StopIntent",
"samples": []
},
{
"name": "HelloWorldIntent",
"slots": [
{
"name": "nombre",
"type": "AMAZON.FirstName",
"samples": [
"{nombre}"
]
}
],
"samples": [
"hola, me llamo {nombre}",
"hola, soy {nombre}",
"soy {nombre}"
]
},
{
"name": "AMAZON.NavigateHomeIntent",
"samples": []
}
],
"types": []
},
"dialog": {
"intents": [
{
"name": "HelloWorldIntent",
"confirmationRequired": false,
"prompts": {},
"slots": [
{
"name": "nombre",
"type": "AMAZON.FirstName",
"confirmationRequired": false,
"elicitationRequired": true,
"prompts": {
"elicitation": "Elicit.Slot.923639084901.883481269197"
}
}
]
}
],
"delegationStrategy": "ALWAYS"
},
"prompts": [
{
"id": "Elicit.Slot.923639084901.883481269197",
"variations": [
{
"type": "PlainText",
"value": "Dime tu nombre"
}
]
}
]
}
}

--

--