Un chatbot puede ser una forma novedosa de interactuar con los usuarios. Después de escribir un post introduciendo los fundamentos de sin servidory también escribir un post sobre la escritura Funciones Azuredecidí que intentaría construir algo un poco más práctico que un "hola, mundo".
Utilizar una arquitectura sin servidor para un chatbot tiene sentido. El uso del chatbot puede ser esporádico. El uso puede aumentar y disminuir en distintos momentos del día. Al utilizar una arquitectura sin servidor, solo pagarás por los recursos y el tiempo que necesites.
Si quieres seguirnos, todo el código fuente de esta entrada del blog es disponible en Github.
Chatbot de Viber
Podría haber elegido muchas plataformas diferentes para crear un chatbot: Facebook Messenger, Skype, WhatsApp y muchas más. Pero me decidí por Viber.
En Estados Unidos, Viber no parece tener muchos seguidores, pero yo lo uso mucho. Es una forma muy práctica de chatear con mi mujer, enviar fotos, GIF divertidos, etcétera. Me parece más fiable y rápido que los SMS, sobre todo para las fotos. Ojalá toda mi familia lo usara. También es un buen efecto secundario que Viber es cliente de Couchbase. Cambiaron de MongoDb para dar soporte a sus crecientes necesidades de datos.
También, API REST de Viber es sencillo y está bien documentado. Entre el uso de la arquitectura sin servidor y la API de Viber, no podía creer lo rápido que pasé de 0 a chatbot.
Configurar
En primer lugar, tendrá que empezar por Crear un bot en Viber (en algún momento necesitará una cuenta de Viber). Viber le proporcionará una clave de API similar a la siguiente 30a6470a1c67d66f-4207550bd0f024fa-c4cacb89afc04094
. Lo utilizará en las cabeceras HTTP para autenticarse en la API de Viber.
A continuación, cree una nueva solución Azure Functions. Anteriormente he blogueado sobre Funciones Azure con un seguimiento en Inicialización perezosa.
Decidí usar C# para escribir mis Azure Functions. Desafortunadamente, no hay un SDK .NET para Viber (que yo sepa), así que tendré que usar la API REST directamente. No es un gran problema, acabo de utilizar RestSharp. Pero si prefiere NodeJS o PythonViber te ofrece SDK para esos idiomas.
Antes de empezar a codificar, tendrá que configurar un archivo Gancho web. Esto es simplemente una manera de decirle a Viber dónde enviar los mensajes entrantes. Sólo tendrá que hacer esto al principio. Yo lo hice desplegando primero una función Azure básica que devuelve un 200. Utilicé Postman para configurar el webhook inicial. Utilicé Postman para configurar el webhook inicial.
Por último, configuré un clúster de Couchbase en Azure. Empezar a utilizar Couchbase y Azure es fácil y gratuito. (Incluso puedes usar el botón "Test Drive" para obtener 3 horas de Couchbase Server sin gastar ningún crédito Azure). He creado un único usuario llamado "viberchatbot", un bucket llamado "ViberChatBot" y he cargado el bucket "travel-sample".
Función Azure
Para esta aplicación, quería crear un chatbot con un poco más de sustancia que "Hola, mundo" y también quería divertirme un poco. Aquí están los comandos que quiero que mi chatbot entienda:
-
Si le digo "hola" (o hello, etc.), responderá con un "¡Hola!".
-
Si le pido "métricas", me dirá cuántos mensajes ha procesado hasta ahora.
-
Si menciono "twitter", me hará una recomendación sobre a quién seguir.
-
Si pregunto por vuelos de CMH a ATL (u otros aeropuertos) me dirá cuántos vuelos hay hoy (utilizaré el botón cubo para muestras de viaje para estos datos).
-
Si digo "help", me dará una lista de los comandos anteriores.
He decidido no utilizar ninguna librería de procesamiento o análisis del lenguaje natural. Sólo voy a usar simples sentencias if/else y algunas coincidencias básicas de cadenas. Si usted está planeando crear un chatbot robusto con capacidades ricas, definitivamente recomiendo revisar bibliotecas y herramientas como LUIS, wit.ai, NLTK y otros.
Código Chatbot
Empecé creando unas cuantas clases C# para representar la estructura de los datos que Viber enviará a mi punto final sin servidor.
Clases de Viber
Esto no es ni mucho menos una representación exhaustiva de las capacidades de Viber, pero es suficiente para empezar a recibir mensajes de texto básicos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
público clase ViberEntrada { público cadena Evento { consiga; configure; } público largo Marca de tiempo { consiga; configure; } público ViberSender Remitente { consiga; configure; } público ViberMessage Mensaje { consiga; configure; } } público clase ViberSender { público cadena Id { consiga; configure; } público cadena Nombre { consiga; configure; } } público clase ViberMessage { público cadena Texto { consiga; configure; } público cadena Tipo { consiga; configure; } } |
A continuación, la función Azure convertirá la solicitud HTTP sin procesar en un archivo ViberEntrada
objeto.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[NombreFunción("Chatbot")] público estático async Tarea<HttpResponseMessage> Ejecutar( [HttpTrigger(Nivel de autorización.Anónimo, "get", "post", Ruta = null)]HttpRequestMessage consulte, TraceWriter registro) { var entrante = consulte.Contenido.ReadAsAsync<ViberEntrada>().Resultado; var viber = nuevo ViberProcesador(Cubo.Valor); viber.Proceso(entrante); // devuelve "OK" cada vez // esto es más importante para la configuración inicial del webhook de Viber devolver consulte.CrearRespuesta(HttpStatusCode.OK); } |
Después de esto, he creado un ViberProcesador
con una clase Proceso
que recibe este objeto.
1 2 3 4 5 6 7 8 |
público void Proceso(ViberEntrada entrante) { si (entrante?.Mensaje?.Tipo == "texto") { LogIncoming(entrante); ProcesarMensaje(entrante); } } |
Procesamiento de mensajes de Viber
LogIncoming
crea un registro (en Couchbase) para que yo sepa todo sobre cada solicitud que llega.
ProcesarMensaje
analizará el texto del mensaje y averiguará qué hacer en respuesta. Puede consultar el código completo en Githubpero he aquí un breve fragmento para que se haga una idea:
1 2 3 4 5 6 7 8 |
// si el mensaje contiene "hi", "hello", etc decir "howdy" si no si (HolaCadenas.Cualquier(entrante.Mensaje.Texto.ToLower().Contiene)) EnviarMensajeDeTexto("¡Hola!", entrante.Remitente.Id); // si el mensaje contiene "?" entonces enlace a los foros si no si (entrante.Mensaje.Texto.Contiene("?")) EnviarMensajeDeTexto("Si tiene alguna pregunta sobre Couchbase, ¡pregúntelo en los foros! http://forums.couchbase.com", entrante.Remitente.Id); si no EnviarMensajeDeTexto("Lo siento, no le entiendo. Escriba 'help' para obtener ayuda", entrante.Remitente.Id); |
Obtener métricas
Una de las cosas que escucha mi chatbot son las "métricas". Cuando le pides métricas, te dará un recuento de los mensajes entrantes que ha procesado. Dado que registro todas las solicitudes en Couchbase, la consulta de métricas se realiza fácilmente con una consulta N1QL.
1 2 3 4 5 6 7 8 9 10 11 |
privado cadena GetMetrics() { var n1ql = @"select value count(*) as totalIncoming de ViberChatBot b where meta(b).id like 'incoming::%';"; var consulta = Solicitud de consulta.Cree(n1ql); var respuesta = _bucket.Consulta<int>(consulta); si (respuesta.Éxito) devolver $"¡He recibido {response.Rows.First()} mensajes entrantes hasta ahora!"; devolver "Lo siento, tengo problemas para conseguir métricas ahora mismo".; } |
Devolver un mensaje
El chatbot necesita comunicarse con la persona que está hablando con él. Como he dicho antes, no hay Viber .NET SDK, así que tengo que crear una llamada REST "manualmente". Esto es bastante fácil con RestSharp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
privado void EnviarMensajeDeTexto(cadena mensaje, cadena senderId) { var cliente = nuevo RestClient("https://chatapi.viber.com/pa/send_message"); var solicitar = nuevo RestRequest(RestSharp.Método.POST); solicitar.AddJsonBody(nuevo { receptor = senderId, // receptor (Id. único de usuario de Viber, obligatorio) tipo = "texto", // type (Tipo de mensaje, obligatorio) Tipos de mensaje disponibles: texto, imagen, etc. texto = mensaje }); solicitar.AddHeader("X-Viber-Auth-Token", ViberKey); var respuesta = cliente.Ejecute(solicitar); // registro en Couchbase _bucket.Inserte("resp::" + Guía.NuevaGuid(), respuesta.Contenido); } |
Tenga en cuenta que también estoy registrando cada respuesta de Viber a Couchbase. Esto podría ser información muy útil para el análisis posterior y / o solución de problemas. Si Viber decide cambiar la estructura y el contenido de su respuesta, los datos en Couchbase se almacenan como datos JSON flexibles. No obtendrás errores sorpresa o datos faltantes en este punto de ingestión.
Resumen
Eso es todo lo básico. Consulta el código fuente para ver el conjunto completo de acciones/operaciones que puede realizar el chatbot. Para probar el bot, utilicé mi aplicación Viber para Android en mi teléfono (y en el de mi mujer, para asegurarme de que funcionaba cuando lo hiciera público).
Cuidado: para cuando leas esto, es probable que el chatbot que he creado esté fuera de línea. ¡Cualquier otra persona que cree un "Couchbase Bot" no soy yo!
Aquí tienes un resumen de las ventajas de este enfoque para crear un chatbot:
-
En enfoque sin servidor es una buena forma de controlar los costes de un chatbot. Ya sea Viber o alguna otra plataforma de mensajería, hay potencial para un uso esporádico y cíclico.
-
API REST de Viber utiliza JSON, lo que convierte a Couchbase en una herramienta natural para el seguimiento/almacenamiento/consulta.
-
La facilidad de escalado de Couchbase y sus asociaciones con Microsoft (y Amazon y Google) lo convierten en una gran opción para un backend de chatbot.
Fue muy divertido, y sin duda pude dejarme llevar jugando con este nuevo chatbot. Podía analizar imágenes, contar chistes, buscar todo tipo de información, vender productos y servicios, o cualquier otra operación útil.
Me encantaría saber qué estás haciendo con los chatbots. Deja un comentario o ponte en contacto conmigo en Twitter @mgroves.