Um, dois, três! Chatbot do Planilhas Google usando o exemplo de um jogo PvP para Alice


Aparentemente, Alice cativou os usuários com uma síntese de voz inesperadamente de alta qualidade e um bot de bate-papo. Hoje, espera-se que ela tenha habilidades úteis e jogos interessantes com um back-end que possa levar em consideração o contexto do usuário e implementar uma ampla variedade de cenários. Este artigo discute a criação de uma habilidade baseada no Planilhas Google, uma ferramenta familiar para muitos com grande potencial para pequenos chatbots.

Jogar com uma pessoa real pode ser mais interessante do que jogar com um personagem virtual; portanto, como exemplo, desenvolveremos um jogo multiplayer para Alice.

Um! Diálogo


O jogo começa com as regras. Eu vim com estas: cada um dos dois jogadores primeiro coloca um tesouro e uma armadilha atrás de três portas e depois abre qualquer uma das portas do oponente. Abra o tesouro - pegue as moedas do oponente, abra a armadilha - entregue as moedas para ele. O número de moedas, de 1 a 3, é determinado pelo próprio jogador. Atrás da porta restante é uma caixa de Pandora, abertura que você pode encontrar / perder uma quantidade aleatória de moedas. Você pode jogar com Alice e contra outros usuários.

A interface de Alice é resolvida na forma de um diálogo, e toda a interação do jogo deve ser implementada por meio de mensagens. O processamento de cada mensagem pelo servidor do jogo é representado pelas seguintes etapas:

  1. restaurar o contexto do usuário;
  2. interpretação de consultas em um contexto restaurado;
  3. formar uma mensagem de resposta;
  4. Salvando um contexto de usuário alterado.

Recupere e salve o contexto do usuário


O contexto do usuário inclui seu estado no jogo, incluindo resultados anteriores, uma etapa dentro do script e o oponente atual, além do nome do usuário e outras informações necessárias para a lógica do jogo.

Em cada solicitação, de acordo com o protocolo , Alice passa o ID do usuário. Isso é suficiente para salvar e posteriormente restaurar seu contexto.

Como um data warehouse, use o Planilhas Google. As vantagens objetivas desta solução incluem uso gratuito, visibilidade e facilidade de uso. O editor de scripts embutido permite descrever a lógica do jogo no Apps Script (baseado em JavaScript), consultando as tabelas de API e publicando-o como um aplicativo da web.

Após criar a tabela com os cabeçalhos necessários, você pode acessar o editor de scripts:


A lógica do jogo pode ser descrita em um projeto no Apps Script, organizando-o como um conjunto de arquivos gs e continue com a publicação:


Ao publicar, você deve especificar a disponibilidade do aplicativo para usuários anônimos:


Na saída, você obterá o URL do aplicativo Web publicado. As funções doGet () e doPost () no script processam solicitações dos tipos correspondentes para receber e salvar contextos do usuário.

Abaixo está um diagrama de como trabalhar com as tabelas de API para manipulação de dados:

//  var sheet = SpreadsheetApp.openById("<id >").getSheetByName("< >"); //  var range = sheet.getRange(< >); //   var values = range.getValues(); //    range.setValues(< >); 

Interpretando uma solicitação em um contexto restaurado


No caso geral, a interpretação correta das consultas de texto requer o uso de algoritmos NLU inteligentes. E, embora esses algoritmos estejam disponíveis em ferramentas simples, como a que descrevi por Aimylogic , nesse caso, decidi abandonar o processamento de linguagem natural em favor da simplicidade.

No jogo proposto, a interação do jogador com Alice é limitada a uma dúzia de estados possíveis e pode ser reduzida a um pequeno conjunto de intenções. Para simplificar, sempre ofereço ao jogador três ações possíveis: envie "Um", "Dois" ou "Três". Para qualquer outra solicitação, Alice pede para esclarecer a ação.

O cenário, neste caso, se resume ao seguinte código do Script de aplicativos:

 //     switch(user.state){ case "start": //       switch(utterance){ case “1️⃣ ”: case “2️⃣ ”: case “3️⃣ ”: //     default: //     } break; //    default: //      } 

Para o usuário, a interação assim resolvida é representada como a escolha de uma das três opções, cujo significado está claramente definido na resposta de cada Alice. As opções em si são representadas pelos botões "Um", "Dois", "Três", que aceleram significativamente a jogabilidade.

Geração de mensagem de resposta


A resposta de Alice consiste em várias partes, cada uma das quais precisa ser formada, incluindo:

  • texto a ser exibido na tela;
  • texto para síntese de fala;
  • conjunto de botões de dica.

Recentemente, formulei o conceito de um diálogo FÁCIL , descrevendo os princípios do design de uma interface de conversação, inclusive para Alice. O formato de resposta de Alice permite que esses princípios sejam implementados.

Portanto, a separação do texto exibido e do texto falado permite tornar as respostas mais concisas e naturais. Você não pode forçar Alice a sintetizar texto longo com o qual o usuário já está familiarizado, além de usar emoji no texto da mensagem e no nome dos botões.

Os botões de dicas implementam o princípio da iniciativa: Alice sempre indica e sugere possíveis ações para continuar o diálogo. No cenário do jogo proposto, a lista de botões não depende do contexto e é adicionada a cada mensagem.

Portanto, temos uma tabela do Google com dados do usuário que são armazenados e recuperados através do URL do aplicativo da web. O aplicativo é escrito em Apps Script, interpreta a ação do usuário de acordo com seu contexto e gera dados para a mensagem de resposta.

Resta conectar-se a Alice ...

Dois! Integração


O Yandex.Dialogs permite que os desenvolvedores adicionem suas habilidades a Alice. Conectar uma habilidade se resume a três coisas principais:

  • ativação;
  • design;
  • gancho da web.

Ativação e design


Para a ativação, é importante escolher uma frase que Alice reconheça bem, que atenda aos requisitos formais do Yandex. Se houver números no nome da ativação, verifique separadamente a ativação ao digitar no teclado e na voz.

O design da habilidade inclui um nome, descrição, ícone, categoria etc.
Vale considerar que na lista de habilidades do catálogo apenas o ícone e a frase de ativação são exibidos, e a pesquisa no catálogo é realizada principalmente de acordo com a descrição.

Obtendo um gancho da web


Um gancho da web é o endereço para o qual Alice enviará mensagens para sua habilidade e aguardará uma resposta JSON no formato descrito.



O aplicativo Web criado no Apps Script retorna uma resposta na forma de uma página html por padrão, mas usando o ContentService, ele pode ser forçado a retornar o JSON também:

 return ContentService.createTextOutput(JSON.stringify(<JSON >)) .setMimeType(ContentService.MimeType.JSON); 

No entanto, ao usar o ContentService, o Google redireciona a solicitação do usuário para um URL temporário, para o qual o Yandex.Dialogs não está pronto. Portanto, o endereço do aplicativo Web como um gancho da Web não é adequado.

Existem serviços gratuitos que oferecem um gancho da web adequado para Alice, como o Zenbot . No Zenbot, para o jogo proposto, você pode escrever um script curto que acesse um aplicativo Web do Google e retorne uma resposta junto com os botões. A propósito, dessa forma, o jogo pode ser integrado não apenas a Alice, mas também a outros canais.

Abaixo está um exemplo de script que fornece o jogo "Um, Dois, Três!" no bot do 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 maior flexibilidade no processamento de solicitações, você pode escrever seu próprio servidor usando, por exemplo, o Google App Engine. Esta ferramenta também pode ser usada gratuitamente.

Após criar um projeto no Google App Engine, a interface do Cloud Shell permite que você escreva o código do servidor em uma página da Web e implante-o no URL desejado no formato https: // <ID do projeto> .appspot.com, que será o endereço do gancho da Web.

A operação do servidor consiste nas seguintes etapas:

  1. receber dados de solicitação de Alice;
  2. interação com a aplicação web do jogo;
  3. enviando uma resposta no formato de Alice.

Receber / enviar dados de Alice


De Alice, é importante obter os identificadores da sessão, usuário, mensagem e o texto da solicitação. Abaixo está um exemplo em 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 resposta, os botões e textos de dicas são retornados ao jogo para exibição e pronúncia:

  $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); 

Três! Sincronizar


O envio / recebimento de dados de um aplicativo da web leva tempo e Alice está ansiosa para dar uma resposta ao usuário, para que os problemas de sincronização interfiram no problema.

Naturalmente, para grandes projetos, o Planilhas Google não é adequado como back-end para a habilidade de Alice: o tempo de resposta aumenta com um grande número de solicitações paralelas. No entanto, existem recomendações para otimizar o chatbot, que possibilitam a viabilização de um pequeno projeto em um sistema de diálogo interativo em tempo real.

Tempo limite do protocolo síncrono de Alice - 1,5 segundos por resposta. Se o servidor não tiver tempo para responder durante esse período, o usuário verá uma mensagem triste com o espírito de "Desculpe, <nome da caixa de diálogo> não responde". O sistema não oferece nenhuma pista sobre o que fazer em seguida.

Para evitar tal situação, você pode e deve acelerar o serviço, além de rastrear e processar tempos limite. As operações mais longas durante a operação do script do jogo são a leitura e gravação de dados da tabela. Portanto, em primeiro lugar, o número dessas operações deve ser minimizado e, em segundo lugar, é desejável paralelizá-las.

Leia os dados da tabela uma vez o suficiente. Depois de executar a lógica, o script está pronto para dar uma resposta imediata ao usuário, antes do final da gravação dos resultados.

Um tempo limitado deve receber uma resposta - por exemplo, 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); 

Se a resposta for recebida pela solicitação GET dentro do prazo, podemos enviá-la ao usuário e iniciar o salvamento dos resultados pela solicitação POST em segundo plano. Caso contrário, fornecemos ao usuário um texto stub com botões para continuar e ignoramos os resultados do script para que o usuário possa repetir sua solicitação no contexto atual.

  if($answer === FALSE) { $text = ' ,   .'; $tts = ',   .'; } else { $answer = json_decode($answer); $text = $answer->text; $tts = $answer->tts; //   $data2store = $answer->data; $postdata = json_encode(array( 'data' => $data2store )); $opts = array('http' => array( 'method' => 'POST', 'header' => 'Content-Type: application/json', 'content' => $postdata, 'timeout' => 0.1 ) ); $context = stream_context_create($opts); file_get_contents("https://script.google.com/macros/s/<id ->/exec", false, $context); } 


Em um jogo multiplayer para Alice, as tarefas de sincronização devem ser resolvidas entre os servidores do jogo e o Yandex e entre os jogadores. Se um jogador quiser jogar contra outro usuário, o próprio jogo seleciona um oponente - daqueles que queriam jogar recentemente. Os usuários devem confirmar sua disposição de jogar um com o outro para o jogo começar.

Atualmente, a habilidade não pode iniciar o envio de uma mensagem ao usuário de Alice. Portanto, o script do jogo fornece a verificação da prontidão do oponente e os minutos alocados para a rodada do jogo. Se o oponente atrasar o jogo, o usuário será solicitado a esperar por ele: "Espere mais um pouco pelo oponente?" Ao concordar em esperar, o usuário inicia outra verificação. Se o minuto do jogo terminar, o jogo termina.

Conclusão


As vantagens do Planilhas Google como back-end para um bot de bate-papo, exceto de graça, incluem o fato de ser uma ferramenta de depuração durante o desenvolvimento e, depois disso, se tornar um console de administrador de habilidades com todas as delícias da edição colaborativa de qualquer dispositivo. Por contras - atrasos na operação simultânea de um grande número de usuários.

Espero que este artigo ajude entusiastas e desenvolvedores a criar rapidamente habilidades úteis para Alice ou outros canais. O jogo proposto está disponível na loja de habilidades Yandex.Dialog chamada “ One, Two, Three! Jogo multiplayer . ”

Juntamente com as ferramentas de uso geral, existem soluções especializadas para o desenvolvimento de bots de bate-papo. Convido os leitores a participarem de uma pequena pesquisa sobre os serviços que conheço nesta área. A lista não incluía todos os produtos existentes - serei grato por comentários com nomes e críticas breves se você usou outras ferramentas.

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


All Articles