Automatizando y analizando Amazon Lex para controlar un coche de carreras (¡o lo que quieras!)

Contexto: Chatbot para controlar un coche de carreras

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.

Automatizando

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).

Automatizando con AWS CloudFormation

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

Automatizando con Amazon Lex Import/Export

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.

Digital Lover

Analizando

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.

Mejora continua

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).

Dashboard de monitorización continua

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

  • La vista de resumen: recuentos de usuarios, sesiones y expresiones para un rango de tiempo seleccionado.

- Widgets de listas

  • Métricas de usuario: Puede consultar para mostrar el compromiso de los usuarios en función del número de solicitudes.

- Métricas de intención

  • Las métricas de intención ayudan a identificar los N intents principales, lo que ayuda a tomar decisiones.

- Mensajes perdidos

  • Los informes de expresiones perdidas nos ayudan a identificar las expresiones que el bot no ha podido entender.
  • Estos datos le ayudan a enseñar al bot a aprender continuamente y a mejorar su respuesta a las preguntas.

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

webinar AWS

Guía de posibilidades profesionales sobre AWS
He leído y acepto la política de privacidad
Acepto recibir emails sobre actividades de recruiting NTT DATA