Bot en Telegram con Watson Assistant y Node-red

Publicado por Danilo Toro en

Imagen representativa de un chatbot

Una de las cosas que más rápido he he aprendido en los meses que llevo como practicante en IBM es hacer bots. Especialmente asistentes virtuales utilizando Watson Assistant.

Uno de los bots que me ayudó a obtener los conocimientos básicos fue un bot para telegram que entregara el saldo de la tarjeta BIP!.

Prerequisitos

No se necesitan conocimientos previos.

Es buena idea tener conocimiento de Javascript pero no es estrictamente necesario. Comencemos!

Descarga Telegram

¿Obvio, no? Da igual si utilizas Telegram desde el móvil o desde el pc, lo importante es poder utilizar el chat, aunque si es importante que tengas un teléfono móvil ya que el proceso de activación requiere confirmación por SMS.

El Dios Bots

Ahora toca conocer al bot creador de los bots,  “BotFather”. Utiliza el buscador de Telegram y busca “BotFather”, cuando lo encuentres tienes que iniciar una conversación con él.

Telegram
Creador de bot, BotFather

Apenas comiences la conversación, te responderá con “I can help you create and manage Telegram bots. If you’re new to the Bot API, please see the manual.” y una serie de comandos muy útiles. Puedes profundizar más en la documentación si quieres, pero esta vez utilizaremos solo un comando.

Como es de esperar, debemos escribir o hacer click en “/newbot” y BotFather te pedirá dos cosas:

  • Nombre de nuestro bot, yo le pondré “Bop!”
  • Username, éste debe terminar en “bot” o “_bot”. Después de probar con miles de nombres ya ocupados, me quedé con botbop_bot.
/newbot
Ha nacido un nuevo Bot!

Una vez comprobado que esté todo ok, BotFather te enviará el token de tu bot que utilizaremos mas tarde.

Watson assistant

Watson Assistant es una de las tecnologías de conversación de Inteligencia Artificial líder en la industria que impulsa los chatbots.

Para comenzar a utilizar Watson necesitas crear una cuenta cloud en Bluemix. Una vez que te registras y confirmas tu cuenta por email, te mostrará algo parecido a esto, si ya has realizado algun proyecto te aparecerán tus apps.

dashboard_bluemix
Panel de control de IBM Cloud
crear_watson

Buscamos en el catálogo Watson Assistant, seleccionas el que dice Watson Assistant (anteriormente Watson Conversation) y le das a crear.

Despues de crear el servicio de Watson, entrarás en la página de servicio. Haz click en Iniciar herramienta y se abrirá una nueva página. No cierres la página de servicio, ya que el utilizaremos más tarde.

pagina _de_servicio
Página de servicio de IBM Watson
crear_skillpng.png

Ahora que iniciamos la herramienta de Watson, vamos a la pestaña de Skills y creamos una nuevo Workspace dando click en “create Skill”. Eliges el nombre que quieras, colocas español y le damos a “Create”.

Ya creado tu Skill, verás algo como esto. El espacio de trabajo de Watson Assistant

workspace_bot
Nuestro Workspace

De las cinco pestañas que verás, por ahora nos interesan tres.

  • Intents – Es nuestra intención comunicativa, la acción que el usuario quiere hacer
  • Entities- Es de que se está hablando
  • Dialog – El flujo de la conversación que experimentará el usuario.

Creando intents

El reconocimiento de los Intents hace uso de Machine Learning y Natural Languaje Processing. Esto quiere decir que podemos añadir unos pocos intents de ejemplo y Watson Assistant entendera las variaciones a ese ejemplo.

Para este tutorial crearemos 5 ejemplos por cada intents, pero para considerar como una buena definición de intent se requiere 20 ejemplos o más.

Las dos cosas básicas en una conversación son el saludo y la despedida, por lo cual crearemos 2 Intents con esos nombres.

Hacemos click en “Add Intent”. Le ponemos como nombre #Saludos, agregamos una descripción si te apetece y donde dice “Add user examples” agregamos nuestros ejemplos.

Intent_saludos

Repetimos lo mismo para el intent #Despedida, con ejemplos como “Adios”, “Hasta luego”, etc., En mi caso también cree un intent de #Consulta_saldo, con ejemplos como “cual es el saldo de”, “cuanto dinero me queda en”, etc. Puedes agregar todos los Intents que quieras, según como quieres que funcione tu bot.

Como ejemplo de intent puedes colocar una frase completa, “cuanto saldo tengo en la tarjeta bip”, o puedes hacerlo generico y colocar solamente “cuanto saldo tengo en la tarjeta”, y usar entities para especificar que tarjeta.

Intents_telegram
Intents

Creando Entities

Las entities representan una clase de objeto o un tipo de datos que es relevante para el objetivo del usuario. Cuando reconoce las entidades mencionadas en la información de entrada del usuario, el servicio Watson Assistant puede elegir las acciones específicas que debe llevar a cabo para cumplir una intención.

Crearemos una entity llamada “@tarjetas” y otra llamada “@bancos que contendrá todas las tarjetas y bancos que pueda consultar el usuario.

Hacemos click en “add entity”. En el campo de nombre colocamos “tarjetas” y como valores agregamos todas las tarjetas que queramos que reconozca. Repetimos lo mismo para bancos.

Watson también nos da la opción de agregar sinónimos para que pueda reconocer las diferentes formas que el usuario puede expresarse a una misma entity.

entities
Entities

Creando Dialogos.

Dialog es un término que usamos para describir como el Sistema responderá al usuario. Normalmente, usaremos el intent que el sistema detecta de lo que el usuario ingresa, para determinar que se responderá al usuario

Despues de crear los intents, vamos a la pestaña “Dialog”  y hacemos click en “Create”.

Los nodos Bienvenido y En otras cosas, vienen por defecto. El nodo “Bienvenido” es para cuando se abre el mensaje, o chat y el nodo “En otras cosas” para cuando no existe respuesta al texto enviado por el usuario.

Crearemos tres dialogos nuevos, uno para saludar, otro de despedida y uno que entregue el saldo de la bip!. Entonces hacemos click en los 3 puntos del nodo “Bienvenido” y hacemos click en “Add node below” para agregar un nuevo nodo debado de “Bienvenido”.

Al nuevo nodo le ponemos Saludos y donde dice If assistant recognizes” agregamos el intent #saludos. Notemos que es necesario empezar el intent con el simbolo “#”.

Como respuesta escribimos el saludo que queremos que nuestro bot diga, en mi caso será “Hola! ¿Cómo puedo ayudarte?”. Así cada vez que el usuario escriba algún saludo, nuestro bot sabrá como responder.

Repetimos lo mismo para el nodo de despedida. Cuando reconozca el intent #Despedida, respondemos “hasta luego!” o algo mas interesante y divertido.

Entregando saldos.

En esta ocación no ahondaré en la integración de la API con Watson y nodeRED, y dejaremos una respuesta genérica cada vez que se entregue el saldo. (Si quieres que tu bot se conecte a una API y realmente entregue el saldo de la BIP, puedes leer esta documentación).

multiple_rspuesta

Para entregar una respuesta diferente según lo que se pregunte, usaremos la opción de “multiples respuestas”. Primero creamos un nodo que se active cuando Watson reconozca el intent #Consultar_saldo. Luego hacemos click en “Customize”, activamos la opción “Multiple responses” y le damos click en “Apply”.

Ahora podemos responder de manera diferente, según se vayan cumpliendo nuevas condiciones.

En este caso, quiero que entregue una respuesta si el usuario solicita una consulta por su tarjeta bip y otra cuando no hable de la tarjeta bip. Como tenemos un entity con diferentes tarjetas, podemos diferenciar sobre que tarjeta habla el usuario.

Entonces si tarjetas es Bip (@Tarjetas:Bip), respondemos con el saldo y si tarjetas no es Bip (@tarjetas != ‘Bip’) entonces respondemos que no podemos obtener el saldo.

respuestas_multiples

Ahora tenemos listo nuestra conversación, sólo falta unirlo con Telegram.

Nota: Puedes probar la conversación haciendo click en el boton “try it” ubicado en la equina superior derecha del Assisntant”.

Uniendo Watson y Telegram con Node-Red

Ya tenemos tanto el Bot en telegram como nuestra conversación en Watson, pero, ¿Cómo logramos unir ambos?

Node-RED es una herramienta de programación para conectar dispositivos de hardware, API y servicios en línea de formas nuevas e interesantes. Facilita la conexión de flujos mediante nodos que se pueden implementar en su tiempo de ejecución con un solo clic.

Entramos nuevamente a bluemix.net, y en el catalogo buscamos node-red y le damos click al que dice “Node-RED Starter”.

catalogo-nodered
Node-red en catalogo

En la nueva vista le ponemos nombre a nuestra app, en mi caso será “noderedTelegram” y le damos a crear.

crear_nodered
Creando App en Node-Red

Nos aparecerá una vista con el instalador de Node-RED, y le damos “next” a todo. Nos pedirá crear un usuario y contraseña y seguimos dando “next”.

Una vez creada nuestra app, nos mostrará la página principal de nuestra app node-red. Cuando veas que dice “En ejecución”, haz click en “Visitar URL de app”.

applista
App en ejecución

Despues de ir al URL de tu app, sigue las interucciones. Necesitarás colocar tu Username y Password para acceder a la aplicación de Node-RED.

nodered
Interface Node-RED

Para conectarnos con Telegram, necesitamos instalar los nodos necesarios. Hacemos click en la “hamburguesa” de la esquina superior derecha y luego a “Manage palette”.

En la pestaña “Install” buscamos Telegram e instalamos el paquetenode-red-contrib-telegrambot”. Nota: si la instalación falla, intentar hasta que funcione.

manage_palette
Manage Palette

Los nodos que nos servirán para enviar y recibir mensajes de telegram, serán los nodos “telegram receiver” y “telegram sender”.

nodos-telegram.PNG

Hacemos doble click al nodo “telegram receiver” y luego hacemos click en el lápiz para configurar las credenciales.

Colocamos el nombre del bot y token que nos entregó BotFather al crear nuestro bot.

receiver_telegram

En el nodo “telegram sender”, en el cambo Bot, seleccionamos el nuestro bot.

sender

Ahora que tenemos lista la configuración de nuestro bot en Node-RED, probamos si la conexión fue correcta. Para esto unimos los dos nodos, damos click en Deploy y escribimos en nuestro bot. (Al estar unido directamente el nodo de recibir con el de enviar, el bot debe repetir todo lo que digamos).

Bot funcionando.PNG
ChatBot

Ahora que tenemos conectado node-RED con Telegram, es momento de integrar el servicio de Watson Assistant. Lo primero que tenemos que hacer es obtener los detalles de nuestra API.

Vamos a nuestro servicio de Watson Assistant y donde creamos nuestro workspace, buscamos la Skills creada. Damos click en los tres puntos de la esquina superior derecha y luego en “View API Details”.

skill

Debemos anotar los datos del Workspace ID, Username y Password.

credenciales_watson

En node-RED buscamos el nodo Assistant, damos doble click y completamos los campos con los datos del servicio de Watson.

nodo-assistant.PNG

Como Telegram envía y recibe información de manera diferente a como lo hace Watson Assistant, por lo tanto, necesitamos preparar el mensaje antes de enviarlo a cada uno de los servicios.

Utilizamos 2 nodos function. Este nodo nos permitirá escribir código Javascript, para preparar el mensaje con el formato Json correcto.

En nuestra primera funcion prepararemos el mensaje que recibimos desde Telegram para enviarlo al servicio de Watson, mientras que en la segunda función prepararemos el mensaje recibido desde Watson para enviarlo a Telegram.

Nota: Para saber como envían mensajes Telegram y Watson, puedes unir un nodo “debug” en la salida de los respectivos nodos.

function_node.PNG

La función “Telegram_to_Watson”, toma el ID del usario y su mensaje que vienen desde telegram y lo formatea al formato que necesita el Assistant.

La función “Watson_to_telegram”, toma el mensaje procesado por Watson y lo formatea de tal forma que Telegram pueda recibirlo.

Unimos los nodos, hacemos click en “Deploy” y ya podemos utilizar nuestro Bot.

Este post tiene una segunda parte!
Puedes aprender como manejar imágenes y opciones en Telegram.


19 comentarios

Abi · 24 julio, 2019 a las 9:40 AM

Hola Danilo!
he realizado un bot con opociones de respuesta pero en telegram no me las muestra, tienes alguna sugerencia? lo he intentado desde node-red pero no he logrado que funcione.

Saludos

    admin · 24 julio, 2019 a las 10:54 PM

    Necesito un poco más de información.
    El token que te entregó BotFather esta bien escrito?
    Tienes unidos los nodos?
    la función que va antes del nodo “sender” esta bien escrita?

    Revisa esas cosas y si no funciona envíame un mail con el código de tu nodered (en las tres rayas de la parte superior, coloca importar y colocas clipboard).

    Saludos.

Abi · 25 julio, 2019 a las 10:20 AM

Hola Danilo!
Te cuento un poco, he tomado este Flow (https://flows.nodered.org/flow/d8e99143e06720396aa2730d8015e4c0) de Node-RED solo cambie el token del Bot y el Workspace de mi asistente de Watson, si me responde algunas preguntas por telegram, pero en la configuración que tengo desde IBM Watson Assistant en mi dialogo tengo respuestas configuradas con opciones y probando desde IBM Watson si se muestran pero en mi bot de telegram no me da las opciones de respuesta para elegir. A donde te puedo enviar un correo?

    admin · 26 julio, 2019 a las 3:52 AM

    Comprendo tu problema. Lo que sucede es que las opciones de Watson salen de diferente manera. En el nodo “function” que usas al salir del nodo Assistant, tenemos que el mensaje está en “msg.payload.output.generic[0].text” pero si colocas un nodo debug a la salida del nodo Assistant verás que el mensaje llega de otra forma, ya que tiene un título, un label y un valor.

    Mándame un correo a [email protected] para poder ayudarte con el json que debes usar.

Abi · 26 julio, 2019 a las 10:43 AM

Gracias Danilo!! ya te envié correo..

Alejandro · 30 julio, 2019 a las 3:50 PM

Hola danilo podrias publicar una captura para ver como estan conectados los nodos? Desde ya gracias

    admin · 30 julio, 2019 a las 5:49 PM

    Hola Alejandro,

    Edité la entrada con un screenshot de los nodos conectados.

    Saludos!

      Alejandro · 30 julio, 2019 a las 6:05 PM

      Genial muchas gracias por tu ayuda! Un saludo desde argentina

Alejandro · 30 julio, 2019 a las 6:16 PM

Ya estuve probando y me funciona, solo que cuando le pongo el saludo de despedida como por ejemplo “chau” en node-red me da error de “polling error” es con el unico mensaje que falla. A que se deberá?

    admin · 2 agosto, 2019 a las 10:54 PM

    No he encontrado el motivo por el cual pasa eso.
    Lo que hago es eliminar la configuración del nodo de telegram y colocar el token de nuevo. A veces pasa eso cuando tienes dos nodos diferentes que reciben información de telegram.

      Alejandro · 5 agosto, 2019 a las 7:22 PM

      Perfecto muchas gracias por tu atencion!

juan pablo · 28 agosto, 2019 a las 2:33 PM

hola Danilo!

te mando este mensaje porque tengo un problema al agregar las credenciales al nodo assistant de ibm. Las que tengo disponible no son usuario y contraseña, si no que tengo una apikey, y no se como proceder en ese caso, ya que solamente poniendo la apikey me da que error de acceso, no se si me estara faltando algo mas para poner.

    admin · 28 agosto, 2019 a las 5:43 PM

    Hola Juan,

    El nodo de Assistant en Nodered tiene la opción de colocar ApiKey.
    Solo debes dejar en blanco las casillas de Username y Password y completar la casilla de API Key

Manuel · 17 octubre, 2019 a las 10:22 AM

¿Como puedo hacer para ver una imagen cargada en Watson Assistant en telegram?

Camilo · 17 septiembre, 2020 a las 4:58 AM

Hola Manuel, primero agradecerte por el tuto, es EXCELENTE.

Quisiera pedirte ayuda con un tema, resulta que ya pude realizar la conexion de telegram con Watson, ahora estoy con un problema y es que no me aparece los mensajes de bienvenida del bot, y alguna otra respuesta configurada, tu sabes que podria suceder ahi?

    Danilo Toro · 24 septiembre, 2020 a las 1:40 PM

    Hola Camilo, mil disculpas, no vi el mensajes.

    Mandame un correo a [email protected] para poder ayudarte 😉

Camilo · 17 septiembre, 2020 a las 5:00 AM

Disculpa es Danilo, pido mil excusas, lo siento 🙁

    Danilo Toro · 24 septiembre, 2020 a las 1:42 PM

    :O No entendí que paso, pero te respondí el primer comentario 😀

    Si tienes alguna duda, me mandas el mail 😉

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *