De cero a héroe "Acciones en Google": inicio

imagen

Google hackathon, y todo lo que necesitas para comenzar a desarrollar tus aplicaciones para un asistente.


Google ha organizado un hackathon dedicado a la tecnología Actions On Google. Esta es una buena oportunidad para ganar experiencia y pensar en cómo comenzar a crear una interfaz de usuario de conversación (CUI) para nuestras aplicaciones. Por lo tanto, reunimos un equipo de dos desarrolladores de Android: shipa_o , raenardev y diseñador camarada invitado, y fuimos a participar.


¿Qué son las acciones en Google?


Actions On Google (AoG) es una forma de agregar su acción al asistente.
Puedes hacer esto usando 4 herramientas:



En el hackathon, creamos una habilidad: una aplicación que amplía las capacidades de un asistente, por lo que nos detendremos allí.


Después de la apelación, "Ok Google. Quiero hablar con ${_} ", el asistente abre la habilidad con la que el usuario lleva a cabo un diálogo:


imagen

¿Cómo escribir una habilidad?


Necesitarás dos habilidades:
- comprensión de la interfaz de usuario conversacional (CUI), la capacidad de diseñarlos;
- Capacidad para trabajar con procesamiento de lenguaje natural (PNL), por ejemplo, Dialogflow.


Etapa 1: diseño


Para que tu habilidad tenga un interlocutor de proteínas, es mejor pensar en el futuro ahora. La demanda será la que tenga en cuenta el contexto de uso. Las interfaces de diálogo se utilizarán cuando sea posible hablar en voz alta e interactuar con dispositivos con voz de manera más conveniente y rápida que con las manos, los ojos y otras partes del cuerpo.


La interfaz de voz es serial. Si es posible mostrar la forma completa de hacer un pedido en un gráfico, y la persona misma elegirá qué mirar primero y luego qué, entonces solo puede hacer preguntas una tras otra en voz alta. Para encontrar una aplicación popular y conveniente, encuentre la intersección entre las necesidades del usuario y la capacidad de usar la interfaz de voz (o la incapacidad de usar otras).


Lo primero que viene a la mente es un asistente de voz para ciegos, que ayuda a resolver problemas cotidianos. Por ejemplo, haga un pedido en una tienda, llame a un taxi, llame a familiares. El segundo es un libro de recetas parlante para amas de casa con las manos en harina. Tercero, juegos en los que necesitas explicar algo.


Decidimos comenzar con uno simple y desarrollamos un robot que aconseja a las personas sobre buenas películas. Vencimos la imperfección de los sintetizadores de voz: nuestro asistente ni siquiera finge ser un hombre y enfatiza su vívida personalidad electrónica en todos los sentidos.


Google ha escrito excelentes pautas sobre cómo desarrollar interfaces interactivas. Y hablaremos sobre cómo diseñamos nuestra conversación primogénita.


1. Invocación


Primero, debes llamar a un asistente. La llamada puede ser explícita (invocación explícita) e indirecta (invocación implícita). Las personas usarán un tratamiento explícito cuando ya conozcan la aplicación. Indirectamente, el Asistente de Google puede recomendar una aplicación adecuada en una situación específica. Las opciones elegidas correctamente para el atractivo indirecto, como las palabras clave correctas en la publicidad contextual, son solo más "humanas".


Tipo de apelación

Descripción


Ejemplo
Invocación explícitaCon el nombre del asistente


Ok Google, quiero hablar con Red Passionate Movie Robot.
Llámame un robot de cine.
¿Dónde está el rojo y el apasionado allí?



Invocación implícita

En el contexto de cuando necesitas un asistente

Ok Google, me aconsejas alguna película.
Quiero ver una comedia divertida.
¿Qué tipo de película ver con una chica?

Es importante que las llamadas indirectas no sean demasiado generales. Al igual que las palabras clave generales en la publicidad contextual, solo le impiden encontrar la aplicación correcta y reducen la calificación de la aplicación en la emisión del Asistente.


Las llamadas pueden contener un enlace profundo a las funciones individuales del asistente de voz. Por ejemplo, generalmente nuestro robot de película comienza a comunicarse con el hecho de que le ofrece a una persona que elija un género. Pero si se le llama en un llamado indirecto, "Quiero ver una comedia divertida", es lógico comenzar un diálogo con la oferta de una buena película garantizada del género mencionado.


2. Primer saludo


El primer saludo es lo que la aplicación le dice a la persona inmediatamente después de la llamada.
Primero debe informar al usuario que el asistente ya está aquí:


Hola, una forma de vida proteica. Soy un robot de cine apasionado rojo. El propósito de mi existencia es aconsejar películas biológicas sobre buenas películas.

Y luego, sugiera qué hacer a continuación. Nuestro robot está buscando películas por género, por lo que sugerimos con qué solicitud una persona puede ir más allá:
¿Qué quieres ver: tal vez comedia, acción u horror?


Los usuarios nuevos y experimentados pueden ser recibidos de muchas maneras. Si una persona está hablando con su asistente por primera vez, puede hablar un poco sobre usted. Si no es el primero, un saludo largo lo molestará. Por lo tanto, puede ponerse manos a la obra de inmediato:


Primera vez

Repetidamente


Hola, una forma de vida proteica. Soy un robot de cine apasionado rojo. El propósito de mi existencia es aconsejar películas biológicas sobre buenas películas. ¿Qué quieres ver: tal vez comedia, acción u horror?
Saludos, hombre! ¿En qué género estás interesado?

3. conversación humana


Enseñe a su asistente a comprender el habla natural y a mantener la conversación. La forma más fácil de hacerlo es comunicarse con personas del público objetivo incluso antes de que comience el desarrollo. Además, es deseable verbalmente, y no por escrito, porque el discurso coloquial escrito es más escaso que el oral. Juegue el papel del robot y pídale al interlocutor que imagine que está usando su futura aplicación. Grabe todos los cuadros de diálogo en la grabadora y luego descifre. Esto lo ayudará a diseñar un diagrama de conversación típico y a encontrar dónde pueden aparecer ramas.


Etapa 2: desarrollo


Hay varias formas de desarrollar su acción para un asistente:


  • Con Dialogflow.
  • Con acciones en el SDK de Google.
  • El texto se puede procesar de forma independiente, por ejemplo, si tiene su propia solución para procesar lenguaje natural (PNL - Procesamiento de lenguaje natural).

La siguiente es la interacción de un asistente con su habilidad.
El diálogo se ve así:


  1. El asistente traduce el discurso en texto y lo envía a su acción.


  2. El texto se procesa de una de las formas anteriores. En este diagrama, a través de Dialogflow.


  3. Dialogflow define la intención (la intención específica del usuario) y recibe
    de ella entidades (parámetros).


  4. (Opcional) Dialogflow puede llamar al webhook correspondiente, procesar los datos en el servidor y obtener una respuesta.


  5. Dialogflow forma la respuesta.


  6. El asistente expresa la respuesta, enciende el micrófono y escucha lo que dirá el usuario.



imagen

Diagrama de acción auxiliar


Dialogflow


No detallaremos los conceptos básicos de Dialogflow: Google lanzó buenos videos tutoriales.


  1. Intenciones : sobre el reconocimiento de la intención, cómo exactamente Dialogflow comprende lo que el usuario pregunta o qué acción quiere realizar.
  2. Entidades : sobre el reconocimiento de parámetros dentro de una frase. Por ejemplo, en el caso de recomendar películas, este es un género específico.
  3. Control de diálogo : sobre el mecanismo de contexto (sobre esto a continuación) y el cumplimiento: sobre cómo procesar la solicitud del usuario mismo accediendo a su backend y cómo devolver algo más interesante que una respuesta de texto.

Suponemos que ya ha visto el video y descubrió la consola Dialogflow. Echemos un vistazo a los problemas que surgieron en cada una de las partes en el proceso de implementación, y lo que es interesante se puede notar.


Recuerde también las reglas para construir un buen diálogo cuando pase a la implementación; esto afectará el conjunto de intentos, el conjunto de entidades y su uso en las respuestas, el uso de contextos y todo lo demás.


Intenciones


Hay recomendaciones : hacer un saludo más detallado para el nuevo usuario y para el resto hacerlo más conciso. ¿Cómo implementar esto?


En la consola de Dialogflow, esta lógica no se puede determinar. Esto se puede hacer dentro del cumplimiento por intención de bienvenida. En otras palabras, deberá hacer esto con sus manos.


Esto también se aplica al manejo de errores. Por ejemplo, por primera vez, simplemente puede volver a preguntar, y la segunda vez puede decir qué tipo de respuesta espera del usuario.


No lo hará a través de las respuestas: se seleccionará una respuesta aleatoria. Puede hacerlo a través del cumplimiento o un poco más complicado al vincularlo al contexto (más sobre eso a continuación).


Entidades


"Permitir expansión automatizada" y sys.


Si la frase tiene una estructura similar, entonces cuando "Permitir expansión automática" está activado como una entidad reconocida, algo puede entrar en eso que aún no puede procesarse con ganancias.


Por ejemplo, su aplicación reconoce la frase "Sugerirme algo de <genre>" para consejos sobre películas. Si dice "Avíseme algo de la comida", entonces como parámetro "género" no obtendrá lo que esperaría. Esto tiene sentido si el conjunto de géneros se actualiza constantemente dinámicamente en el back-end, y la respuesta del usuario se procesa allí, pero no tiene tiempo para actualizar la entidad.


Otra solución es usar sys. Cualquiera. En este caso, transmitirá todo lo que estaba después del diseño esperado, que puede ser la propuesta completa. Esto brinda más oportunidades que la expansión automatizada, pero también hay más desventajas.


Singular y plural, casos, género


Vamos a encontrar un ejemplo simple. Hablaremos sobre sus frutas favoritas, y la aplicación responderá cuán geniales son. En los ejemplos a continuación, P es el usuario, A es nuestra acción.


P: Las piñas son las más sabrosas.
A: Sí, ¡las piñas son la fruta más fresca!

En este ejemplo, tenemos entidad: Piñas
Pero, ¿qué pasa si el usuario dice "Piña"? Podemos agregar un sinónimo.


P: Me gustó la piña.
A: Sí, ¡las piñas son la fruta más fresca!

El valor predeterminado es el formulario de referencia, es decir es la forma original, no sus sinónimos. Es por eso que la aplicación no dice "¡Sí, la piña es la fruta más fresca!"


También vale la pena considerarlo al escribir respuestas. Si tuviéramos la respuesta "¡Sí, $ fruit es la más genial!", Entonces obtendríamos lo siguiente:


P: Me gustó la piña.
A: Sí, ¡las piñas son las mejores!

Y no te olvides de los casos:


P: quiero drama
A: Aquí hay un drama genial ...

Por lo tanto, debe escribir tanto los valores iniciales de la entidad como las respuestas de forma coherente. Por ejemplo, podemos hacer todas las formas de entidad originales para frutas en plural y sinónimos en cualquiera.


Haremos géneros en ruso en el caso nominativo, pero en cualquier número (drama, horrores).


Cuando lleguemos a las respuestas, no escribiremos "Sí, ¡$ fruit es la fruta más fresca!" y "Sí, ¡$ fruit es la mejor!" - las frutas siempre están en plural.


En el caso de la lengua rusa, vale la pena ir aún más lejos y pensar en cómo escribir una respuesta acordada: no solo tenemos casos (drama / drama), sino también género (drama / western).


P: quiero un western
A: Aquí hay un western genial ...

P: quiero un western
A: occidental? Ok, aquí hay una película genial ...

Pero, ¿cómo devolver exactamente el formulario de entidad que dijo el usuario?


En el caso de los géneros, el sinónimo de "ciencia ficción" podría ser "extraterrestres". Luego, si el usuario dijera "extraterrestres", la "ciencia ficción" volvería como parámetro.
Si queremos obtener la entidad en la forma en que dijo el usuario, entonces vale la pena elegir el valor de $ entity.original


imagen

Pero entonces puede haber problemas con la inconsistencia del número y (especialmente) la inconsistencia de los casos. ¿Es realmente necesario? Si es así, cree una entidad para singular, plural y case. Las respuestas también deben ser consistentes con el formulario de entidad que utilizan.


Contextos


Quizás con esto la mayoría de los problemas.


Contexto de entrada


Este es el contexto al que está vinculada una intención particular. Varios intentos pueden responder a la misma frase, y el que tiene el contexto de entrada activo probablemente funcionará.
Por lo tanto, por ejemplo, puede adjuntar una respuesta de sí / no a una pregunta específica, que se realiza utilizando la intención de seguimiento en Dialogflow


Contexto de salida


Este es el contexto que se activa cuando se activa la intención. Así es como se activan los contextos en la consola de Dialogflow (esto también se puede hacer en cumplimiento). Indicamos el número de vueltas del diálogo durante el cual estará activo, y después de reiniciar el contador o después de 20 minutos se desactiva. Esto significa que los datos dentro de este contexto ya no estarán disponibles y los intentos para los que se ingresan no funcionarán.


Otro truco está relacionado con lo mismo: puede activar un contexto con un intento y desactivarlo manualmente con otro, simplemente poniéndolo como contexto de salida para el segundo intento con el número de respuestas 0.


Si no desea escribir código en cumplimiento, de esta manera puede implementar una lógica interesante, por ejemplo, utilizando el contexto como contador, implementar el manejo de errores cuando el asistente no comprende al usuario.


Consejos de Dialogflow


  • No es necesario reiniciar la página con la vista previa del asistente: cuando haya realizado cambios en el agente de diálogo de flujo, puede esperar hasta que se complete su capacitación e inmediatamente repetir la frase no reconocida en el simulador. Dialogflow puede considerarse como un backend al que se refiere un asistente.


  • Use agentes preconstruidos: allí puede ver cómo implementar un escenario típico.


  • Tenga cuidado con la sección Pequeña charla. Su uso no apaga el micrófono al final de la conversación, y tales respuestas generalmente no contienen un llamado a la acción. No dirige al usuario a la siguiente ronda de diálogo, y no le queda del todo claro qué se debe decir más adelante. Con una alta probabilidad, debido a esto, no puede pasar la revisión. Es mejor hacer intentos separados para esto si puede ingresarlos en el diálogo.


  • No edite la misma intención juntos al mismo tiempo. Ahora no se admite el trabajo simultáneo de varias personas; no se sabe qué cambios se sobrescribirán.


  • Si es necesario paralelizar el trabajo con la intención, puede llevarse a cabo en proyectos separados, y luego simplemente seleccionar los necesarios y transferirlos. También importe y exporte entidades en json / xml e importe / exporte por intención.


  • Inmediatamente vale la pena considerar que escribes acciones para un idioma en particular. Escribir respuestas en ruso tiene matices adicionales. Por lo tanto, localizar la acción parece ser más desafiante que con la GUI de la aplicación móvil.


  • Considere las reglas de diseño de las interfaces de voz: afectan no solo al conjunto de réplicas, sino también a la estructura en su conjunto. Está creando un diálogo, por lo que cada respuesta debe dejar un llamado a la acción para que el usuario entienda qué decir.


  • Una vez que todo esté listo y comience a probar, no tenga miedo de abandonar las ramas individuales del diálogo o los formularios de preguntas. Quizás en la etapa de prueba comprenderá cómo conectar las intenciones y lo que falta para facilitar su uso.



Conexión al servidor


Para conectar el servidor necesita usar el cumplimiento. Hay dos opciones para esto:


  • Cliente webhook . Muchos idiomas soportados.
  • Editor en línea sobre funciones en la nube para Firebase (node.js).

Consideremos el más simple: el editor en línea.


No pretendemos ser un experto en node.js; corregir errores en los comentarios es bienvenido.


Es importante prestar atención a la versión de la API de Dialogflow.
Última versión v2. Todo lo escrito para la versión v1 no funciona con él.
Lea más sobre la migración aquí .


Enlaces utiles:



Analiza la plantilla estándar


Cuando abre la sección Cumplimiento, el siguiente código se muestra en el archivo / pestaña `index.js`:
 'use strict'; const functions = require('firebase-functions'); const {WebhookClient} = require('dialogflow-fulfillment'); const {Card, Suggestion} = require('dialogflow-fulfillment'); process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { const agent = new WebhookClient({ request, response }); console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers)); console.log('Dialogflow Request body: ' + JSON.stringify(request.body)); function welcome(agent) { agent.add(`Welcome to my agent!`); } function fallback(agent) { agent.add(`I didn't understand`); agent.add(`I'm sorry, can you try again?`); } // // Uncomment and edit to make your own intent handler // // uncomment `intentMap.set('your intent name here', yourFunctionHandler);` // // below to get this function to be run when a Dialogflow intent is matched // function yourFunctionHandler(agent) { // agent.add(`This message is from Dialogflow's Cloud Functions for Firebase editor!`); // agent.add(new Card({ // title: `Title: this is a card title`, // imageUrl: 'https://developers.google.com/actions/images/badges/XPM_BADGING_GoogleAssistant_VER.png', // text: `This is the body text of a card. You can even use line\n breaks and emoji! `, // buttonText: 'This is a button', // buttonUrl: 'https://assistant.google.com/' // }) // ); // agent.add(new Suggestion(`Quick Reply`)); // agent.add(new Suggestion(`Suggestion`)); // agent.setContext({ name: 'weather', lifespan: 2, parameters: { city: 'Rome' }}); // } // // Uncomment and edit to make your own Google Assistant intent handler // // uncomment `intentMap.set('your intent name here', googleAssistantHandler);` // // below to get this function to be run when a Dialogflow intent is matched // function googleAssistantHandler(agent) { // let conv = agent.conv(); // Get Actions on Google library conv instance // conv.ask('Hello from the Actions on Google client library!') // Use Actions on Google library // agent.add(conv); // Add Actions on Google library responses to your agent's response // } // // See https://github.com/dialogflow/dialogflow-fulfillment-nodejs/tree/master/samples/actions-on-google // // for a complete Dialogflow fulfillment library Actions on Google client library v2 integration sample // Run the proper function handler based on the matched Dialogflow intent name let intentMap = new Map(); intentMap.set('Default Welcome Intent', welcome); intentMap.set('Default Fallback Intent', fallback); // intentMap.set('your intent name here', yourFunctionHandler); // intentMap.set('your intent name here', googleAssistantHandler); agent.handleRequest(intentMap); }); 

Y tales dependencias en el archivo / tab `package.json`:
 { "name": "dialogflowFirebaseFulfillment", "description": "This is the default fulfillment for a Dialogflow agents using Cloud Functions for Firebase", "version": "0.0.1", "private": true, "license": "Apache Version 2.0", "author": "Google Inc.", "engines": { "node": "~6.0" }, "scripts": { "start": "firebase serve --only functions:dialogflowFirebaseFulfillment", "deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment" }, "dependencies": { "actions-on-google": "2.0.0-alpha.4", "firebase-admin": "^4.2.1", "firebase-functions": "^0.5.7", "dialogflow": "^0.1.0", "dialogflow-fulfillment": "0.3.0-beta.3" } } 

En primer lugar, actualice las dependencias alfa y beta a las últimas estables.


Aquí están las últimas versiones en este momento.
 { "dependencies": { "actions-on-google": "^2.2.0", "firebase-admin": "^5.2.1", "firebase-functions": "^0.6.2", "dialogflow": "^0.6.0", "dialogflow-fulfillment": "^0.5.0" } } 

Y ahora echemos un vistazo más de cerca al código.


Lo anterior se hace importando dependencias
 // Cloud Functions  Firebase library const functions = require('firebase-functions'); //       const {WebhookClient} = require('dialogflow-fulfillment'); //       const {Card, Suggestion} = require('dialogflow-fulfillment'); 

Todo el punto de cumplimiento es anular la devolución de llamada: un `dialogflowFirebaseFulfillment`
 exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers)); console.log('Dialogflow Request body: ' + JSON.stringify(request.body)); //   . const agent = new WebhookClient({ request, response }); //   let result = request.body.queryResult; //  action  entities https://dialogflow.com/docs/actions-and-parameters let action = result.action; let parameters = result.parameters; //    https://dialogflow.com/docs/contexts let outputContexts = result.outputContexts; //       let intentRequest = request.body.originalDetectIntentRequest; }); 

Se llamará a esta devolución de llamada para aquellas intenciones para las cuales active fullfilment.


Ahora redefine la respuesta a la intención
 exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { const agent = new WebhookClient({ request, response }); function welcome(agent) { //   agent.add(`Welcome to my agent!`); } function fallback(agent) { agent.add(`I didn't understand`); agent.add(`I'm sorry, can you try again?`); } //   ,  : // key -   intent-. // value -   ,   . let intentMap = new Map(); intentMap.set('Default Welcome Intent', welcome); intentMap.set('Default Fallback Intent', fallback); agent.handleRequest(intentMap); }); 

Al mismo tiempo, el código reemplaza completamente la intención de respuesta de la sección Respuestas.
Las respuestas se llamarán solo si la devolución de llamada falla, por lo que puede hacer un manejo de errores allí.


Eliminamos las funciones de procesamiento de intención de la devolución de llamada.
Las funciones de bienvenida y respaldo están en el cierre .


Para eliminarlos de la devolución de llamada, deberá agregar la transferencia del contexto de la función y los parámetros a través de `bind`
 exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { const agent = new WebhookClient({ request, response }); let intentMap = new Map(); //  set  Map.      intentMap .set('Default Welcome Intent', welcome.bind(this, agent)) .set('Default Fallback Intent', fallback.bind(this, agent)); agent.handleRequest(intentMap); }); function welcome(agent) { agent.add(`Welcome to my agent!`); } function fallback(agent) { //   2   add    agent.add([ `I didn't understand`, `I'm sorry, can you try again?` ]); } 

, , Google Assistant. , .

Source: https://habr.com/ru/post/es419773/


All Articles