Bankbot: anatomía de un chatbot

Cuando me encomendaron la misión de construir un Chatbot, mis indicaciones fueron: “armar un chatbot bancario, usando las tecnologías Angular 4 y Python”. Esto suponía una serie de desafíos para mí, como arquitecto de software, dado mi poco conocimiento en la temática y la falta de experiencia con esas tecnologías.

Entre los desafíos esperables aparecían: elegir un engine que pudiera soportar la funcionalidad del Chatbot; construir una UI simple que permitiera chatear; construir un backend que se encargara de la interacción con el engine, y a la vez expusiera servicios consumibles desde la UI; considerar aspectos no funcionales (como seguridad, concurrencia, eficiencia, etc.). Pero me encontré también con un desafío no esperado: darle vida a esta nueva entidad.

Me surgieron muchas dudas: ¿Cómo se iba a llamar? ¿A quién se dirigiría? ¿Qué palabras usaría? ¿Con qué tono se iba a comunicar? ¿Qué tratamiento le daría a su interlocutor? ¿Sobre qué temas podría responder? ¿Sobre qué temas sabría que no podría responder? ¿Cuáles serían los temas que, directamente, no lograría comprender? ¿Ejecutaría alguna acción, más allá de brindar información? etc., etc., etc.

Entendí entonces que la construcción de un chatbot no es tarea para alguien técnico, con conocimientos de computación, o al menos no exclusivamente. Como ocurre habitualmente con los problemas complejos, la mejor solución se puede alcanzar a partir de un equipo interdisciplinario, con distintos perfiles, enfoques y formaciones, donde cada uno aporte su valor agregado.

Como en cualquier otra actividad, antes de construir es necesario analizar y diseñar. Principalmente a la hora de definir el contenido y la manera de interactuar de un chatbot, necesitamos contar con gente que posea un perfil analítico, capaz de comprender el negocio, acotar el alcance, definirle una personalidad y considerar las necesidades de quien vaya a interactuar con él.

Este artículo pretende funcionar como una introducción amigable para cualquier interesado en entender las bases de un Chatbot. Si bien trata sobre conceptos genéricos, éstos se apoyan principalmente en la herramienta de IBM llamada Watson Conversation™. Watson permite crear aplicaciones que entiendan las entradas de lenguaje natural y utilicen Machine Learning para responder a los clientes simulando una conversación entre humanos. En otras herramientas (Amazon’s Alexa, Microsoft Bot Framework, etc.) los nombres pueden variar, pero los conceptos se mantienen.


¿Qué es un chatbot y para qué sirve?

Sabemos que los Chatbots están transformando cada vez más la forma en que interactuamos con el software. Brindando una gran oportunidad de negocio tanto para pequeñas como grandes empresas. Así que vamos a empezar describiendo por qué son tan importantes.

Los chatbots se pueden definir como agentes de software capaces de conversar a través de una interfaz de chat. Eso significa es que son programas que pueden mantener una conversación, con el fin de proporcionar algún tipo de valor agregado para el usuario final.

Habitualmente, el chatbot saludará al usuario para luego invitarlo a hacer alguna clase de pregunta. Cuando el usuario envíe su inquietud, el chatbot analizará la entrada para averiguar cuál es la intención de la pregunta del usuario. Finalmente, responderá de manera consecuente o lógica, ya sea proporcionando la información requerida o solicitando más detalles antes de responder la pregunta.

Los chatbots más avanzados pueden mantener una conversación de una manera natural, dentro del alcance de lo que están diseñados para hacer, intentando ayudar al usuario y logrando que se sienta comprendido. De esta manera crean una cierta relación con el usuario, sin pretender ser humanos.

Con frecuencia, los chatbots ofrecen algún tipo de asistencia virtual al usuario: proporcionan soporte a clientes, recabando información del mismo para proporcionarle algún tipo de servicio o solucionar algún reclamo. Además de chatbots “asistentes”, también hay otras tipologías de chatbots, como bots sociales que interactúan con usuarios en Twitter; bots de entretenimiento cuyo principal objetivo es proporcionar diversión al usuario; bots desarrollados con fines de investigación; y, lamentablemente, incluso existen spam chatbots, como usuarios falsos que interactúan con los reales en distintos sitios, con el fin de promocionar productos propios.

Dependiendo del contexto, es aceptable usar el término bot en lugar de chatbot. Sin embargo, se trata de un término más genérico, ya que hay programas de software capaces de realizar de forma automatizada una determinada operación en nuestro nombre sin ser chatbots. Es entonces el elemento conversacional lo que hace que un bot sea chatbot.


¿Cómo se construye?

Sabemos que nuestro chatbot va a iniciar la conversación, por lo tanto siempre comenzará por presentarse, saludar al usuario y pedirle que haga las preguntas que pueda tener. Obviamente, el chatbot no podrá responder a todas las preguntas posibles pero trataremos de cubrir la mayor cantidad, contestando preguntas y preocupaciones habituales. El bot también podrá hacer preguntas adicionales y, básicamente, solicitar una aclaración del usuario antes de proporcionar una respuesta precisa.

A la hora de diseñar un chatbot es posible que tengas muchas dudas sobre cuál es el mejor enfoque. Algunas de las preguntas que debes responderte antes de comenzar son, por ejemplo, ¿Qué papel cubrirá el chatbot? ¿Qué tono y personalidad le vamos a dar al chatbot? ¿Qué tan proactivo queremos que sea el robot? ¿Qué responsabilidades tendrá y cuáles no?

A continuación voy a listar con qué elementos contamos a la hora de diseñar un chatbot y cómo podemos combinarlas, para luego repasar algunas de las mejores prácticas recomendadas al crearlo.

¿Con qué herramientas contamos?

Si bien la idea de un programa que pueda conversar con una persona parece sumamente compleja, la realidad es que podemos hacer nuestro propio chatbot combinando únicamente 3 herramientas: Intenciones, Entidades y Variables de Contexto.

Intenciones

Las intenciones representan el objetivo o el propósito de la pregunta del usuario. La manera de definir intenciones es agrupando distintas frases de ejemplo bajo una misma intención. Una vez que definamos las frases, el engine aprenderá a reconocer tanto las frases que le brindemos como otras similares, gracias a su capacidad de Procesamiento de Lenguaje Natural.

¿Qué tipo de intenciones necesitamos? Podemos comenzar con charlas básicas. Este tipo de intenciones es común entre la mayoría de los chatbots, más allá del dominio de negocio. Pueden parecer triviales, pero ayudan a que los chatbots se relacionen de forma más humana con los usuarios y por lo tanto, resulten más útiles.

Algunos ejemplos serían:

  • Saludar: “hola”; “buenos días”; “buenas tardes”; “buenas noches”.
  • Agradecer: “gracias”; “muchas gracias”; “te agradezco”.
  • Despedir: “adiós”; “hasta luego”; “nos vemos”.

Según el tipo de chatbot que queramos construir iremos identificando otras intenciones, más relacionadas con el negocio. Estas son las que ofrecerán el mayor valor agregado para los usuarios. De acuerdo con el objetivo de nuestro bot, estas intenciones relevantes podrían ser: “consultar”;“solicitar”; “ordenar”; “simular”, etc.

Entidades

Las entidades nos permiten recopilar detalles específicos en la pregunta del usuario. Al usarlas junto con las intenciones permiten que el chatbot brinde respuestas específicas.

Por ejemplo, si pensamos en un bot para una compañía de telefonía móvil, el usuario podría preguntar “¿Cuánto cuesta una línea con abono?” o “¿Cuánto cuesta una línea prepaga?”. Ambas expresan la intención de “consultar”. Sin embargo, las dos solicitudes requerirán respuestas diferentes. Para diferenciar esta intención (consultar) podemos usar entidades.

Las entidades tienen un nombre y una serie de valores. Estos valores, a su vez, tienen sinónimos asociados. Los sinónimos son opcionales, pero recomendados, dado que el usuario puede ingresar el mismo concepto usando palabras diferentes.

En el ejemplo anterior las entidades podrían ser:

  • LíneaAbono: abono, plan, minutos libres.
  • LíneaPrepaga: prepago, tarjeta, control.

Cuando el engine analiza la pregunta del usuario, intentará primero detectar la intención y luego cualquier entidad coincidente. A diferencia de las intenciones, (donde engine descubrirá por sí mismo el objetivo final del usuario y lo unirá con una de las definiciones que le dimos), para las entidades solo detectará los valores exactos o los sinónimos que hayamos especificado.

Es importante notar que depende de quien diseñe el chatbot decidir qué significa un sinónimo. Puede tratarse de un sinónimo real, pero también puede ser un concepto relacionado que el diseñador intente agrupar junto con el valor de una entidad porque sabe que la respuesta para ambos será la misma (en el ejemplo anterior, “tarjeta” y “control” son sinónimos agrupados en la entidad “LíneaPrepaga”).

Contexto

La conversación con el chatbot, en principio, no tiene estado, lo que significa que no retiene información entre una interacción con el usuario y la siguiente. Sin embargo es muy probable que queramos contar con información de contexto para enriquecer nuestra conversación (ya sea provista por el propio usuario o externa a la charla), que podamos utilizar luego en la toma de decisiones. Para esos casos vamos a definir variables de contexto.

Una variable de contexto nos da la posibilidad de almacenar un dato para utilizarlo más adelante; se define en base a un nombre y, opcionalmente, se le especifica un valor predeterminado.

La aplicación que se comunica con el engine debe mantener toda la información de contexto y enviarla al engine con cada mensaje que se realiza como parte del flujo de la conversación.

Un ejemplo típico es preguntarle al usuario su género , y almacenar la respuesta en una variable de contexto, para luego utilizar esta información a la hora de seleccionar una respuesta más acorde a sus preguntas.

¿Cómo las combinamos?

Diálogos

La manera de combinar las herramientas que mencionamos antes es a través de la creación de un “diálogo”. Al crear un diálogo se define cómo responderá el chatbot a lo que el usuario está preguntando. El diálogo está compuesto por nodos, donde cada nodo tiene: un nombre que lo identifica; una condición; y una o más posibles respuestas.

Condición

Cuando el usuario envía un mensaje, comienza a evaluarse el diálogo desde el primer nodo en la parte superior. Si se cumple la condición, el chatbot responderá con la respuesta especificada en ese nodo y detendrá la ejecución hasta que el usuario haya ingresado una nueva entrada. Si no se cumple la condición, omitirá la respuesta, procederá a considerar el nodo siguiente, y así sucesivamente. Esencialmente, la ejecución de arriba hacia abajo continúa mientras las condiciones del nodo no cumplen con lo que ingresó como entrada el usuario.

Para escribir condiciones se pueden usar intenciones, entidades, variables de contexto y algunas palabras especiales, como “welcome” o “anything_else”. También se pueden combinar estos elementos con operadores lógicos como “AND” y “OR”. Algunos ejemplos de condiciones serían:

  • Si el engine reconoce la intención: Consultar.
  • Si el engine reconoce la Intención Consultar AND la entidad “LineaPrepaga”.
  • Si el engine reconoce la intención welcome.

La condición “welcome” se activa cada vez que un usuario comienza a interactuar con el chatbot, y se utiliza para recibirlo con una presentación y saludo inicial. Por otro lado, cuando la entrada del usuario no coincida con ninguna de las condiciones de los nodos, se activará el nodo con la condición “anything_else”, respondiendo que el bot no pudo interpretar el mensaje recibido y solicitando una clarificación. Es conveniente configurar este nodo con varias respuestas, ya que si solo incluimos una respuesta, el bot podría volverse molesto bastante rápido. Estos dos nodos que manejan escenarios comunes son muy útiles para preparar a nuestro bot a la hora de atender un gran número de situaciones recurrentes.

Respuesta

Las respuestas son las frases con las que el chatbot brindará información al usuario, o formulará nuevas preguntas para conocer mejor sus necesidades.

Una vez que tenemos definidas nuestras intenciones y entidades, el engine puede reconocer la intención del usuario (saludar, agradecer, abandonar la conversación, etc). Lo que ahora necesitamos es la capacidad de responder al usuario. No debemos olvidar que siempre se deben adaptar las respuestas a la audiencia. Si estamos construyendo un chatbot para un estudio de abogados, tal vez evitar una actitud informal sea lo más apropiado. Si es para estudiantes universitarios, pueden pensarse respuestas más divertidas. Una buena idea es también agradecer al usuario por pasar tiempo charlando con nuestro chatbot y desearle un gran día al despedirse.

Para responder debemos configurar en cada nodo un bloque de posibles respuestas. Es conveniente configurar varias porque no queremos enviar la misma respuesta una y otra vez. También es posible establecer el orden como aleatorio, de manera que tampoco se repita el orden en que se utilizan.


Buenas Prácticas

Ahora vamos a repasar algunos tips que te serán de muchísima utilidad cuando comiences la tarea de diseñar un chatbot. Puede resultar conveniente volver a consultar esta sección durante la etapa de diseño del chatbot, para asegurarte de hacerlo de la mejor manera.

Personalidad

Comenzar nuestro diálogo con preguntas del tipo “¿Cómo puedo ayudarlo?” suena útil, pero de por sí solo es demasiado amplio y haría que nuestro chatbot falle. Un mejor enfoque sería comenzar por darle un poco de personalidad ( por ejemplo, con un nombre). Luego, presentarlo como un chatbot; y a continuación declarar el alcance del chatbot, configurando así las expectativas del usuario para una interacción exitosa.

Presentación

La presentación no debería ser demasiado larga, por lo que, si el chatbot tiene muchas capacidades, no es el momento de enumerarlas todas. En su lugar, deberíamos mencionar el alcance general de éste, y en todo caso manejar una intención “capacidades” para preguntas como: “¿Cómo me puedes ayudar?” o “¿Qué tengo que hacer?”. Incluso se podría saltar a ella después de ejecutar el nodo “anything_else”. De esta manera, cuando el usuario siga haciendo preguntas irrelevantes o fuera del alcance, podemos informarle sobre lo que puede hacer el bot y reubicarlo en la senda correcta.

Jerarquía

Es posible crear nodos secundarios. Estos nodos se consideran para ejecutar sólo cuando la condición del nodo principal se cumple primero. Normalmente el flujo de ejecución se detiene una vez que un nodo cumple la condición. El bot envía una respuesta, espera más información, y luego se reinicia el ciclo. Sin embargo, si el nodo correspondiente tiene nodos secundarios, la ejecución continúa éstos, y no con los nodos principales.

Cuando se evalúan los nodos secundarios (al igual que como se hace con los principales) se consideran de arriba hacia abajo. Esto es muy útil para hacer que un nodo padre solicite aclaraciones al usuario en su respuesta, y luego maneje la información específica proporcionada en sus nodos secundarios.

Respuestas condicionales

Como alternativa a los nodos hijos, consideremos el hecho de que las respuestas pueden tener condiciones asociadas. Un nodo puede tener múltiples respuestas que sólo se procesan si se cumple su propia condición. Entonces, en lugar de tener múltiples nodos secundarios (uno para cada ocasión), podríamos tener un único nodo que proporcione respuestas diferentes, dependiendo de la información que proporcione el usuario en respuesta a nuestra solicitud de aclaración.

Clarificación

Cuando tenemos una misma intención que aplica a varias entidades, es deseable que el bot identifique correctamente tanto la intención como la entidad en cuestión. Una manera muy simple de desambiguarlas sería agregar un nodo por cada posible combinación de intención/entidad.

Por otro lado, un mejor enfoque sería plantear preguntas de clarificación a los usuarios. Crear un nodo dedicado a manejar cada entidad dentro de la intención es un enfoque más limpio que también simplificará las cosas más adelante. Incluso dentro de este nodo podríamos utilizar respuestas condicionales para restringir las contestaciones a valores específicos de la entidad.

Diseño

Hacer preguntas de aclaración para determinar una respuesta adecuada es un escenario muy común. El usuario tiende a ver este comportamiento como una señal de que el bot lo entiende y se está desarrollando una conversación.

¿Cómo se determina qué preguntas necesitan una repregunta de aclaración y cuáles no? Esa es una decisión de negocio. Lo importante es que quede claro qué respuestas se necesitan para qué preguntas, y cuándo se necesita una solicitud de más información para proporcionar una respuesta precisa. Una buena práctica es implementar esto en un archivo de texto, en papel (como una tabla, o incluso como un mapa mental) antes de construir el bot.

Orden

Habitualmente es recomendable tener los nodos con condiciones más restrictivas por encima de los más generales, con el fin de evitar que éstos últimos eclipsen a los más específicos. Para definir esto, es necesario contemplar el orden de ejecución probable. Por ejemplo, el usuario puede saludar al bot, consultarle, agradecerle y, finalmente, irse.

Flujo

Los nodos hijos pueden tener sus propios nodos hijos, lo que nos capacita para crear un flujo de diálogo bastante complejo. Además, tenemos la posibilidad de saltar de un nodo a otro; algo que puede complicar nuestro flujo de diálogo, pero que a veces será necesario para poder reutilizar nodos que hayan quedado por fuera del nodo padre. Por ejemplo, en el Bankbot que aparece más abajo, podríamos llegar al nodo “Simular Tradicional” directamente si ingresamos la entidad “tradicional”, o pasando primero por el nodo “Plazo Fijo” y su hijo “Tradicional”.

Testing

A medida que se complejiza nuestro diálogo, es probable que nos queden situaciones sin cubrir, o lo que es peor, cubiertas de manera incorrecta. Por eso que es muy importante realizar pruebas para garantizar que lo que hace nuestro bot sea exactamente lo que esperamos que haga.

Por ejemplo, a partir de estas pruebas se pueden identificar “contraejemplos”; es decir, intenciones que no son bien interpretadas por el bot. Una vez indicados como contraejemplos, el engine será capaz de reconocerlos correctamente la próxima vez.


BankBot

Para cerrar, saltaremos a la práctica con un ejemplo de Bot Bancario, capaz de darnos información sobre plazos fijos y ayudarnos a simular uno antes de constituirlo. A continuación presentamos la combinación de las herramientas antes descriptas, las cuales utilizamos a la hora de construirlo. El ejemplo está completo, de manera que cualquiera podría cargarlo en Watson Conversations y tener su propio Chatbot funcionando.

Para ver el Chatbot en funcionamiento podés dirigirte al siguiente link: http://bankbot.lab.fluxit.com.ar/

¡Espero que te animes a meterte en el mundo de los Chatbots y generar así aún más valor de negocio para tus clientes!