martes, 19 de diciembre de 2017

Primer Chatbot - Dialogflow (Google Platform)

Al finalizar la entrada anterior del blog, comenté que iba a hacer un ejemplo usando Dialogflow (antes API.AI). Dialogflow es una plataforma Cloud de Google para desarrollar chatbots.

Me ha sorprendido la facilidad de uso de la plataforma, es bastante intuitiva y simple de usar. Previamente hay que diseñar y establecer el flujo de la conversación que deseamos implementar con el chatbot. Y una vez entendidos los conceptos que describimos en la introducción de esta serie de posts, podemos saltar a construir nuestro primer ejercicio.

La consola.


Para poder acceder al servicio, primero debemos darnos de alta. Esto se puede realizar teniendo una cuenta de correo de Google. La consola es limpia, simple y se ve de la siguiente forma una vez que hacemos login a la plataforma.


El agente.


Un agente contiene intents, entities y responses para poder interactuar con un usuario. Hablaremos con los nombres de los conceptos en inglés, que es como se encuentran en la plataforma.

Para poder crear un nuevo agente, basta con seleccionar el siguiente botón en la consola de la plataforma.

Posteriormente, veremos una pantalla que nos permitirá realizar las primeras configuraciones (programación) de nuestro agente.


Aquí basta con colocar un nombre al agente y el idioma que vamos a utilizar. La plataforma ofrece ya varias opciones: alemán, inglés, francés, español, italiano, japonés, coreano, holandés, portugués, ruso, ucraniano y varios tipos de chino. Además permite definir la zona horaria. Una vez que realizamos las primeras configuraciones, podemos presionar en el botón Create que se encuentra en la parte superior derecha.


Los intents.


Lo primero que nos ofrece la plataforma, es la configuración de los intents. Por default, existen dos intents previamente creados en nuestro agente, estos los mantendremos como originalmente configurados. El primero de ellos es para saludar (Default Welcome Intent) y el segundo es utilizado para dar una respuesta en caso de no comprender la solicitud del usuario (Default Fallback Intent).


Mi primer intent, decidí hacerlo para hablar de fútbol. El fútbol es el tema preferido de muchos, y mucho más cuando se acerca la fecha del mundial de Rusia 2018. Además de que acabamos de tener campeón regio del fútbol mexicano. Así que configuré el siguiente intent.


En el ejemplo anterior, al agregar las posibilidades de interacción con el usuario (User says), podemos observar algunas palabras resaltadas en colores: México, Rusia y 2018. Esto significa que son anotadas como parámetros que son asignados a algunas entidades del sistema como fecha y ciudad. Estos parámetros nos ayudarán a entender otras ciudades y fechas proporcionadas por el usuario y no sólo las que configuramos en el intent.

A continuación presionamos el botón Save que se encuentra arriba a la derecha para poder probar por primera vez nuestro agente. Veamos qué sucede.

Los responses.


Debido a que no tenemos configuradas las respuestas a nuestro intent (al menos no para el del fútbol), el chatbot no devolverá respuesta alguna. Sin embargo, podrá reconocer los parámetros que se colocan en el mensaje de entrada del usuario. Por ejemplo, una de las frases que colocamos en la sección User say del intent fue: "Equipo más popular en México". El intent automáticamente reconocerá México o Brasil o Rusia o cualquier otro país como un parámetro que forma parte de las entidades del sistema (sys.geo-city) y devolverá un valor "Not available" como respuesta default. Esto está bien, pues no hemos configurado respuesta alguna todavía. También notaremos que el intent ejecutado es el que configuramos "Futbol Intent"


En caso de que coloquemos una frase sin sentido, el intent que se ejecutará es el "Default Fallback Intent" y devolverá alguna de las respuestas configuradas. Intentemos eso.

Finalmente, vamos a configurar algunos responses para nuestro intent. En mi caso coloqué los siguientes. Notemos que en las respuestas asocié los parámetros recibidos en la solicitud del usuario. Entonces, el chatbot tiene manera de asociar esos parámetros de entrada, a la respuesta de salida que va a elegir de la lista.


Por lo tanto, si le pregunto cuál es el campeón del mundo actual, no podrá nunca responderme con: "El campeón del siguiente mundial en Rusia 2018 será Perú", puesto que en la entrada no estoy usando entidades del sistema como parámetros, por lo tanto el chatbot no elegirá una respuesta que sí usa esa información en alguna de las salidas posibles.

Las primeras pruebas.


Estas son las respuestas que obtenemos de este ejercicio:





Siguientes pasos.

En la siguiente entrada del blog, vamos a hacer al chatbot un poco más inteligente. Se me ocurre que puedo publicar un API que reciba algunos parámetros y devuelva estadísticas del fútbol que tanto nos gusta. Así, de acuerdo a las entradas recibidas podremos obtener las estadísticas de un API y devolver una respuesta más coherente al usuario.

lunes, 18 de diciembre de 2017

Chatbots - Intro

Hace algunos meses, mi amigo Rolando Carrasco (@borland_c) se dio a la tarea de escribir un chatbot. El proyecto se desarrolló inicialmente a manera de demo, Posteriormente se convirtió en parte de algunas presentaciones en eventos de Oracle. Ahora lo hicimos realidad como parte de la implementación de un proyecto con uno de nuestros clientes.

Si bien el core de las cosas que hacemos tienen qué ver con Oracle, también tenemos un equipo que investiga algunas otras tecnologías. Esto nos ha hecho tener mucho valor para nuestros clientes, debido a que muchas veces nos expresan algunas inquietudes acerca de otras tecnologías que se encuentran evaluando. El entendimiento agnóstico de muchos de los conceptos que se relacionan con la tecnología, nos lleva a jugar un papel importante a la hora de ser seleccionados por nuestros clientes.

El chatbot del que hablo fue escrito en python y montado en diferentes infraestructuras: una propia y en Oracle Application Container. En ambos casos nos conectamos a Facebook que fue desde donde pudimos establecer la primer interacción con el chatbot prototipo.

Conceptos básicos.


Los chats existen desde hace mucho tiempo. Recuerdo en mi época de estudiante (por ahí de finales de los 90's y principios del 2000) una variedad de sitios web que ofrecían canales de chat para todos los gustos: música, películas, regiones del mundo, idiomas, ligue, había para todos los gustos. En aquel entonces la interacción era a distancia, pero persona-persona.

Hoy en día, distintos sitios web de algunas compañías nos ofrecen servicios de chat para interactuar con su equipo de atención a clientes: bancos, aseguradoras, empresas de manufactura, empresas de tecnología, por mencionar algunos. Algunos de estos chats establecen una conversación de persona-persona; pero en algunos otros la conversación es entre una persona y un programa que simula mantener esa conversación (llamemos a este tipo de interacción: persona-máquina).

Desde luego que establecer esta conversación no es algo mágico, aunque en el medio sigue habiendo muchas personas que confían en que el mundo del software es algo que tiene qué ver con la fe, la alquimia o la magia negra. Pero esa es harina de otro costal.

Para establecer este tipo de conversación deben tomarse en cuenta distintos factores: las frases a las que va a responder el chatbot, el idioma en que se lleva a cabo la conversación, la lógica y coherencia de la conversación, el tipo de interacción (pregunta-respuesta, conversación abierta, saludos, despedidas, recomendaciones, por mencionar algunos). Nadie habla con una persona y expresa la despedida antes del saludo, o las respuestas antes de las preguntas. ¿O sí? Pues aplican las mismas reglas para las conversaciones con las máquinas. Imaginen que un humano no puede entender de lo que hablamos, ¿por qué una máquina habría de hacerlo?

Flujo de la conversación.


En una conversación de bidireccional entre personas existe un emisor y un receptor. Esos roles se intercambian de vez en vez, de acuerdo a la dirección de la conversación. Entonces, cuando hablamos con alguien más, generalmente (supongamos el siguiente escenario):

1. Saludamos
2. Solicitamos algo (se inicia el contexto de una conversación)
3. El receptor entiende lo solicitado y hace lo necesario para emitir una respuesta.
4. El receptor (ahora emisor), da una respuesta.
5. Posterior a esto, se puede continuar con la conversación sin necesidad de iniciar de nuevo un contexto, pues se asume que se está hablando del mismo tema (algunas diferencias notarán cuando hablan con una persona que habla de uno y otro tema a la vez).
6. Una vez que se terminan de atacar los temas de interés en la conversación, se finaliza con una despedida.

Invocation, Agent, Intent, Entity, Fullfilment, Response y Context.


Cuando se establece una conversación con una máquina (chatbot), generalmente se sigue este flujo:

1. Invocación: el usuario invoca al agente para iniciar una conversación. Esto lo podríamos comparar con el saludo de una persona a otra. Así, el usuario solicita hablar con el agente en la forma en que el desarrollador definió el inicio de la conversación.
2. El usuario solicita algo al agente, posterior a iniciar la invocación. Esto se realiza a través de un intent (intención, en su traducción literal al español). Un intent almacena los elementos y lógica necesarios para interpretar la información que el usuario está proporcionando, para poder responder a la solicitud.
3. Con la información proporcionada, el agente intenta interpretar la solicitud del usuario. Para que el agente pueda interpretar esta información será necesario contar con algunos ejemplos de cómo el usuario puede hacer una solicitud determinara. Por ejemplo: preguntar la hora (puede haber muchas formas para preguntar la hora). El desarrollador deberá agregar el mayor número de estas posibilidades al intent. Entre más variaciones de la misma solicitud se agreguen al intent, el agente comprenderá mejor lo que se le está solicitando.
4. El agente necesita saber cuál es la información que pudiera resultar más útil para responder a la solicitud del usuario. Esta información generalmente es conocida como entity (entidad, en español). Algunas entidades son nativas en las plataformas de chatbots (las más comunes). Sin embargo, muchas otras tendrán que ser definidas por el desarrollador, dependiendo del contexto que se quiera abarcar. Por ejemplo: en el contexto de un banco podría definirse una entidad que se llame Cuenta Bancaria. Mientras que en el contexto de una tienda departamental podría definirse una entidad que se llame Item o Producto.
5. Una vez que el agente recopila las entidades que debe devolver al usuario, se formatean en un mensaje que el usuario pueda comprender (fullfilment request). A este mensaje formateado se le conoce como response (respuesta).
6. Al igual que en una conversación persona-persona, ésta conversación se lleva a cabo en un contexto. El contexto puede ser utilizado para almacenar algunos valores de los parámetros de la conversación y utilizarlos de un intent a otro. Una forma de reestablecer una conversación que se ha roto (por ejemplo: el usuario cierra el canal de la conversación o hay un error en la plataforma), es a través del contexto. Manteniendo este tipo de valores de los parámetros de la conversación en el contexto, es posible reparar una conversación rota. Otro uso del contexto, es cuando podemos tener múltiples ramas dentro de una conversación (por ejemplo: cuando el flujo de la conversación depende de las respuestas de alguno de los participantes).

Siguientes pasos.


Una vez que hemos descrito los conceptos claves involucrados en las plataformas comunes para desarrollar chatbots, los siguientes pasos incluyen utilizar estos conceptos para desarrollar y configurar un chatbot básico.

Para lo anterior, usaremos la plataforma que Google proporciona para este propósito: api.ai (ahora Dialogflow).

En la próxima entrada del blog vamos a crear nuestro primer agente usando Dialogflow. Será un agente básico que utilizará algunas respuestas definidas por el desarrollador. Una vez que tengamos eso listo, vamos a incluir un poco de complejidad haciendo llamadas a algunas APIs existentes. Aquí es donde se me ocurre que podríamos incluir algunos servicios expuestos en tecnología Oracle. Esto para ejemplificar cómo la integración de las plataformas no tiene restricciones en cuanto a tecnología se refiere, siempre y cuando utilicemos mecanismos y protocolos de comunicación estandarizados.