Apareciendo, Alice cautivó a los usuarios con síntesis de voz inesperadamente de alta calidad y chat bot. Hoy, se espera que tenga habilidades útiles y juegos interesantes con un backend que pueda tener en cuenta el contexto del usuario e implementar una amplia gama de escenarios. Este artículo analiza la creación de una habilidad basada en Google Sheets, una herramienta familiar para muchos con gran potencial para pequeños chatbots.
Jugar con una persona real puede ser más interesante que jugar con un personaje virtual, por lo que, como ejemplo, desarrollaremos un juego multijugador para Alice.
Uno! Diálogo
El juego comienza con las reglas. Se me ocurrió esto: cada uno de los dos jugadores coloca primero un tesoro y una trampa detrás de tres puertas, y luego abre cualquiera de las puertas del oponente. Abre el tesoro, toma las monedas del oponente, abre la trampa, dale las monedas. El número de monedas, de 1 a 3, lo determina el propio jugador. Detrás de la puerta restante hay una caja de Pandora, que se abre y puedes encontrar / perder una cantidad aleatoria de monedas. Puedes jugar tanto con Alice como contra otros usuarios.
La interfaz de Alice se resuelve en forma de diálogo, y toda la interacción del juego debe implementarse a través de mensajes. El procesamiento de cada mensaje por parte del servidor del juego se representa mediante los siguientes pasos:
- restaurar el contexto del usuario;
- interpretación de consultas en un contexto restaurado;
- formando un mensaje de respuesta;
- Guardar un contexto de usuario modificado.
Recuperar y guardar el contexto del usuario.
El contexto del usuario incluye su estado en el juego, incluidos los resultados anteriores, un paso dentro del guión y el oponente actual, así como el nombre de usuario y otra información necesaria para la lógica del juego.
En cada solicitud, de
acuerdo con el protocolo , Alice pasa la identificación de usuario. Esto es suficiente para guardar y posteriormente restaurar su contexto.
Como almacén de datos, tome Hojas de cálculo de Google. Las ventajas objetivas de esta solución incluyen el uso gratuito, la visibilidad y la facilidad de uso. El editor de scripts incorporado le permite describir la lógica del juego en Apps Script (basado en JavaScript), haciendo referencia a las tablas API, y publicarlo como una aplicación web.
Una vez creada la tabla con los encabezados necesarios, puede ir al editor de scripts:
La lógica del juego se puede describir en un proyecto en Apps Script, organizándolo como un conjunto de archivos gs, y proceder a la publicación:
Al publicar, debe especificar la disponibilidad de la aplicación para usuarios anónimos:
En la salida, obtendrá la URL de la aplicación web publicada. Las funciones doGet () y doPost () en el script procesarán las solicitudes de los tipos correspondientes para recibir y guardar contextos de usuario.
A continuación se muestra un diagrama de trabajo con las tablas API para la manipulación de datos:
Interpretar una solicitud en un contexto restaurado
En el caso general, la interpretación correcta de las consultas de texto requiere el uso de algoritmos NLU inteligentes. Y aunque tales algoritmos están disponibles en herramientas simples como la
que describí por Aimylogic , en este caso decidí abandonar el procesamiento del lenguaje natural en favor de la simplicidad.
En el juego propuesto, la interacción del jugador con Alice se limita a una docena de estados posibles y se puede reducir a un pequeño conjunto de intenciones. Para simplificar, siempre ofrezco al jugador tres acciones posibles: enviar "Uno", "Dos" o "Tres". Para cualquier otra solicitud, Alice pide aclarar la acción.
El escenario en este caso se reduce al siguiente código de Apps Script:
Para el usuario, la interacción así resuelta se representa como la elección de una de las tres opciones, cuyo significado está claramente definido en cada respuesta de Alice. Las opciones en sí están representadas por los botones "Uno", "Dos", "Tres", que aceleran significativamente el juego.
Generación de mensaje de respuesta
La respuesta de Alice consta de varias partes, cada una de las cuales debe formarse, que incluyen:
- texto para mostrar en la pantalla;
- texto para síntesis de voz;
- Conjunto de botones de pista.
Recientemente, formulé el
concepto de un diálogo FÁCIL , describiendo los principios del diseño de una interfaz de conversación, incluso para Alice. El formato de respuesta de Alice permite implementar estos principios.
Por lo tanto, la separación del texto visualizado y hablado le permite hacer que las respuestas sean más concisas y naturales. No puede obligar a Alice a sintetizar texto largo con el que el usuario ya está familiarizado, así como a usar emoji en el texto del mensaje y el nombre de los botones.
Los botones de sugerencias implementan el principio de iniciativa: Alice siempre indica y sugiere posibles acciones para continuar el diálogo. En el escenario del juego propuesto, la lista de botones no depende del contexto y se agrega a cada mensaje.
Entonces, tenemos una tabla de Google con datos de usuario que se almacenan y recuperan a través de la URL de la aplicación web. La aplicación está escrita en Apps Script, interpreta la acción del usuario de acuerdo con su contexto y genera datos para el mensaje de respuesta.
Queda por conectarse con Alice ...
Dos! Integración
Yandex.Dialogs permite a los desarrolladores agregar sus habilidades a Alice. Conectar una habilidad se reduce a tres cosas principales:
- activación
- diseño;
- gancho web.
Activación y diseño.
Para la activación, es importante elegir una frase que Alice reconozca bien y que cumpla con los
requisitos formales de Yandex. Si hay números en el nombre de activación, verifique por separado la activación al ingresar desde el teclado y la voz.
El diseño de la habilidad incluye un nombre, descripción, ícono, categoría, etc.
Vale la pena considerar que en la lista de habilidades en el catálogo solo se muestran el icono y la frase de activación, y la búsqueda en el catálogo se lleva a cabo principalmente de acuerdo con la descripción.
Conseguir un gancho web
Un enlace web es la dirección donde Alice enviará mensajes a su habilidad y esperará una respuesta JSON en el formato descrito.
La aplicación web creada en Apps Script devuelve una respuesta en forma de página html de forma predeterminada, pero al usar ContentService también puede verse obligada a devolver JSON:
return ContentService.createTextOutput(JSON.stringify(<JSON >)) .setMimeType(ContentService.MimeType.JSON);
Sin embargo, cuando usa ContentService, Google redirige la solicitud del usuario a una URL temporal, para la cual Yandex.Dialogs no está listo. Por lo tanto, la dirección de la aplicación web como enlace web no es adecuada.
Hay servicios gratuitos que ofrecen un
enlace web adecuado para Alice,
como Zenbot . En Zenbot, para el juego propuesto, puede escribir una secuencia de comandos corta que acceda a una aplicación web de Google y devuelva una respuesta junto con los botones. Por cierto, de esta manera el juego puede integrarse no solo con Alice, sino también con otros canales.
A continuación se muestra un script de ejemplo que proporciona el juego "One, Two, Three!" en el bot de Telegram @RazDvaTriBot:
<context> <input pattern="$Text"> <var name="Utterance" value="$Text" scope="input"/> <get url="https://script.google.com/macros/s/<id ->/exec" var="Result"> <param name="userId" value="$req_telegram_chat"/> <param name="utterance" value="$Utterance"/> <param name="channel" value="telegram"/> </get> <var name="Answer" value='javascript: $Result.text'/> <output value="$Answer"/> <sample> <item value=""/> <item value=""/> <item value=""/> </sample> </input> </context>
Para una mayor flexibilidad en el procesamiento de solicitudes, puede escribir su propio servidor utilizando, por ejemplo, Google App Engine. Esta herramienta también se puede usar de forma gratuita.
Después de crear un proyecto en Google App Engine, la interfaz de
Cloud Shell le permite escribir el código del servidor en una página web y desplegarlo en la URL deseada del formulario https: // <project id> .appspot.com, que será la dirección del enlace web.
La operación del servidor consta de los siguientes pasos:
- recibir datos de solicitud de Alice;
- interacción con la aplicación web del juego;
- enviando una respuesta en el formato de Alice.
Recibir / enviar datos de Alice
De Alice es importante obtener los identificadores de la sesión, el usuario, el mensaje y el texto de la solicitud. A continuación se muestra un ejemplo en PHP:
$data = json_decode(file_get_contents("php://input")); $session_id = $data->session->session_id; $user_id = $data->session->user_id; $utterance = $data->request->original_utterance; $messageId = $data->session->message_id;
Como respuesta, los botones de pista y los textos se devuelven al juego para su visualización y pronunciación:
$button1 = array('title' => '1️⃣ ', 'hide' => true); $button2 = array('title' => '2️⃣ ', 'hide' => true); $button3 = array('title' => '3️⃣ ', 'hide' => true); $yaButtons = array($button1, $button2, $button3); $yaResponse = array('text' => $text, 'tts' => $tts, 'buttons' => $yaButtons, 'end_session' => false); $yaSession = array('session_id' => $session_id, 'message_id' => $messageId, 'user_id' => $user_id); $yaResult = array('response' => $yaResponse, 'session' => $yaSession, 'version' => '1.0'); echo json_encode($yaResult);
Tres! Sincronización
Enviar / recibir datos de una aplicación web lleva tiempo, y Alice está ansiosa por dar una respuesta al usuario, por lo que los problemas de sincronización interfieren con el asunto.
Naturalmente, para proyectos grandes, las Hojas de cálculo de Google no son adecuadas como backend para la habilidad de Alice: el tiempo de respuesta aumenta con una gran cantidad de solicitudes paralelas. Sin embargo, existen recomendaciones para optimizar el chatbot, que hacen posible que un pequeño proyecto sea viable en un sistema de diálogo interactivo en tiempo real.
Tiempo de espera de protocolo síncrono de Alice: 1,5 segundos por respuesta. Si el servidor no tiene tiempo para responder durante este tiempo, el usuario ve un mensaje triste en el espíritu de "Lo siento, <nombre de diálogo> no responde". El sistema no ofrece pistas sobre qué hacer a continuación.
Para evitar tal situación, puede y debe acelerar el servicio, así como rastrear y procesar los tiempos de espera. Las operaciones más largas durante la operación del guión del juego son leer y escribir datos de la tabla. Por lo tanto, en primer lugar, se debe minimizar el número de estas operaciones y, en segundo lugar, es conveniente paralelizarlas.
Lea los datos de la tabla una vez lo suficiente. Después de ejecutar la lógica, el script está listo para dar una respuesta al usuario inmediatamente, antes del final de la grabación de los resultados.
Se debe permitir un tiempo limitado para recibir una respuesta, por ejemplo, 1100 ms:
$request_params = array( 'userId' => $user_id, 'utterance' => $utterance, 'channel' => 'alice' ); $get_params = http_build_query($request_params); $ctx = stream_context_create(array('http'=> array( 'timeout' => 1.1 ) )); $answer = file_get_contents('https://script.google.com/macros/s/<id ->/exec?'. $get_params, false, $ctx);
Si la solicitud GET recibe la respuesta a tiempo, podemos enviarla al usuario e iniciar el almacenamiento de los resultados mediante la solicitud POST en segundo plano. De lo contrario, le damos al usuario un texto auxiliar con botones para continuar, e ignoramos los resultados del script para que el usuario pueda repetir su solicitud en el contexto actual.
if($answer === FALSE) { $text = ' , .'; $tts = ', .'; } else { $answer = json_decode($answer); $text = $answer->text; $tts = $answer->tts;

En un juego multijugador para Alice, las tareas de sincronización deben resolverse entre los servidores del juego y Yandex, y entre los jugadores. Si un jugador quiere jugar contra otro usuario, el juego en sí selecciona un oponente, de aquellos que quisieron jugar recientemente. Los usuarios deben confirmar su disposición a jugar entre ellos para que comience el juego.
Actualmente, la habilidad no puede iniciar el envío de un mensaje al usuario de Alice. Por lo tanto, el guión del juego permite verificar la preparación del oponente y los minutos asignados para la ronda del juego. Si el oponente retrasa el juego, se le pide al usuario que lo espere: "¿Esperar al oponente un poco más?" Al aceptar esperar, el usuario inicia otra verificación. Si el minuto del juego termina, el juego termina.
Conclusión
Las ventajas de Google Sheets como back-end para un bot de chat, excepto de forma gratuita, incluyen el hecho de que es una herramienta de depuración durante el desarrollo, y luego se convierte en una consola de administrador de habilidades con todas las delicias de la edición colaborativa desde cualquier dispositivo. Por contra: retrasos en la operación simultánea de un gran número de usuarios.
Espero que este artículo ayude a los entusiastas y desarrolladores a crear rápidamente habilidades útiles para Alice u otros canales. El juego propuesto está disponible en la tienda de habilidades Yandex.Dialog llamada “
One, Two, Three! Juego multijugador ".
Junto con las herramientas de uso general, existen soluciones especializadas para el desarrollo de bots de chat. Invito a los lectores a participar en una pequeña encuesta sobre los servicios que conozco en esta área. La lista no incluía todos los productos existentes. Le agradeceré comentarios con nombres y reseñas breves si utilizó otras herramientas.