Tres buenos amigos: Bot Framework SDK v4, LUIS y Xamarin (Parte 1)
Esta publicación es parte del Mes Xamarin, una iniciativa liderada por Luis Matos. Revisa ésta y muchas más publicaciones interesantes relacionadas con Xamarin publicadas por y para miembros de la comunidad. ¿Quieres ser parte de esta iniciativa apoyando con una publicación en tu blog? ¡Aún hay lugares disponibles! Da clic en el enlace anterior para más información al respecto.
Hace unos meses escribí en este blog una entrada donde creamos un bot conversacional con Bot Framework que era capaz de identificar la intención del usuario, reconocer patrones e información útil en base a los mensajes suministrados gracias al servicio de LUIS. Dicho bot fue publicado en Messenger y también consumido por una aplicación móvil desarrollada con Xamarin. Generar esta solución es fácil pero lleva su tiempo, de hecho fue necesaria una segunda parte para lograrlo. Todo estuvo muy bien pero como sabemos, la tecnología cambia, evoluciona y hay nuevas versiones que conllevan cambios y no necesariamente es retrocompatible.
Justo eso es lo que pasó con este par de entradas. El bot fue diseñado con la versión 3 del framework, y cuando Microsoft lanzó la versión 4 del SDK, varios usuarios me hicieron saber que la nueva versión del SDK cambió por completo la forma de diseñar el bot. Por ello, hoy comenzamos con una primer entrada (de tres) donde generaremos nuestro bot con la versión 4 del SDK de Bot Framework. ¿Listos? ¡Pues manos a la obra!
Recordemos primero que nada las tecnologías que vamos a usar:
- LUIS, para interpretar los mensajes del usuario (lenguaje natural) y traducirlo a instrucciones que el bot puede interpretar. LUIS construye un modelo de Inteligencia Artificial capaz de reconocer intenciones y entidades bajo un enfoque de aprendizaje supervisado: nosotros le proporcionamos ejemplos con los que el modelo pueda ser construido (entrenado) y posteriormente probado en aplicaciones reales.
- Bot Framework SDK v4, para desarrollar el bot.
- Bot Emulator, para hacer la prueba del bot
- Xamarin, para utilizar el bot (eso será en una publicación posterior)
Preparemos entonces, el camino para crear un bot:
Parte 1. Creación del proyecto en LUIS
Paso 1. Ingresa al sitio https://www.luis.ai/ y regístrate o inicia sesión en caso de que ya tengas una cuenta.
Paso 2. Da clic en Crear nueva app.
Paso 3. Ingresa el nombre y descripción de la app, además de seleccionar un idioma (para este caso, será en inglés)
Paso 4. Una vez creada la aplicación, en el Dashboard da clic en Entidades y haz clic en el botón Crear nueva entidad. Una entidad representa un elemento clave que deseas reconocer en los mensajes del usuario (por ejemplo, una ciudad, una fecha, el nombre de una persona, etc.)
Paso 5. El tipo de entidad a crear es Simple, con el nombre Location.
Paso 6. Crea otra nueva entidad. En esta ocasión elige el tipo Pattern.any y escribe el nombre Location_PatternAny. La diferencia entre entidad Simple y la de tipo Pattern es que la segunda permite introducir ejemplos mucho más específicos y exactos a manera de patrón.
Paso 7. Ahora da clic en el menú Intents. Elige crear un nuevo intent.
Paso 8. El nombre de este Intent es Get Weather Condition.
Paso 9. Introduce el texto what is the current weather en el apartado de ejemplos (utterances).
Paso 10. A continuación observa que este ejemplo es incorporado a la sección Utterances. Introduce un segundo ejemplo: get prague temperature in december.
Paso 11. Cuando el ejemplo haya sido integrado en los utterances, haz clic en prague (la capital de República Checa, por cierto ^^) y observa que aparece un menú contextual. Selecciona la entidad Location para indicar que en este Utterance el usuario puede especificar alguna ubicación (cualquiera, no necesariamebte Praga).
De esta manera, el utterance se expresa de manera general como get [Location] temperature in december, por ejemplo el usuario bien podría decir Get Rome temperature in December.
Paso 12. Cuando se genera un modelo de LUIS capaz de reconocer la intención del usuario, entre más ejemplos más preciso será. Esto es fundamental. Introduciremos los siguientes ejemplos para que el modelo sea más robusto:
Si das clic en el switch Tokens View podrás ver las ciudades (o texto) usado en cada enunciado.
Paso 13. Vamos ahora a agregar los ejemplos para la entidad de tipo Pattern.any creada hace unos instantes. Da clic en el menú Patterns
Paso 14. Selecciona la intención Get Weather Condition y comienza a escribir la cadena weather in {. Observa que al momento de detectar una llave, aparecen las entidades que tenemos registradas en nuestro modelo. Selecciona Location_PatternAny.
Da enter y observa cómo el patrón es agregado a la sección Pattern.
Paso 15. Repite el procedimiento para agregar un para de patterns adicionales:
Paso 16. Vamos a probar nuestro proyecto. Da clic en el botón Train del menú superior de Build para proceder al entrenamiento del modelo.
Paso 17. Si no hay errores, el entrenamiento culminará con éxito. Ahora da clic en el botón Test y escribe el mensaje what is the weather in monaco.
Paso 18. Al dar enter, observa que se identifica el mensaje con la intención Get Weather Condition y que además se ha identificado a la palabra monaco como pate de la entidad Location_PatternAny (lo cual es un tanto obvio porque usamos el mismo patrón del paso 14).
Paso 19. Realiza otros Test para verificar el correcto funcionamiento del modelo (en caso de error, introduce nuevos utterances en la intención y da clic en Train nuevamente para reconstruir el modelo).
Paso 20. Ahora da clic en Publish para que nuestro modelo pueda ser accesible desde una aplicación.
Paso 21. Selecciona el entorno de Producción y confirma la operación.
Paso 22. Vuelve a hacer la prueba del paso 17 y observa que ahora también puedes revisar el resultado (en formato json) de la llamada al servicio de LUIS, donde está presente un arreglo de intents (aparece cada intención registrada en el modelo con la puntuación -así se determina cuál es la más alta-) y otro arreglo de entities (de manera similar, aparece una puntuación para cada una para identificar la de mayor precisión). Esto será útil al momento de programar nuestro bot, pues solo hay que procesar la cadena y el formato.
Paso 23. Ya casi para terminar, ahora vamos a obtener las claves de aplicación y de suscripción, así como la región del endpoint, datos con los cuales que conectaremos el bot al servicio de LUIS. Primero, da clic en el menú Manage y selecciona Application Information. Copia el Application ID y pégalo en un bloc de notas.
Paso 24. Ahora da clic en Keys and Endpoints y copia el valor bajo Authoring Key, así como los valores de Region y Endpoint. Pégalos en el bloc de notas del paso anterior y guárdalos, pues los utilizaremos más adelante.
Paso 25. Por último, vamos a exportar en formato json nuestro proyecto creado en LUIS. Por ejemplo, esto permite compartir nuestros proyectos y que puedan ser utilizados por otros miembros de nuestro equipo, colaboradores o externos a quienes compartamos el archivo. También nos permite generar una clase a partir del proyecto de LUIS (esto lo explicaré en la segunda parte). Finalmente, también es útil si creamos una nueva cuenta y queremos importar el modelo (dado que en el archivo se incluyen las intenciones, los ejemplos y las entidades).
Entonces, da clic en My apps, selecciona el proyecto WeatherLuisAppV4 (o el que hayas creado), elige Export –> Export as JSON y listo, un archivo json será generado.
¡Listo! Hasta aquí vamos a dejar de momento esta entrada. En la próxima publicación, vamos a crear un bot utilizando Bot Framework v4 SDK; te explicaré cómo descargar la plantilla y el código necesario para interactuar con el modelo de LUIS que creamos. También conectaremos el bot con un servicio que devuelve información del clima, pues a fin de cuentas queremos que el bot sea funcional y nos proporcione información.
Por lo pronto, aquí va un pequeño teaser.
Y en una tercer entrada, publicaremos nuestro Bot para que sea accesible desde varios canales: Facebook Messenger por ejemplo, y una aplicación propia (desarrollada en Xamarin).
¡Espero que esta publicación haya sido de interés para tí!
Agradezco tu visita al blog. Si la publicación fue útil, no olvides compartirla en tus redes sociales.
¡Hasta la próxima!
Luis