Si has llegado a este post sobre el desarrollo de Banquito, un bot conversacional con Inteligencia Artificial, es que seguramente ya has leído este otro post de cómo diseñar un chatbot utilizando IBM Watson.
En caso de no haber leído ese post en el que definimos el alcance del bot, ¡te recomiendo que empieces por ahí! En este post, comparto el PASO a PASO de cómo desarrollar un chatbot con IA. Aunque podría haber utilizado cualquier sistema de inteligencia artificial y procesamiento del lenguaje natural, he utilizado IBM Watson.
Tabla de contenidos
Vayamos al grano: configurando Watson
Lo primero que haremos en Watson es crear un workspace para el proyecto. Lo titulo “Banquito — Mi Bot de Banca”.
Posteriormente creamos las intenciones que ha de reconocer nuestro bot (en el otro artículo, tienes la explicación de los conceptos que utilizaremos en este artículo, así como un esbozo del diseño funcional del bot, que es lo que ahora voy a implementar). En este caso, para demostrar cómo va fallando el bot y cómo lo solucionamos entrenándolo de más contenido, crearé las intenciones una a una, e iré entrenándolas poco a poco.
A continuación, creo la intención de Consultar Saldo (#ConsultarSaldo), para ello tendremos que definir las formas en las que un cliente nos puede decir que quiere consultar su saldo.
Como queremos probar que el bot reconoce esta intención cuando le hablo, me voy a la pestaña diálogo:
Como observamos, ya vienen dos nodos genéricos preestablecidos, uno de bienvenida y otro “anything_else” que saltará cuando el bot no es capaz de seguir la conversación.
Antes de dar de alta el nodo de la intención #ConsultarSaldo, vamos a modificar las respuestas que vienen por defecto en el nodo de “Bienvenida”. Aprovecharemos ese mensaje de “Bienvenida” que damos al cliente cuando empezamos la conversación para saludar y explicarle qué es capaz de hacer nuestro bot, y así, sentar las expectativas de nuestro cliente.
Además de adaptar las respuestas de estos dos nodos que traen los sistemas de IA por defecto a nuestro caso de uso, también es una buena práctica crear otros nodos por cada #intención_básica. Es decir, podremos crear, o incluso exportar, intenciones básicas como: dar las gracias, solicitar ayuda, preguntas sobre quién eres, etc. En este ejemplo, no lo abordaremos, pero es algo sencillo.
Poniendo a prueba el bot conversacional desde el minuto 0
En la pestaña diálogo podemos abrir un emulador, para ir probando on the fly el funcionamiento del bot que tenemos desarrollado. Es decir, puedo ir comprobando conforme hago el desarrollo si el bot es capaz de identificar intenciones, entidades, y lanzarnos las preguntas definidas. Al abrirlo, vemos en la parte derecha “Try it out” como al comenzar el bot en Watson, nos devuelve uno de los textos que acabamos de definir.
Por cierto, como se veía en la imagen superior y se ve en la siguiente, se puede definir más de una respuesta, para que de forma secuencial o aleatoria, el bot vaya dando uno u otro mensaje. En este ejemplo, he puesto dos formas de contestar 😊
Ahora en serio, pongamos a prueba el bot
¿Qué pasa si le decimos “consultar mis movimientos”? Ya hemos definido la intención #ConsultarSaldo, ¿qué mensaje me va a devolver? Salgamos de dudas:
Como se ve en el ejemplo, si bien te identifica la intención, te devuelve la respuesta predeterminada del nodo “anything_else”. ¿Por qué ocurre esto? Sencillo, no hemos definido un nodo en el que le digamos que ejecute una determinada acción cuando identifique el intent #ConsultarSaldo. Así que, vamos a ello:
- Definimos un nuevo nodo que no depende de ningún otro,
- Le damos un nombre, le ponemos la condición de identificar la intención #ConsultarSaldo y le programamos una respuesta para probar que funciona, y
- Probamos en el diálogo, para verificar que ahora sí que funciona.
Definamos una nueva intención: “Sacar Dinero”
Ahora paso a definir la nueva intención #SacarDinero. Antes de hacerlo, pruebo a decirle a nuestro bot que queremos sacar dinero. ¿Qué resultados puedo esperar? Nos podrá decir que no nos entiende o vincularlo al #intent que sí conoce (#ConsultarSaldo). En este caso, no nos reconoce qué queremos decir:
Una vez comprobado que el bot no me entiende (el punto 1 de la imagen superior), paso a definir el nuevo intent #SacarDinero pero tan solo doy de alta 3 formas de que el usuario nos pueda indicar que quiere sacar dinero. Esto lo hago para comprobar más adelante, cómo podemos entrenar al bot una vez le hemos definido el intent.
Tras definir el nuevo # intent, generamos un nuevo nodo (en la pestaña Dialog) para definir qué queremos hacer cuando Watson identifique que el cliente quiere sacar dinero. He generado una respuesta de comprobación, para chequear que Watson está interpretando una de los casos con los que le hemos entrenado para este nuevo intent.
¿Qué pasa si le indicamos al bot una frase con la que aún no le hemos entrenado?
Imagina que en lugar de una frase relacionada con “sacar dinero” que era algo para lo que habíamos entrenado a Watson, le decimos “buscar cajero”. En este caso, como no hemos dado de alta “buscar cajero” como una alternativa de sugerir que el cliente tiene la intención de #SacarDinero, Watson no identifica cuál es la intención que tiene el cliente, de forma que le enruta por el nodo de “anything_else” para solicitarle que reformule lo que desea.
Utilizamos entidades (@entidades o @entities) para concretar la intención del usuario: ¿de qué cajero quieres sacar dinero?
Recordemos la definición funcional de la intención #SacarDinero (estaba en este otro artículo):
- Definíamos dos posibilidades, por un lado que le mostremos el cajero más cercano (independientemente de que le cobren o no comisiones) y por otro,
- el cajero más cercano libre de comisiones.
En este caso, cuando nuestro bot infiera que el usuario quiere sacar dinero, le tendremos que preguntar a qué cajero quiere que le llevemos, si al más cercano o a un cajero sin comisiones. Para ello, entra en juego la variable @entity, que nos ayudará y concretar la intención del usuario y así tenerla totalmente definida.
¿Y ahora qué? Configuramos entidades en Watson
En este caso, en la pestaña Entity creo una entidad que sea @TipoCajero que tiene dos posibles valores:
- CajeroMásCercano
- CajeroSinComisiones.
A cada valor, le alimentamos de las diferentes formas en las que el usuario nos puede indicar cada uno de ellos. Por ejemplo, al cajero sin comisiones le entrenamos para que lo identifique con sinónimos como “sacar gratis”, “cajero gratis”, “sacar sin comisiones”, “sin comisiones”, “libre de comisiones”, etc. Así quedaría nuestro caso:
Veamos las entidades en acción: Sacar dinero de un cajero libre de comisiones
Por último, tendremos que configurar el nodo “Encontrar Cajero” para que el bot:
- Nos pregunte por qué tipo de cajero estamos buscando (el más cercano o uno libre de comisiones) o,
- En el caso de que el cliente ya nos diga la intención sacar dinero acompañada del valor de la entidad @tipo cajero, que le demos la solución, sin necesidad de preguntarle nada más
Para ello, vuelvo al nodo “Encontrar Cajero” y utilizo una nueva feature de IBM Watson: los slots. El slot nos permite indicarle a Watson que, una vez reconocida la #intención, chequee si reconoce la @entidad que necesitemos.
- En nuestro caso, debe reconocer la entidad @TipoCajero para saber si el cliente ya en su mensaje nos está indicando a qué tipo de cajero quiere ir. Además, nos permite que si no encontramos la entidad que necesitemos, que le hagamos una pregunta al cliente. Es aquí donde configuramos la pregunta “Perfecto, ¿prefieres sacar dinero del cajero más cercano o uno libre de comisiones?
- Hay que pensar en Watson como una cascada (un “if” tras otro). Una vez que hemos pasado por el bloque del slot y hemos conseguido identificar tanto el #intent como la @entity pasaremos a responder al cliente.
- Si Watson identifica @TipoCajero como el “Cajero Más Cercano”, le contestaremos de una forma al cliente; sin embargo, si identifica el otro tipo de valor para la entidad tipo cajero, le responderemos de otra.
- En el recuadro tres de la imagen anterior, pongo el bot a prueba. Primero le preguntamos por un cajero. Como el bot no es capaz de reconocer la entidad Tipo de Cajero, nos hace la pregunta que le hemos configurado, para sacarnos dicha información. Una vez que le respondemos, identifica la entidad, y nos responde según hemos configurado la respuesta para dicha entidad.
Por último (y aunque no haya dado de alta todas las intenciones, nodos… inicialmente planteados), termino el tutorial diciéndole al bot “¡Hola! Busco un cajero sin comisiones” para validar que me identifique tanto la intención #SacarDinero como la entidad @TipoCajero:CajeroSinComisiones y como resultado me responde como he definido:
¿Y hay otras cosas que deberíamos tener en cuenta?
¡Sí, importante!
- IBM Watson es una herramienta potentísima con la que podremos definir una conversación completa. Sin embargo, por lo general, lo utilizaremos para identificar intenciones/entidades vía diálogo, y una vez identificados, para ejecutar una acción, necesitaremos hacer llamadas a otros sistemas. Esta capa, es la capa de lógica del bot, donde definimos qué hacer, qué texto mostrar, si enseñar botones, o si pasamos el diálogo al sistema de IA… El ejemplo de Banquito es muy claro, para darle respuesta al cliente -una vez que sabemos que quiere ir a un cajero cercano donde no le cobre comisiones-, tendremos que recoger la ubicación del cliente, y proporcionarle la respuesta que espera. Para ello, haremos una consulta vía API a otro repositorio que tengamos en el que indicándole ubicación y el parámetro tipo de cajero, que nos devuelva una dirección que será la que le mostraremos al cliente.
- Mencionaba al principio que desplegaremos el chatbot en varios canales (web, WhatsApp, Facebook Messenger), es por ello que en la lógica del bot, tendremos que tener en cuenta que en cada canal contaremos con unos elementos visuales u otros. Así que es algo igualmente a tener en la fase de diseño.
Si te ha gustado, no olvides dejar ❤️ para que todos tus seguidores puedan leerlo. 💬😍
¡Ah, y que el chocolate te acompañe!🍫🤖
Senior Chatbot Developer en Chatbot Chocolate