Mi actual trabajo se basa en testear diferentes uniones tecnológicas, juntar piezas de software inusuales, evaluar la viabilidad tecnológica de ideas nuevas y pasármelo bien.

Esta vez me gustaría mostrar como validamos nuestras hipótesis y sacamos conclusiones para mirar hacia delante en nuestros proyectos.

A. Hipótesis inicial

Hoy, he decidido usar las Actions de Google para construir una app dentro de Google Assistant. Usando un servicio cognitivos de Microsoft AI llamado LUIS (Language Understanding) en el lugar donde Google ofrece Dialogflow, herramienta habitual en estos casos.

Las 2 ideas técnicas que me gustaría validar son:

1- ¿Es posible crear una Action de Google reemplazando Dialogflow por otro servicio NLP (Natural Language Processor)?

2- ¿Sería posible un servicio NLP común y portable entre plataformas de manera que proporcione estabilidad y homogeneidad a nuestras respuestas?

B. Objetivos — ¿Qué queremos aprender?

Me gustaría adquirir varios aprendizajes en este prototipo.

Primero, conseguir un conocimiento más profundo de las Actions de Google y ver sus límites. También explorar un servicio NLP alternativo para la app con las Actions de Google que queremos desarrollar.

Aunque lo más interesante será ajustar una tecnología como el servicio de NLP, LUIS, sobre un bot que no pertenece a su ecosistema natural.

C. Implementación — ¿Qué hemos hecho?

Voy a construir un pequeño prototipo para ayudarnos con nuestras hipótesis. No será algo perfecto o terminado pero el objectivo tampoco es ese, sino validar nuestras ideas iniciales.

Nota: Saltaré la creación y publicación de una Action de Google al no ser el propósito de este post. Para profundizar sobre esto recomiendo seguir el siguiente enlace https://developers.google.com/actions/sdk/

El lenguaje elegido es Javascript (Nodejs), donde Google libreró un módulo muy útil https://github.com/actions-on-google/actions-on-google-nodejs que va a sostener nuestra implementación.

Lo primero, he creado 2 grupos donde recogemos las peticiones o consultas que tienen un significado común o parecido, conocidos como intents. Uno es el responsable de arrancar la app y se llama action.intent.MAIN. Y el otro recogerá cualquier otra consulta general y se llama action.intent.TEXT.

{    "actions": [      {        "description": "Default Welcome Intent",        "name": "MAIN",        "fulfillment": {          "conversationName": "myWebhook"        },        "intent": {          "name": "actions.intent.MAIN"        }      },      {        "description": "text intent",        "name": "TEXT",        "fulfillment": {          "conversationName": "myWebhook"        },        "intent": {          "name": "actions.intent.TEXT"        }      }    ],    "conversations": {      "myWebhook": {        "name": "myWebhook",        "url": "<YOUR ACTION URL>"      }    },    "locale": "en"  }

Paralelamente he creado una app de LUIS, el servicio NLP de Microsoft AI, con 3 intents. El intent None, que es creado por defecto en LUIS, y recoge todas las peticiones que no entran en ninguno de los otros intents definidos en la app. Y otros 2 intents más llamados: name y help.

Luis app

Dentro de cada intent he añadido unas pocas frases, conocido como utterances. Para testear la app de LUIS es necesario entrenar la app con las frases añadidas. De esta forma se compone el modelo que va a regir nuestas consultas.

Una vez terminado de testear la app de LUIS para poder publicarla necesitamos crear un servicio cognitivo dentro de Azure. Al crear este servicio obtendremos una clave. Después habilitaremos la clave dentro de LUIS para que así nos proporcione una URL nueva para esta clave recien añadida. Ahora si, podremos publicar nuestra app de LUIS y usar esta URL para las peticiones dentro de la Action de Google.

help intent

name intent

Usando el ejemplo de la documentación https://developers.google.com/actions/sdk/fulfillment y añadiendo la petición a la URL del NLP LUIS, obtendremos el intent de la petición y podremos adaptar la respuesta de la Action de Google.

const {actionssdk} = require('actions-on-google');  const express = require('express');  const bodyParser = require('body-parser');  const rp = require('request-promise');    // get this url from publish section in luis.ai  const LUIS_URL = '<YOUR LUIS URL>';    const app = actionssdk({debug: true});    app.intent('actions.intent.MAIN', (conv) => {    conv.ask('Hi!');  });    app.intent('actions.intent.TEXT', (conv, input) => {    const url = `${LUIS_URL}${input}`;        return rp({      url,      json: true,    })    .then((res) => {      // create a function by intent detected by LUIS NLP      const actionMap = {        name: nameIntent,        help: helpIntent,      };      // check that LUIS response with a valid intent      if (res.topScoringIntent && res.topScoringIntent.intent && res.topScoringIntent.intent !== 'None') {                // Map intents to functions for different responses        actionMap[res['topScoringIntent']['intent']](conv);              } else {              conv.ask('Sorry, I don\'t understand what you mean. Please try to ask for help or about my name.');      }    })    .catch((e) => {      console.log('Error =>', e);    });  });    function nameIntent(conv) {    conv.ask('My name is Lola test and I like talking.');  }     function helpIntent(conv) {    conv.ask('I like when you can ask for my name.');  }    express().use(bodyParser.json(), app).listen(8888)

D. Conclusiones — ¿Qué hemos aprendido?

Dialogflow es un bot en si mismo que actua ante determinadas peticiones vinculadas a los intents definidos en su configuración. Ofreciendo respuestas propias para esa petición determinada. También podría detectar el intent y delegar la respuesta a otro webhook que ejecutase la respuesta llamado fulfilment. En definitiva Dialogflow funciona ante una petición con un texto determinado devolviendo otro texto.

Sin embargo LUIS de Microsoft se dedica a detectar el intent sobre un texto específico. Esto hace a LUIS de Microsoft AI potente y versatil. Es rápido, al no tener que preparar la respuestas, y se puede combinar con otros servicios.

Intenté combinar estas 2 tecnologías por el mero experimento, pero en realidad hay una razón más poderosa detrás. Imagina que tuviera que crear una skill de amazon, app de Cortana o app para Actions on Google. ¿No sería más sencillo usar el mismo reconocedor de intents siempre? De esta forma solo lo programaríamos nuestro NLP una única vez y estaría disponible para todas las plataformas. Sería homogeneo en sus interpretaciones. Además seríamos más rápidos implementando nuevas plataformas y modificándolo según nuestras necesidades.

Espero que te haya gustado.

Gracias por leerlo.

Por Pablo Gómez Guerrero

Lector, a veces escritor, todos estamos aprendiendo. Prototipos de IA y software en Telefónica.

Deja una respuesta

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