Eins zwei drei! Chatbot von Google Sheets am Beispiel eines PvP-Spiels für Alice


Alice faszinierte die Benutzer mit unerwartet hoher Sprachsynthese und Chat-Bot. Heute wird von ihr erwartet, dass sie über nützliche Fähigkeiten und interessante Spiele mit einem Backend verfügt, das den Kontext des Benutzers berücksichtigt und eine Vielzahl von Szenarien implementiert. In diesem Artikel wird die Erstellung einer Fähigkeit beschrieben, die auf Google Sheets basiert, einem Tool, das vielen bekannt ist und ein großes Potenzial für kleine Chatbots bietet.

Das Spielen mit einer realen Person kann interessanter sein als das Spielen mit einem virtuellen Charakter. Als Beispiel werden wir ein Multiplayer-Spiel für Alice entwickeln.

Eins! Dialog


Das Spiel beginnt mit den Regeln. Ich habe mir Folgendes ausgedacht: Jeder der beiden Spieler platziert zuerst einen Schatz und eine Falle hinter drei Türen und öffnet dann eine der Türen des Gegners. Öffne den Schatz - nimm die Münzen des Gegners, öffne die Falle - gib ihm die Münzen. Die Anzahl der Münzen von 1 bis 3 wird vom Spieler selbst festgelegt. Hinter der verbleibenden Tür befindet sich eine Büchse der Pandora, in der Sie eine zufällige Anzahl von Münzen finden / verlieren können. Sie können sowohl mit Alice als auch gegen andere Benutzer spielen.

Alices Oberfläche wird in Form eines Dialogs gelöst, und alle Spielinteraktionen sollten durch Messaging implementiert werden. Die Verarbeitung jeder Nachricht durch den Spielserver wird durch die folgenden Schritte dargestellt:

  1. Benutzerkontext wiederherstellen;
  2. Abfrageinterpretation in einem wiederhergestellten Kontext;
  3. Bilden einer Antwortnachricht;
  4. Speichern eines geänderten Benutzerkontexts.

Stellen Sie den Benutzerkontext wieder her und speichern Sie ihn


Der Kontext des Benutzers umfasst seinen Status im Spiel, einschließlich vorheriger Ergebnisse, einen Schritt innerhalb des Skripts und des aktuellen Gegners sowie den Benutzernamen und andere Informationen, die für die Spiellogik erforderlich sind.

Bei jeder Anforderung übergibt Alice gemäß dem Protokoll die Benutzer-ID. Dies reicht aus, um den Kontext zu speichern und anschließend wiederherzustellen.

Nehmen Sie als Data Warehouse Google Sheets. Die objektiven Vorteile dieser Lösung sind freie Nutzung, Sichtbarkeit und Benutzerfreundlichkeit. Mit dem integrierten Skripteditor können Sie die Logik des Spiels in Apps Script (basierend auf JavaScript) unter Bezugnahme auf die API-Tabellen beschreiben und als Webanwendung veröffentlichen.

Nachdem Sie die Tabelle mit den erforderlichen Überschriften erstellt haben, können Sie zum Skripteditor wechseln:


Die Logik des Spiels kann in einem Projekt in Apps Script beschrieben werden, das als Satz von gs-Dateien organisiert wird, und mit der Veröffentlichung fortfahren:


Bei der Veröffentlichung müssen Sie die Verfügbarkeit der Anwendung für anonyme Benutzer angeben:


Bei der Ausgabe erhalten Sie die URL der veröffentlichten Webanwendung. Die Funktionen doGet () und doPost () im Skript verarbeiten Anforderungen der entsprechenden Typen, um Benutzerkontexte zu empfangen und zu speichern.

Unten sehen Sie ein Diagramm der Arbeit mit den API-Tabellen zur Datenmanipulation:

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

Interpretieren einer Anforderung in einem wiederhergestellten Kontext


Im allgemeinen Fall erfordert die korrekte Interpretation von Textabfragen die Verwendung intelligenter NLU-Algorithmen. Und obwohl solche Algorithmen in einfachen Werkzeugen wie dem von Aimylogic beschriebenen verfügbar sind , habe ich mich in diesem Fall entschieden, die Verarbeitung natürlicher Sprache zugunsten der Einfachheit aufzugeben.

Im vorgeschlagenen Spiel ist die Interaktion des Spielers mit Alice auf ein Dutzend mögliche Zustände beschränkt und kann auf eine kleine Anzahl von Absichten reduziert werden. Der Einfachheit halber biete ich dem Spieler immer drei mögliche Aktionen an: Senden Sie "Eins", "Zwei" oder "Drei". Bei jeder anderen Anfrage bittet Alice um Klärung der Aktion.

Das Szenario in diesem Fall beruht auf dem folgenden Apps-Skriptcode:

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

Für den Benutzer wird die so aufgelöste Interaktion als Auswahl einer von drei Optionen dargestellt, deren Bedeutung in der Antwort jeder Alice klar definiert ist. Die Optionen selbst werden durch die Schaltflächen "Eins", "Zwei", "Drei" dargestellt, die das Gameplay erheblich beschleunigen.

Generierung von Antwortnachrichten


Alices Antwort besteht aus mehreren Teilen, von denen jeder gebildet werden muss, einschließlich:

  • Text, der auf dem Bildschirm angezeigt werden soll;
  • Text zur Sprachsynthese;
  • Satz von Hinweisknöpfen.

Kürzlich habe ich das Konzept eines EASY-Dialogs formuliert und die Prinzipien für das Entwerfen einer Konversationsschnittstelle beschrieben, auch für Alice. Das Antwortformat von Alice ermöglicht die Implementierung dieser Prinzipien.

Durch die Trennung von angezeigtem und gesprochenem Text können Sie die Antworten präziser und natürlicher gestalten. Sie können Alice nicht zwingen, Langtext zu synthetisieren, mit dem der Benutzer bereits vertraut ist, und Emoji im Nachrichtentext und im Namen der Schaltflächen verwenden.

Hinweisschaltflächen setzen das Prinzip der Initiative um: Alice zeigt immer mögliche Maßnahmen an und schlägt sie vor, um den Dialog fortzusetzen. Im Szenario des vorgeschlagenen Spiels hängt die Liste der Schaltflächen nicht vom Kontext ab und wird jeder Nachricht hinzugefügt.

Wir haben also eine Google-Tabelle mit Benutzerdaten, die über die URL der Webanwendung gespeichert und abgerufen werden. Die Anwendung ist in Apps Script geschrieben, interpretiert die Aktion des Benutzers entsprechend seinem Kontext und generiert Daten für die Antwortnachricht.

Es bleibt eine Verbindung zu Alice ...

Zwei! Integration


Mit Yandex.Dialogs können Entwickler ihre Fähigkeiten zu Alice hinzufügen. Das Verbinden einer Fertigkeit besteht aus drei Hauptaspekten:

  • Aktivierung;
  • Design;
  • Web-Haken.

Aktivierung und Design


Für die Aktivierung ist es wichtig, einen Satz zu wählen, den Alice gut erkennt und der den formalen Anforderungen von Yandex entspricht. Wenn der Aktivierungsname Nummern enthält, überprüfen Sie die Aktivierung separat, wenn Sie über Tastatur und Sprache eingeben.

Das Skill-Design enthält einen Namen, eine Beschreibung, ein Symbol, eine Kategorie usw.
Es ist zu beachten, dass in der Liste der Fähigkeiten im Katalog nur das Symbol und die Aktivierungsphrase angezeigt werden und die Suche im Katalog hauptsächlich gemäß der Beschreibung durchgeführt wird.

Einen Web-Hook bekommen


Ein Web-Hook ist die Adresse, an die Alice Nachrichten an Ihre Fähigkeiten sendet und auf eine JSON-Antwort im beschriebenen Format wartet.



Die in Apps Script erstellte Webanwendung gibt standardmäßig eine Antwort in Form einer HTML-Seite zurück. Mit dem ContentService kann jedoch auch die Rückgabe von JSON erzwungen werden:

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

Bei Verwendung von ContentService leitet Google die Benutzeranforderung jedoch an eine temporäre URL weiter, für die Yandex.Dialogs nicht bereit ist. Daher ist die Adresse der Webanwendung als Web-Hook nicht geeignet.

Es gibt kostenlose Dienste, die einen für Alice geeigneten Web-Hook anbieten, wie z. B. Zenbot . In Zenbot können Sie für das vorgeschlagene Spiel ein kurzes Skript schreiben, das auf eine Google-Webanwendung zugreift und eine Antwort zusammen mit Schaltflächen zurückgibt. Auf diese Weise kann das Spiel übrigens nicht nur in Alice, sondern auch in andere Kanäle integriert werden.

Unten finden Sie ein Beispielskript, das das Spiel "Eins, Zwei, Drei!" im Telegrammbot @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> 

Für eine größere Flexibilität bei der Verarbeitung von Anforderungen können Sie Ihren eigenen Server beispielsweise mit Google App Engine schreiben. Dieses Tool kann auch kostenlos verwendet werden.

Nach dem Erstellen eines Projekts in der Google App Engine können Sie über die Cloud Shell- Oberfläche Servercode auf eine Webseite schreiben und unter der gewünschten URL des Formulars https: // <Projekt-ID> .appspot.com bereitstellen, die die Adresse des Web-Hooks ist.

Der Serverbetrieb besteht aus folgenden Schritten:

  1. Empfangen von Anforderungsdaten von Alice;
  2. Interaktion mit der Webanwendung des Spiels;
  3. Senden einer Antwort in Alices Format.

Alice-Daten empfangen / senden


Von Alice ist es wichtig, die Kennungen der Sitzung, des Benutzers, der Nachricht sowie den Text der Anforderung zu erhalten. Unten ist ein Beispiel in 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; 

Als Antwort werden Hinweisschaltflächen und Texte zur Anzeige und Aussprache an das Spiel zurückgegeben:

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

Drei! Synchronisieren


Das Senden / Empfangen von Daten aus einer Webanwendung nimmt Zeit in Anspruch, und Alice ist bestrebt, dem Benutzer eine Antwort zu geben, sodass Synchronisierungsprobleme die Angelegenheit beeinträchtigen.

Für große Projekte eignen sich Google Sheets natürlich nicht als Backend für Alice 'Fähigkeiten: Die Antwortzeit erhöht sich mit einer großen Anzahl paralleler Anfragen. Dennoch gibt es Empfehlungen zur Optimierung des Chatbots, die es ermöglichen, ein kleines Projekt in einem interaktiven Echtzeit-Dialogsystem realisierbar zu machen.

Zeitlimit für das synchrone Protokoll von Alice - 1,5 Sekunden pro Antwort. Wenn der Server während dieser Zeit keine Zeit hat, eine Antwort zu geben, sieht der Benutzer eine traurige Nachricht im Sinne von "Entschuldigung, <Dialogname> antwortet nicht". Das System bietet keine Hinweise darauf, was als nächstes zu tun ist.

Um eine solche Situation zu vermeiden, können und sollten Sie den Service beschleunigen sowie Zeitüberschreitungen verfolgen und verarbeiten. Die langwierigsten Operationen während der Operation des Spielskripts sind das Lesen und Schreiben von Tabellendaten. Daher muss zum einen die Anzahl dieser Operationen minimiert werden, und zum anderen ist es wünschenswert, sie zu parallelisieren.

Lesen Sie die Tabellendaten einmal genug. Nach dem Ausführen der Logik ist das Skript bereit, dem Benutzer unmittelbar vor dem Ende der Aufzeichnung der Ergebnisse eine Antwort zu geben.

Es sollte eine begrenzte Zeit eingeräumt werden, um eine Antwort zu erhalten - zum Beispiel 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); 

Wenn die Antwort rechtzeitig von der GET-Anforderung empfangen wird, können wir sie an den Benutzer senden und das Speichern der Ergebnisse durch die POST-Anforderung im Hintergrund initiieren. Andernfalls geben wir dem Benutzer einen Stub-Text mit Schaltflächen, um fortzufahren, und ignorieren die Ergebnisse des Skripts, damit der Benutzer seine Anforderung im aktuellen Kontext wiederholen kann.

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


In einem Multiplayer-Spiel für Alice müssen Synchronisationsaufgaben sowohl zwischen den Spielservern und Yandex als auch zwischen den Spielern gelöst werden. Wenn ein Spieler gegen einen anderen Benutzer spielen möchte, wählt das Spiel selbst einen Gegner aus - aus denen, die kürzlich spielen wollten. Benutzer müssen ihre Bereitschaft bestätigen, miteinander zu spielen, damit das Spiel beginnen kann.

Derzeit kann die Fertigkeit das Senden einer Nachricht an Alices Benutzer nicht initiieren. Daher bietet das Spielskript die Möglichkeit, die Bereitschaft des Gegners und die für die Spielrunde vorgesehenen Minuten zu überprüfen. Wenn der Gegner das Spiel verzögert, wird der Benutzer aufgefordert, auf ihn zu warten: "Warten Sie etwas länger auf den Gegner?" Durch die Zustimmung zum Warten startet der Benutzer eine weitere Prüfung. Wenn die Minute des Spiels endet, endet das Spiel.

Fazit


Zu den Vorteilen von Google Sheets als Backend für einen Chat-Bot, außer kostenlos, gehört die Tatsache, dass es sich während der Entwicklung um ein Debugging-Tool handelt und danach zu einer Konsole für Skill-Administratoren wird, die alle Vorteile der kollaborativen Bearbeitung von jedem Gerät aus bietet. Durch Nachteile - Verzögerungen beim gleichzeitigen Betrieb einer großen Anzahl von Benutzern.

Ich hoffe, dieser Artikel hilft Enthusiasten und Entwicklern, schnell nützliche Fähigkeiten für Alice oder andere Kanäle zu entwickeln. Das vorgeschlagene Spiel ist im Yandex.Dialog Skills Store mit dem Namen „ One, Two, Three! Multiplayer-Spiel . “

Neben Allzweck-Tools gibt es spezielle Lösungen für die Entwicklung von Chat-Bots. Ich lade die Leser ein, an einer kleinen Umfrage zu den Dienstleistungen teilzunehmen, die ich in diesem Bereich kenne. Die Liste enthielt nicht alle vorhandenen Produkte - ich bin dankbar für Kommentare mit Namen und kurzen Bewertungen, wenn Sie andere Tools verwendet haben.

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


All Articles