techAI te enseña: crea tu propio Chatbot con Dialogflow

Los chatbots han tenido un gran crecimiento en los últimos años, en gran parte impulsados por la creación de plataformas en donde se pueden alojar estos asistentes virtuales, como las que han creado Facebook Messenger (que para finales de 2016 albergaba más de 33.000 bots), Slack, Telegram, entre otros. Este tipo de soluciones son utilizadas para la generación de interacciones más amigables con los clientes e incluso con los propios empleados, y están siendo ampliamente utilizados en diversas industrias, que van desde su uso en instituciones financieras, pasando por talento humano y llegando hasta los servicios legales. El Natural Language Understanding es la subárea de la IA que se encarga de lograr comportamientos más amigables y humanos en la interacción con este tipo de sistemas.

En este nuevo post de techAI, el proyecto de Inteligencia Artificial de Tech and Solve, te explicaremos cómo construir un chatbot usando la API de Google Dialogflow.  Aprenderás a entender las peticiones que puede tener un usuario al interactuar con el chatbot, procesar información que el usuario comparte en su interacción y lograremos que el chatbot pueda mantener el hilo o contexto de esta conversación.

Entre las preguntas más recurrentes dentro de tu empresa son las relacionadas con los procesos de vacaciones, como por ejemplo el tiempo de anticipación con el cual se deben solicitar, los trámites para hacer la solicitud, entre otros. Para ayudar a agilizar y  hacer más fáciles para el empleado este tipo de consultas, decides hacer un chatbot que a estos interrogantes, sin dependencia de la disponibilidad de personas ni de un horario.

El primer paso que vamos a hacer es que el chatbot pueda responder la pregunta de cómo es el proceso para la solicitud de vacaciones.

Para el desarrollo del chatbot, se hace uso de la plataforma Dialogflow de Google. Para esto es necesario activar una cuenta, crear un proyecto, y crear el primer agente lo cual se puede hacer siguiendo este enlace.

Una vez completadas estas tareas, el siguiente objetivo es que el chatbot sea capaz de identificar la intención del empleado, es decir, que durante la conversación, sea capaz de identificar el momento en que le solicitan información acerca del proceso de vacaciones. En Dialogflow, el componente que nos permite capturar esa intención se llama “Intent” y requiere un nombre para su identificación, en este caso ‘ProcesoVacaciones’. Para crearlo, se puede dar clic en el signo mas(+) en el menú lateral, en la opción Intents o estando en la sección se intents, se puede dar clic sobre el botón Create Intent:

Ahora, ¿cómo asociar este componente con lo que escribe el empleado en el chat?. Para esto, es necesario ingresar algunos ejemplos de cómo una persona haría consultas acerca del proceso de vacaciones para que la plataforma vaya aprendiendo a asociar ese tipo de preguntas con la intención (intent) ‘ProcesoVacaciones’. Algunos ejemplos puede ser:

¿Cómo es el proceso para solicitar vacaciones?

¿Cómo puedo solicitar vacaciones?

Me puedes decir qué debo hacer para solicitar mis vacaciones

Hola, quisiera conocer el proceso para solicitar vacaciones

Como se observa, hay diferentes formas de preguntar para la misma solicitud y entre más ejemplos se proporcionen, mejor va a ser la interacción del chatbot con personas.

Hasta este punto solo hemos mencionado cómo a partir de una conversación de chat, podemos detectar si la intención que tiene el empleado es de consultar el proceso para solicitar sus vacaciones, pero no se ha hablado aún de la respuesta, o sea, la información que se va a mostrar a la persona una vez hemos detectado esta solicitud. Para hacerlo, supongamos que la respuesta a este interrogante es:

“El proceso para solicitar vacaciones es el siguiente: Primero debes ingresar la solicitud a http://tnm.techandsolve.com, luego debes esperar la aprobación de tu líder y una vez este lo haya aprobado puedes disfrutar de tus vacaciones”

Para indicar que el texto anterior corresponde a la respuesta de la intención, lo podemos hacer mediante la configuración del intent en la sección Responses. La siguiente imagen muestra un resumen de la configuración con la información que hemos mencionado hasta el momento:

Hasta ahora, el chatbot es capaz de detectar la intención del empleado de conocer sobre procesos de vacaciones, y proporcionar una respuesta, pero ¿qué pasa si queremos proporcionar la respuesta a esta solicitud solo a personas que trabajan en mi empresa?. En este caso supongamos que solo si la cédula de la persona corresponde con la de un empleado, la respuesta se va a mostrar. Para esto es necesario modificar la respuesta para validar que la cédula ya haya sido ingresada y corresponda a la de un empleado, pero nos encontramos con la limitante de que la sección de respuestas hasta el momento no permite el manejo de datos de mi negocio, como por ejemplo registrar y validar cédulas y hacer código personalizado para el manejo de las intenciones. Para solucionar este problema y que el chatbot se pueda integrar con un sistema de información externo es necesario habilitar el mecanismo de “fulfillment”:

Nota: En este caso el servicio de fulfillment, interactúa con un sistema externo que está desplegado en Firebase (creado por Google para nosotros no tener que crear nuestro sistema y conectarlo), y por medio del cual se va  poder crear la propia lógica de manejo de los intents. Para conectar con otro sistema externo, por ejemplo empresarial, puede leer esta documentación.

Una vez habilitada la integración con el sistema externo, es necesario indicarle a la intención ‘ProcesoVacaciones’ mediante la opción Enable webhook call for this intent  que el flujo a partir de la identificación de la intención va a seguir siendo manejado mediante el sistema externo.

El sistema externo por su parte, define una serie de funciones dentro de las cuales debemos crear una para el manejo del intent. La función es la siguiente:

En la línea 16 se crea la estructura que contiene la información de las cédulas conocidas. En la línea 31 se define la función ‘holidaysHandler’ que básicamente lo que hace es obtener el contexto de la intención para determinar si dentro de éste existe un parámetro llamado idCard. Si el parámetro no existe o no corresponde con una cédula válida (dentro del conjunto de cédulas definido en la línea 16), la respuesta es el mensaje presentado en la línea 42 y en caso contrario la respuesta es la información relacionada con el proceso de vacaciones. Por último, en la línea 56 se indica que la función  ‘holidaysHandler’ es la encargada de seguir con el flujo del intent.

A este punto, ya tenemos definida la forma de dar respuesta a la solicitud del empleado pero aún no tenemos información que nos permita identificarlo y por lo tanto solo podemos dar una respuesta solicitando que ingrese su identificación. Cuando la persona ingresa el número de su cédula, es necesario poder capturar este valor como un parámetro para que pueda ser accedido por el sistema externo con el fin de hacer la validación. Para esto, debemos crear una nueva intención con el nombre ‘CapturaCedula’ que va a detectar el instante en que la persona ingresa la cédula y puede ocurrir que la entrada de la persona sea algo como “mi cédula es 12345678”, “1234569” o “esta es mi cédula 4569874” en cuyo caso es importante separar el número del texto que lo acompaña. Para esto, en la configuración de la intención podemos primero, proporcionar ejemplos de formas comunes en las que un usuario podría ingresar su cédula; segundo, marcar en estos ejemplos la parte que corresponde a una cédula indicando el tipo de dato o entidad para el parámetro, en este caso numérico; y tercero, asignando un nombre para el parámetro que va a ser la forma como se pueda acceder desde el sistema externo, en este caso lo llamaremos idCard. La siguiente imagen muestra la forma de definir la configuración mencionada:

Ahora queremos hacer la validación de la cédula mediante el sistema externo,  y para tener acceso al parámetro desde este sistema debemos primero habilitar fulfillment en la intención como ya se vio anteriormente, como segundo paso se debe crear una función ‘identificationHandler’ cuyo objetivo es continuar el flujo de la intención y como tercero se debe mapear el nombre del intent ‘CapturaCedula’ con la función creada. La función es la siguiente:

En la función ‘identificationHandler’ se obtiene el parámetro de la cédula bajo el nombre idCard en la línea 52. En la línea 53 se valida que exista el parámetro y además que su valor corresponda con una de las cédulas registradas. En caso de que la verificación sea exitosa, se muestra como respuesta el proceso para la solicitud de vacaciones y en caso contrario se indica como respuesta que no se pudo verificar la identidad.

Tal como está nuestro chatbot, es posible que un empleado tan solo con digitar su número de cédula, y que ésta sea válida, se le proporcione la respuesta sobre el proceso de vacaciones pero no deseamos este comportamiento. En vez de esto, queremos dar esta respuesta solo si antes el empleado hizo la consulta sobre este proceso y para esto, debemos agregar un contexto a la conversación. De forma más específica, como parte del contexto de la intención ‘ProcesoVacaciones’ queremos manejar la intención ‘CapturaCedula’ (intención que tiene la persona cuando ingresa su cédula). Primero necesitamos crear un contexto en la intención ‘ProcesoVacaciones’ llamado ‘ProcesoVacaciones-followup’ que va a ser el mismo contexto que va a usar la intención ‘CapturaCedula’ para dar la respuesta. La forma de hacerlo es la siguiente:

Luego, solo queremos que la intención ‘CapturaCedula’ sea ejecutada si el contexto ‘ProcesoVacaciones-followup’ de la intención ‘ProcesoVacaciones’ está activo, esto nos garantiza que solo se va a tratar de llamar la intención de la cédula, si antes se hizo la pregunta sobre el proceso de vacaciones. Para esto en la configuración de la intención ‘CapturaCedula’ puede configurar esta información tal como se muestra en la imagen:

Ahora solo nos queda una cosa pendiente por aclarar, y es que la siguiente vez que se haga una pregunta sobre el proceso de vacaciones, se detecte de alguna forma si el empleado ya ha ingresado su cédula previamente con el fin de no requerir de nuevo esta verificación. Para esto, vemos como en la imagen anterior se definió el contexto ‘solver-context’ y es necesario que la intención ‘ProcesoVacaciones’ verifique en su flujo si este contexto está activo con el fin de obtener el valor de la cédula (parámetro idCard), verificarla y proporcionar la respuesta (este comportamiento ya se definió en la función holidaysHandler):

Nota: Puede consultar más información  acerca de contextos en este enlace

Finalmente tenemos una versión del chatbot funcional con dos intents, uno para detectar la intención de cuando hacen la pregunta acerca del proceso de vacaciones, y el otro para capturar como parámetro la cédula ingresada por el empleado. Además, como se hace validación de la cédula, es necesaria la integración con un sistema externo mediante el fulfillment. Por último, es necesario agregar un contexto a la conversación con el fin de asociar la intención que captura el número de la cédula, con la intención que detecta la pregunta sobre el proceso de vacaciones y de esa forma establecer un hilo en la conversación bajo el contexto de proceso de vacaciones.

En conclusión logramos crear un asistente virtual que puede entender la intención con la que estamos interactuando con él, hace una validación con un número que nos identifica y a partir de esto resuelve nuestra inquietud. Los asistentes virtuales están en pleno crecimiento, y seguirán mejorando a medida que interactuamos con ellos, esto lo podemos ver en la notoria mejoría que ha tenido el asistente de google en nuestros smartphone, siri en iphone y el gran éxito que ha tenido Alexa en los Amazon Echo, cada vez capturando mejor nuestras intenciones y logrando impresionarnos con sus respuestas. Todo esto con la intención de crear una interacción más humana y en la forma en la que naturalmente nos comunicamos usando el lenguaje.

Compartir

Share on facebook
Share on twitter
Share on linkedin

Entradas relacionadas

¿Quieres recibir más información sobre tendencias en desarrollo de software, DevOps, innovación o productividad?

Últimas entradas