Apparaissant, Alice a captivé les utilisateurs avec une synthèse vocale de qualité inattendue et un chat bot. Aujourd'hui, elle devrait avoir des compétences utiles et des jeux intéressants avec un backend qui peut prendre en compte le contexte de l'utilisateur et mettre en œuvre un large éventail de scénarios. Cet article traite de la création d'une compétence basée sur Google Sheets, un outil familier à beaucoup avec un grand potentiel pour les petits chatbots.
Jouer avec une vraie personne peut être plus intéressant que de jouer avec un personnage virtuel, donc à titre d'exemple, nous allons développer un jeu multijoueur pour Alice.
Un! Dialogue
Le jeu commence par les règles. Je suis venu avec ces derniers: chacun des deux joueurs place d'abord un trésor et un piège derrière trois portes, puis ouvre l'une des portes de l'adversaire. Ouvrez le trésor - récupérez les pièces de l'adversaire, ouvrez le piège - donnez-lui les pièces. Le nombre de pièces, de 1 à 3, est déterminé par le joueur lui-même. Derrière la porte restante se trouve une boîte de Pandore, ouverture dans laquelle vous pouvez trouver / perdre une quantité aléatoire de pièces. Vous pouvez jouer à la fois avec Alice et contre d'autres utilisateurs.
L'interface d'Alice est résolue sous la forme d'un dialogue, et toute interaction avec le jeu doit être implémentée via la messagerie. Le traitement de chaque message par le serveur de jeu est représenté par les étapes suivantes:
- restaurer le contexte utilisateur;
- l'interprétation des requêtes dans un contexte restauré;
- former un message de réponse;
- Enregistrement d'un contexte utilisateur modifié.
Récupérer et enregistrer le contexte utilisateur
Le contexte de l'utilisateur comprend son état dans le jeu, y compris les résultats précédents, une étape dans le script et l'adversaire actuel, ainsi que le nom d'utilisateur et d'autres informations nécessaires à la logique du jeu.
Dans chaque demande,
selon le protocole , Alice transmet l'ID utilisateur. Cela suffit pour sauvegarder puis restaurer son contexte.
En tant qu'entrepôt de données, utilisez Google Sheets. Les avantages objectifs de cette solution incluent l'utilisation gratuite, la visibilité et la facilité d'utilisation. L'éditeur de script intégré vous permet de décrire la logique du jeu dans Apps Script (basé sur JavaScript), en vous référant aux tables d'API et de le publier en tant qu'application Web.
Après avoir créé le tableau avec les en-têtes nécessaires, vous pouvez aller dans l'éditeur de script:
La logique du jeu peut être décrite dans un projet sur Apps Script, en l'organisant comme un ensemble de fichiers gs, et procéder à la publication:
Lors de la publication, vous devez spécifier la disponibilité de l'application pour les utilisateurs anonymes:
En sortie, vous obtiendrez l'URL de l'application Web publiée. Les fonctions doGet () et doPost () du script traiteront les requêtes des types correspondants afin de recevoir et d'enregistrer les contextes utilisateur.
Vous trouverez ci-dessous un schéma de travail avec les tables API pour la manipulation des données:
Interpréter une demande dans un contexte restauré
Dans le cas général, l'interprétation correcte des requêtes de texte nécessite l'utilisation d'algorithmes NLU intelligents. Et bien que de tels algorithmes soient disponibles dans des outils simples comme
celui que j'ai décrit par Aimylogic , dans ce cas, j'ai décidé d'abandonner le traitement du langage naturel au profit de la simplicité.
Dans le jeu proposé, l'interaction du joueur avec Alice est limitée à une douzaine d'états possibles et peut être réduite à un petit ensemble d'intentions. Par souci de simplicité, je propose toujours au joueur trois actions possibles: envoyer «Un», «Deux» ou «Trois». Pour toute autre demande, Alice demande de clarifier l'action.
Le scénario dans ce cas se résume au code Apps Script suivant:
Pour l'utilisateur, l'interaction ainsi résolue est représentée comme le choix de l'une des trois options, dont la signification est clairement définie dans chaque réponse d'Alice. Les options elles-mêmes sont représentées par les boutons «Un», «Deux», «Trois», qui accélèrent considérablement le gameplay.
Génération de messages de réponse
La réponse d'Alice se compose de plusieurs parties, chacune devant être formée, notamment:
- texte à afficher à l'écran;
- texte pour la synthèse vocale;
- ensemble de boutons d'indication.
Récemment, j'ai formulé le
concept d'un dialogue FACILE qui décrit les principes de conception d'une interface conversationnelle, y compris pour Alice. Le format de réponse d'Alice permet de mettre en œuvre ces principes.
Ainsi, la séparation du texte affiché et du texte parlé vous permet de rendre les réponses plus concises et naturelles. Vous ne pouvez pas forcer Alice à synthétiser un texte long que l'utilisateur connaît déjà, ainsi qu'à utiliser des emoji dans le texte du message et le nom des boutons.
Les boutons d'indication mettent en œuvre le principe d'initiative: Alice indique et suggère toujours des actions possibles pour poursuivre le dialogue. Dans le scénario du jeu proposé, la liste des boutons ne dépend pas du contexte et est ajoutée à chaque message.
Nous avons donc une table Google avec des données utilisateur qui sont stockées et récupérées via l'URL de l'application Web. L'application est écrite en Apps Script, elle interprète l'action de l'utilisateur en fonction de son contexte et génère des données pour le message de réponse.
Reste à se connecter à Alice ...
Deux! Intégration
Yandex.Dialogs permet aux développeurs d'ajouter leurs compétences à Alice. Connecter une compétence se résume à trois choses principales:
- activation;
- conception;
- crochet Web.
Activation et conception
Pour l'activation, il est important de choisir une phrase que Alice reconnaît bien, qui répond aux
exigences formelles de Yandex. S'il y a des numéros dans le nom d'activation, vérifiez séparément l'activation lorsque vous entrez à partir du clavier et de la voix.
La conception des compétences comprend un nom, une description, une icône, une catégorie, etc.
Il convient de noter que dans la liste des compétences du catalogue, seule l'icône et la phrase d'activation sont affichées, et la recherche dans le catalogue s'effectue principalement en fonction de la description.
Obtenir un crochet Web
Un hook Web est l'adresse où Alice enverra des messages à votre compétence et attendra une réponse JSON dans le format décrit.
L'application Web créée sur Apps Script renvoie une réponse sous la forme d'une page html par défaut, mais en utilisant ContentService, elle peut également être forcée de renvoyer JSON:
return ContentService.createTextOutput(JSON.stringify(<JSON >)) .setMimeType(ContentService.MimeType.JSON);
Cependant, lors de l'utilisation de ContentService, Google redirige la demande de l'utilisateur vers une URL temporaire, à laquelle Yandex.Dialogs n'est pas prêt. Par conséquent, l'adresse de l'application Web en tant que hook Web n'est pas appropriée.
Il existe des services gratuits qui offrent un crochet Web adapté à Alice,
comme Zenbot . Dans Zenbot, pour le jeu proposé, vous pouvez écrire un court script qui accède à une application Web Google et renvoie une réponse ainsi que des boutons. Soit dit en passant, de cette façon, le jeu peut être intégré non seulement avec Alice, mais aussi avec d'autres canaux.
Voici un exemple de script qui fournit le jeu «Un, deux, trois!» dans le bot 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>
Pour une plus grande flexibilité dans le traitement des demandes, vous pouvez écrire votre propre serveur en utilisant, par exemple, Google App Engine. Cet outil peut également être utilisé gratuitement.
Après avoir créé un projet dans Google App Engine, l'interface
Cloud Shell vous permet d'écrire le code du serveur sur une page Web et de le déployer à l'URL souhaitée du formulaire https: // <id projet> .appspot.com, qui sera l'adresse du hook Web.
Le fonctionnement du serveur comprend les étapes suivantes:
- recevoir les données de demande d'Alice;
- interaction avec l'application Web du jeu;
- envoyer une réponse au format d'Alice.
Recevoir / envoyer des données Alice
D'Alice, il est important d'obtenir les identifiants de la session, de l'utilisateur, du message, ainsi que le texte de la demande. Voici un exemple 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;
En guise de réponse, des boutons et des textes d'indication sont renvoyés au jeu pour l'affichage et la prononciation:
$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);
Trois! Sync
L'envoi / réception de données à partir d'une application Web prend du temps, et Alice est impatiente de donner une réponse à l'utilisateur, donc les problèmes de synchronisation interfèrent avec le problème.
Naturellement, pour les grands projets, les feuilles de calcul Google ne conviennent pas comme backend pour les compétences d'Alice: le temps de réponse augmente avec un grand nombre de demandes parallèles. Néanmoins, il existe des recommandations pour l'optimisation du chatbot, qui permettent de rendre un petit projet viable dans un système de dialogue interactif en temps réel.
Délai d'expiration du protocole synchrone d'Alice - 1,5 seconde par réponse. Si le serveur n'a pas le temps de répondre pendant cette période, l'utilisateur voit un triste message dans l'esprit «Désolé, <nom du dialogue> ne répond pas». Le système ne donne aucun indice sur la marche à suivre.
Pour éviter une telle situation, vous pouvez et devez accélérer le service, ainsi que suivre et traiter les délais. Les opérations les plus longues pendant le fonctionnement du script de jeu sont la lecture et l'écriture de données de table. Par conséquent, d'une part, le nombre de ces opérations doit être minimisé, et d'autre part, il est souhaitable de les paralléliser.
Lisez suffisamment les données du tableau. Après avoir exécuté la logique, le script est prêt à donner à l'utilisateur une réponse immédiatement, avant la fin de l'enregistrement des résultats.
Un temps limité doit être accordé pour recevoir une réponse - par exemple, 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 réponse est reçue par la requête GET à temps, nous pouvons l'envoyer à l'utilisateur et lancer l'enregistrement des résultats par la requête POST en arrière-plan. Sinon, nous donnons à l'utilisateur un stub avec des boutons pour continuer et ignorons les résultats du script afin que l'utilisateur puisse répéter sa demande dans le contexte actuel.
if($answer === FALSE) { $text = ' , .'; $tts = ', .'; } else { $answer = json_decode($answer); $text = $answer->text; $tts = $answer->tts;

Dans un jeu multijoueur pour Alice, les tâches de synchronisation doivent être résolues à la fois entre les serveurs de jeu et Yandex, et entre les joueurs. Si un joueur veut jouer contre un autre utilisateur, le jeu lui-même sélectionne un adversaire - parmi ceux qui voulaient jouer récemment. Les utilisateurs doivent confirmer leur volonté de jouer ensemble pour que le jeu commence.
Actuellement, la compétence ne peut pas lancer l'envoi d'un message à l'utilisateur d'Alice. Par conséquent, le script du jeu prévoit de vérifier l'état de préparation de l'adversaire et les minutes allouées pour le tour de jeu. Si l'adversaire retarde la partie, l'utilisateur est invité à l'attendre: "Attendre un peu plus l'adversaire?" En acceptant d'attendre, l'utilisateur lance une autre vérification. Si la minute du jeu se termine, le jeu se termine.
Conclusion
Les avantages de Google Sheets en tant que backend pour un chat bot, sauf gratuitement, incluent le fait qu'il s'agit d'un outil de débogage pendant le développement, et après cela, il devient une console d'administrateur de compétences avec tous les plaisirs de l'édition collaborative à partir de n'importe quel appareil. Par contre - retards dans le fonctionnement simultané d'un grand nombre d'utilisateurs.
J'espère que cet article aide les passionnés et les développeurs à créer rapidement des compétences utiles pour Alice ou d'autres chaînes. Le jeu proposé est disponible dans le magasin de compétences Yandex.Dialog appelé «
One, Two, Three! Jeu multijoueur . "
En plus des outils à usage général, il existe des solutions spécialisées pour le développement de chat bots. J'invite les lecteurs à participer à une petite enquête sur les services que je connais dans ce domaine. La liste ne comprenait pas tous les produits existants - je serai reconnaissant pour les commentaires avec des noms et de courtes critiques si vous avez utilisé d'autres outils.