En este blog ya hemos escrito dos artículos contando cómo se creó el chatbot para controlar un coche de carreras, podéis ver los artículos aquí:
Este artículo se enfocará en cómo poder recrear el chatbot en diferentes entornos, desplegar los nuevos cambios y analizar el chatbot para mejorar la experiencia de los usuarios finales que interactúan con él.
Una vez que hemos creado nuestro asistente conversacional o chatbot, ¿cómo lo podemos replicar de forma segura y consistente a diferentes entornos o cuentas? Normalmente tendremos diferentes entornos para desarrollo, pruebas, calidad, preproducción y producción, por poner un ejemplo, y queremos poder replicar nuestro chatbot de forma rápida.
Los chatbot, además, tienen mucha configuración y puede ser diferente para cada entorno. Para poder replicar de forma fácil y segura, utilizaremos la práctica de Infraestructura como código (IaC).
En AWS existe el servicio de AWS CloudFormation que ofrece la posibilidad de definir cualquier servicio como código y es el que usaremos para automatizar la creación de nuestro bot.
A partir de la v2 de Amazon Lex ya está disponible poder crear tu chatbot como código, para ello se tienen los diferentes Resource types:
A continuación, ponemos un ejemplo con el Intent “Luces” que es el mismo que se ha usado en los artículos anteriores.
El CloudFormation del CarBot consiste en cuatro recursos:
1. El IAM role que es usado por el bot en tiempo de ejecución (IAM Role usado por el servicio de Lex para hacer las llamadas en runtime)
Resources:
BotRuntimeRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- lexv2.amazonaws.com
Action:
- "sts:AssumeRole"
Path: "/"
Policies:
- PolicyName: LexRuntimeRolePolicy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- "lambda:InvokeFunction"
Resource: "arn:aws:lambda:us-east-2:xxxxx:function:my-function"
2. Definición del bot que depende del IAM role.
La definición del bot se compone de todos los recursos para crear el bot, tales como: Locales, Intents, Slots y SlotTypes y se agrupan en un único recurso de CloudFormation.
CarBotTemplateBot:
DependsOn: BotRuntimeRole
Type: AWS::Lex::Bot
Properties:
Name: "CarBotWithCFN"
RoleArn: !GetAtt BotRuntimeRole.Arn
DataPrivacy:
ChildDirected: false
IdleSessionTTLInSeconds: 300
Description: "How to create a CarBot bot with CFN"
AutoBuildBotLocales: false
BotLocales:
- LocaleId: "es_ES"
Description: "Control a car bot Locale"
NluConfidenceThreshold: 0.40
# VoiceSettings: no voice in our case
# VoiceId: "Ivy"
SlotTypes:
- Name: "volanteDireccion"
Description: "Controla la dirección del volante"
SlotTypeValues:
- SampleValue:
Value: "Encender luz azul"
- SampleValue:
Value: "Encender luz amarilla"
- SampleValue:
Value: "Apagar luz azul"
- SampleValue:
Value: "Apagar luz amarilla"
ValueSelectionSetting:
ResolutionStrategy: ORIGINAL_VALUE
# añadir más slots aquí
Intents:
- Name: "Luces"
Description: "Intent controlar las luces del coche"
SampleUtterances:
- Utterance: "quiero controlar las luces"
- Utterance: "encender las luces"
- Utterance: "apagar las luces"
IntentConfirmationSetting:
PromptSpecification:
MessageGroupsList:
- Message:
PlainTextMessage:
Value: "¿Qué quieres hacer con las luces?"
MaxRetries: 3
AllowInterrupt: false
Slots:
- Name: "lucesAccion"
Description: "something"
SlotTypeName: "lucesAccion"
ValueElicitationSetting:
SlotConstraint: "Required"
PromptSpecification:
MessageGroupsList:
- Message:
PlainTextMessage:
Value: "Card Group"
MaxRetries: 3
AllowInterrupt: false
3. Define la versión del bot que depende del recurso creado del bot y genera una versión, en este caso Draft.
CarBotTemplateBotVersionWithCFN:
DependsOn: CarBotTemplateBot
Type: AWS::Lex::BotVersion
Properties:
BotId: !Ref CarBotTemplateBot
BotVersionLocaleSpecification:
- LocaleId: es_ES
BotVersionLocaleDetails:
SourceBotVersion: DRAFT
Description: CarBot Version
4. Define el alias que depende de que se haya creado una versión que es el recurso que se ha creado arriba: AWS::Lex::BotVersion.
FirstBotAliasWithCFN:
DependsOn: CarBotTemplateBotVersionWithCFN
Type: AWS::Lex::BotAlias
Properties:
BotId: !Ref CarBotTemplateBot
BotAliasName: "CarBotVersion1Alias"
BotVersion: !GetAtt CarBotTemplateBotVersionWithCFN.BotVersion
SentimentAnalysisSettings:
DetectSentiment: true
Otra opción que nos ofrece Amazon Lex para poder recrear un chatbot en otro entorno, es la opción de Importar y Exportar. Para esta opción, primero tienes que desarrollar un chatbot y cuando ya has acabado puedes exportarlo e importarlo en otras cuentas o regiones. Importante recordar que si tu chatbot se integra con una Lambda u otro servicio también hay que desplegar esos servicios en la nueva región o cuenta.
El ciclo de creación de un bot lo detallamos en el siguiente diagrama, cuando has publicado una versión de tu bot es cuando puedes exportar esa versión e importarla en otra región o cuenta.
Para realizar esta acción, seleccionamos nuestro bot y posteriormente, vamos a Actions y seleccionamos: Export.
Nos aparecerá una nueva pantalla para seleccionar la versión que queremos exportar y si queremos usar una contraseña para proteger el contenido, que a no ser que sea un bot de ejemplo, siempre se debería usar y pulsamos el botón de exportar.
En nuestra consola de AWS, en el apartado de histórico de imports y exports, nos saldrá una nueva entrada que está realizando nuestra exportación y al terminar se descargará un zip con todo el contenido del bot en formato json.
Aquí un ejemplo de nuestro chatbot para controlar el coche:
Para importar el coche, volvemos al botón de Action en el apartado de Bots, esta vez no es necesario seleccionar ningún Bot y seleccionar Import.
Seleccionamos un nombre, el fichero a importar, si queremos un nuevo role y le damos a Importar.
Para este ejemplo, lo hemos creado en la misma región y por eso le hemos cambiado el nombre, al cabo de unos segundos ya aparecerá el nuevo chatbot con la descripción de la versión seleccionada, en nuestro caso la 2, pero hay que tener en cuenta que el import crea un nuevo chatbot por lo que sólo tendrá la versión Draft.
Otra posibilidad de exportar e importar los bots de Lex es usando los comandos de GetExport y StartImport para automatizar el proceso mediante un script o pipeline.
Dentro del apartado de analíticas, vamos a ver dos apartados, cómo realizar la mejora continua de nuestro chatbot de forma muy rápida y efectiva y en segundo lugar cómo crear un dashboard para analizar en tiempo real las interacciones de los usuarios finales.
Una vez que tenemos nuestro chat en producción tenemos que monitorizar y analizar los comportamientos de los usuarios para poder dar una mejor experiencia y uno de los mecanismos que nos ofrece Lex es el aprendizaje continúo basado en utterances perdidos (expresiones que el usuario dice o escribe que no están registradas).
El ciclo de mejora continua consta de tres fases como vemos en el diagrama.
Una fase es monitorizar la salud del bot, para ello, hay que activar el servicio de CloudWatch metrics. Las métricas son registradas para las tres operaciones principales que se usan para interactuar con un bot.
Otra fase es analizar las frases de los usuarios y ver si hay algún utterance que no esté identificado.
Por último, con todas las expresiones nuevas las podemos añadir a nuestro Amazon Lex para mejorar la experiencia de usuario de forma continua y completar el ciclo de mejora continua.
La consola de Amazon Lex nos provee de una forma rápida y efectiva de poder realizar esta mejora continua desde el apartado de Analytics. Para ello entramos en el bot que deseamos analizar y nos vamos a Utterance statistics. Desde aquí, puedes elegir la versión o el alias que deseas analizar, seleccionar los perdidos y ya nos ofrece un botón para que de forma fácil puedas añadir estas expresiones perdidas al intent correcto para que la próxima vez el chatbot ya lo entienda (junto al botón de Add utterances to intent hay una desplegable con todos los intents disponibles).
Además de las opciones que ya te ofrece por defecto la consola de Amazon Lex también es interesante analizar los logs conversacionales. Con estos logs se puede revisar el rendimiento del bot y solucionar problemas de las conversaciones de forma más fácil.
Por ejemplo, dentro de los logs se puede ver la request ID y la sesión ID. Con esta información puedes obtener la transcripción de la conversación incluyendo los utterance del usuario y las respuestas del bot. También se pueden obtener los metadata de los valores del slot para un utterance y el nombre del intent.
Para poder explotar estos datos, primero es necesario activar el envío de logs a CloudWatch. Esta activación es a nivel de alias, por lo que entraremos en el bot que queremos activar los logs, seleccionaremos Aliases
Vemos que está desactivado, para activarlo pulsamos sobre el botón “Manage conversation logs”.
Se abrirá una nueva pantalla donde podremos configurar si queremos o no activar los logs tanto de voz como escritos. Los logs escritos irán a CloudWatch y los audios irán a un bucket de S3. Activamos los logs que queremos, en nuestro caso los de texto con un Log Group que habíamos creado anteriormente y le damos a guardar.
Ahora vamos a CloudWatch, buscamos nuestro Log Group y ahí veremos nuestros logs:
En base a esta información, se puede crear un dashboard en CloudWatch con la siguiente información obtenida gracias a CloudWatch Log Insights:
- Widget de totales
- Widgets de listas
- Métricas de intención
- Mensajes perdidos
Aquí se muestra un dashboard con las métricas del chatbot para controlar el coche:
Este sería el diagrama de arquitectura con los componentes que se han usado para obtener la información:
Si queréis hacer un dashboard más completo podéis revisar la solución del blog de AWS.
Links y referencias:
https://aws.amazon.com/es/lex/
https://docs.aws.amazon.com/lex/latest/dg/conversation-logs.html