Ende letzten Monats wurde der Google-Assistent
offiziell in russischer Sprache veröffentlicht. Es ist also an der Zeit, herauszufinden, wie Sie Ihre eigenen Anwendungen (
Aktionen ) für den Assistenten auf dem Standard-Google-Technologie-Stack erstellen können. In diesem Artikel werden wir in Aktion bei
Google eine Aktion erstellen, den Prozess des Extrahierens von Entitäten und Absichten aus Phrasen in
Dialogflow analysieren , lernen, wie Handler für extrahierte Informationen geschrieben werden, und mit einem Netzwerk in
Cloud Functions for Firebase arbeiten .
Abb. 1. Anwendungsarchitektur für den Assistenten.Die Entwicklung für den Assistenten hat vor relativ kurzer Zeit begonnen, so dass das Netzwerk nur über wenige Materialien verfügt und die Anzahl der verwendeten Tools und Technologien die Eintrittsschwelle erheblich erhöht. Dieser Artikel löst zwar nicht, trägt aber zumindest zur Lösung dieser Probleme bei. Beginnen wir mit der Anwendungsarchitektur für den Assistenten (Abb. 1), die auf dem Standard-Google-Technologie-Stack implementiert ist:
- Actions on Google ist eine Plattform zum Erstellen von Anwendungen für Google Assistant.
- Dialogflow - NLU-Engine (Natural Language Understanding), verantwortlich für die Verarbeitung natürlicher Sprachen und Designdialoge.
- Cloud-Funktionen für Firebase (der Einfachheit halber verwenden wir die Abkürzung Firebase-Funktionen) - Cloud-Funktionen zur Verarbeitung komplexer Logik der Benutzerinteraktion und zur Arbeit mit Diensten von Drittanbietern. Firebase-Funktionen und Dialogflow interagieren über einen Webhook, sodass technisch jede andere Serverlösung verwendet werden kann. Firebase-Funktionen sind jedoch eine gute Alternative und manchmal ein Ersatz für das eigene Backend. Sie können damit Dienste in der Infrastruktur von Google erstellen und ausführen, ohne sich um die Zuweisung, Skalierung oder Verwaltung von Servern kümmern zu müssen. Auf diese Weise können Sie sich einerseits auf die Produktkomponente der Entwicklung und Funktionalität des Dienstes konzentrieren, ohne Zeit für Infrastrukturaufgaben und Verwaltung zu verschwenden. Andererseits führt die Delegation in der Regel zu einer Schwächung der Kontrolle über die Situation.
Der Artikel konzentriert sich auf den technischen Aspekt der Entwicklung, die Kosten für die Nutzung der aufgeführten Dienste werden nicht analysiert.
Abb. 2. Interaktion der Komponenten des Google-Assistenten (basierend auf Material: Google Home und Google Assistant Workshop ).Innerhalb des beschriebenen Stapels sieht die Aktionslogik folgendermaßen aus (Abb. 2):
- Der Nutzer greift auf die Google Assistant-Anwendung zu und initiiert eine Konversation mit einer bestimmten Aktion.
- Google Assistant stellt über Aktionen auf Google jede Benutzerphrase in einem Textformat in Dialogflow als Proxy bereit und bietet zusätzlich Informationen zum Benutzer (mit einer vorläufigen Anfrage und mit Zustimmung des Benutzers) und zur aktuellen Konversation .
- Dialogflow verarbeitet die empfangene Phrase, extrahiert die erforderlichen Informationen daraus und trifft auf der Grundlage von ML Entscheidungen darüber, welche Antwort generiert wird.
- In einigen Fällen kann Dialogflow die Bildung einer Antwort an den Server in Firebase-Funktionen delegieren, der wiederum Dienste von Drittanbietern verwenden kann, um die für die Antwort erforderlichen Informationen abzurufen.
- Nachdem die Antwort erstellt wurde, gibt Dialogflow sie an Aktionen bei Google zurück, von wo aus sie in die Google Assistant-Anwendung eingeht.
Idee
Unsere Aktion bestimmt anhand eines Satzes, welche Art von Gifs der Benutzer sehen möchte. Anschließend sucht er über die GIPHY-API nach ihnen und gibt sie in Form von Karten an den Benutzer zurück. Bei der Implementierung der Aktion analysieren wir die Lösung der folgenden Aufgaben:
- Einrichten und Verknüpfen von Aktionen in Google-, Dialogflow- und Firebase-Funktionen.
- Extrahieren Sie Schlüsselwörter aus Benutzerphrasen (Dialogflow).
- Skriptdialog (Dialogflow).
- Arbeiten Sie mit dem Dialogkontext (Dialogflow).
- Erstellen und Verbinden eines Webhooks, um eine Antwort auf eine Benutzerphrase zu generieren (Dialogflow, Firebase-Funktion).
- Kartenkarussell in der Benutzeroberfläche anzeigen (Firebase-Funktionen).
- Herunterladen von Informationen von einem Drittanbieter (Firebase-Funktionen).
Ersteinrichtung
Abb. 3. Erstellen eines Dialogflow-Agenten.Zunächst benötigen wir ein Google-Konto. Beginnen wir mit dem Erstellen eines Projekts in Dialogflow. Klicken Sie dazu in der
Konsole auf die Schaltfläche Agent erstellen und füllen Sie die erforderlichen Felder aus (Abb. 3):
- Die Standardsprache ist "Russisch - ru".
- Zeitzone: "(GMT + 3: 00) Europa / Moskau".
- Google Cloud-Projekt: Ein neues GCP für Ihren Dialogflow-Agenten wird automatisch erstellt, oder Sie können gegebenenfalls eines der vorhandenen GCP-Projekte auswählen.
Klicken Sie dann oben rechts auf die Schaltfläche Erstellen und warten Sie, bis die Konsole ein neues Projekt konfiguriert hat.
Abb. 4. Standardabsichten.Standardmäßig werden beim Erstellen eines Dialogflow-Agenten zwei Absichten erstellt (Abb. 4):
- "Standard-Begrüßungsabsicht" - ist für die Begrüßung des Benutzers verantwortlich.
- "Standard-Fallback-Absicht" - verarbeitet unbekannte Phrasen, die Dialogflow keiner anderen Absicht zuordnen kann.
Das Erstellen von Dialogen in Dialogflow wurde bereits in den Artikeln
hier ,
hier und
hier ausführlich beschrieben, daher werde ich mich nicht auf das Funktionsprinzip konzentrieren.
Abb. 5. Antworten zu "Standard-Begrüßungsabsicht".Wir werden der "Standard-Begrüßungsabsicht" einige willkommene Antworten hinzufügen, die dem Benutzer helfen, zu verstehen, wozu die Aktion dient und welche Funktionen er ausführen kann. Wählen Sie im Abschnitt "Antworten" die Registerkarte "Google-Assistent" und in den "Vorschlagsschiffen" werden Beispiele für Phrasen geschrieben, die dem Benutzer mitteilen, wie er mit der Aktion kommunizieren soll (Abb. 5).
Die Aktion kann in Google Assistant sowohl am Telefon als auch im offiziellen Emulator getestet werden. Um den Emulator zu öffnen, müssen Sie im Abschnitt "Integrationen" auf der Karte "Google Assistant" auf die Schaltfläche "Integrationseinstellungen" und dann auf "Assistenten-App verwalten" klicken. Sowohl im Telefon als auch im Emulator kann die Aktion mit dem Code "Ok Google, ich möchte mit meiner Testanwendung sprechen" ausgelöst werden.
Basisszenario: GIF-Suche
Erstellen Sie eine neue Suchabsicht, die Schlüsselwörter aus der Phrase des Benutzers extrahiert und über den Webhook-Server an Firebase-Funktionen sendet. Der Server, der wiederum die GIPHY-API verwendet, findet die entsprechenden Gifs und gibt das Ergebnis in Form von Karten an den Benutzer zurück.
Abb. 6. Hinzufügen von Trainingsphrasen.Zunächst werden wir im Abschnitt Trainingssätze (Abb. 6) typische Sätze für das Training hinzufügen:
- "Ich möchte tanzende Giraffen sehen."
- "Finde den Animashki."
- "Zeigen Sie die Siegel."
- Zeig mir die Gifs.
- "Finde mich animierte Elefanten."
- "Zeige Panda Gifs."
- "Gifs mit Waschbärenstreifen."
- "Du hast Siegel."
- "Finde die lustigen Wasserfälle."
Abb. 7. Parameter aus Text extrahieren.Beachten Sie für hinzugefügte Phrasen den Suchparameter, den Dialogflow aus dem Text auswählen soll. In diesem Fall ist
@sys.any
der am besten geeignete Parametertyp, da fast jedes Sprachkonstrukt als Suchabfrageparameter verwendet werden kann. Wir rufen diese Parameterabfrage auf und markieren sie nach Bedarf (Abb. 7).
Abb. 8. Die Liste der wichtigsten Fragen.Im Unterabschnitt „Eingabeaufforderungen“ schreiben wir klärende Fragen auf, die Dialogflow stellen wird, wenn es keine Schlüsselwörter aus der Phrase extrahieren kann (Abb. 8).
Gehen Sie als nächstes zum Abschnitt „Erfüllung“ ganz unten auf der Seite (nicht zu verwechseln mit dem gleichnamigen Abschnitt im linken Menü). Klicken Sie auf die Schaltfläche "Vollständigkeit aktivieren" und aktivieren Sie dann die Einstellung "Webhook-Aufruf für diese Absicht aktivieren". Auf diese Weise kann Dialogflow die Bildung einer Antwort auf Firebase-Funktionen delegieren, wenn sie die Absicht trifft.
Gehen Sie nun zur Registerkarte "Erfüllung" im linken Menü und aktivieren Sie den "Inline-Editor", in dem wir die Logik für die neu erstellte "Suchabsicht" schreiben. Um nach GIFs anhand von Schlüsselwörtern zu suchen, verwenden wir die Anforderung
https://api.giphy.com/v1/gifs/search , die eine Liste der gefundenen Objekte im JSON-Format gemäß der
Spezifikation zurückgibt. Die von GIPHY erhaltene Antwort wird in Form eines
Browsing-Karussells angezeigt - eines Karussells mit Karten und Bildern. Wenn Sie darauf klicken, wird eine Webseite geöffnet. In unserem Fall wird der Benutzer beim Klicken auf die Karte mit dieser Animation und einer Liste ähnlicher Karten zur GIPHY-Service-Seite wechseln.
Code, der die oben beschriebene Funktionalität implementiert, wird unten dargestellt.
'use strict'; const GIPHY_API_KEY = 'API_KEY'; const SEARCH_RESULTS = [ '-, .', ', .', ', !' ];
Abhängigkeiten { "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", "request": "^2.81.0", "request-promise": "^4.2.1" } }
Da der Benutzer mehrmals auf dieselbe Absicht zugreifen kann, wird empfohlen, verschiedene Antworten darauf zurückzugeben. Zu diesem Zweck haben wir das JSON-Objekt
Conversation.data
, das seinen Wert sowohl beim erneuten Zugriff auf die Absicht als auch beim Verweisen auf andere Konversationsskripte beibehält.
Abb. 9. Initialisierung der Konversation (links), Verfeinerung der Suchparameter und weitere Anzeige der Ergebnisse (in der Mitte), Anzeige der Suchergebnisse für eine neue Abfrage (rechts)Hinweis: Um mit der API von Diensten von Drittanbietern über Firebase-Funktionen arbeiten zu können, müssen Sie die Abrechnung aktivieren. Andernfalls tritt beim Versuch, mit dem Netzwerk zu arbeiten, ein Fehler auf:"Abrechnungskonto nicht konfiguriert. Das externe Netzwerk ist nicht zugänglich und die Quoten sind stark eingeschränkt. Konfigurieren Sie das Abrechnungskonto, um diese Einschränkungen aufzuheben. "
Klicken Sie dazu im linken Menü auf "Bezahltes Konto" und wählen Sie "Flame" (25 USD pro Monat) oder "Blaze" (Pay as you use) unter den vorgeschlagenen Tarifplänen aus. Ich habe mich für die letzte Option entschieden, da sie mir im Rahmen der Entwicklung einer Testanwendung rentabler erschien.Erweitertes Szenario: Paginierung
In den meisten Fällen findet GIPHY bei einer Suchabfrage deutlich mehr als zehn GIFs, sodass der Benutzer das gesamte Suchergebnis sehen kann, d. H. Paginierung hinzufügen.
Bewegen Sie den Mauszeiger in der Dialogflow-Konsole über die Zelle "Suchabsicht". Rechts werden mehrere Schaltflächen angezeigt. Klicken Sie auf "Follow-up-Absicht hinzufügen". Auf diese Weise können wir nach der Suchabsicht einen Konversationszweig erstellen. Unter den Elementen der Dropdown-Liste wählen wir "mehr" - ein Standard-Ignorant, um die Anzeige zusätzlicher Informationen zu initiieren.
Abb. 10. Der Kontext der Absicht lautet "Suchabsicht - mehr".Gehen wir zur neu erstellten Absicht und nehmen Änderungen am Abschnitt "Kontext" vor. Da der Benutzer mehrmals hintereinander nach mehr GIFs fragen kann, sollte diese Absicht rekursiv aufgerufen werden können. Dafür ist es im ausgehenden Kontext erforderlich, dieselbe Zeile zu registrieren, die im eingehenden angezeigt wird (Abb. 10). Im Abschnitt "Vollständigkeit" sollten Sie auch die Einstellung "Webhook-Aufruf für diese Absicht aktivieren" aktivieren.
Kehren wir nun im Seitenmenü zu "Fillfulment" zurück, wo wir den Handler für "Search Intent - more" initialisieren. Wir fügen der
offset
Funktion auch den
offset
Parameter hinzu, der für die Paginierung in der GIPHY-API verwendet wird.
const SEARCH_RESULTS_MORE = [ ' !', ', .', ', . , .' ]; function search(conv, query, offset) {
Abb. 11. Paginierung bei der Suche nach Gifs.Ergebnis
Das Video der Aktion ist unten dargestellt.
Projektcode und Assistenten-Dump auf
Github verfügbar.
Anweisungen zum Installieren des Projekts und zum Importieren des Dumps- Gehen Sie zur Dialogflow-Konsole und erstellen Sie einen neuen Agenten oder wählen Sie einen vorhandenen aus.
- Klicken Sie auf das Einstellungssymbol, gehen Sie zum Abschnitt "Exportieren und Importieren" und klicken Sie auf die Schaltfläche "Aus ZIP wiederherstellen". Wählen Sie die ZIP-Datei aus dem Stammverzeichnis des Repositorys aus.
- Wählen Sie im linken Navigationsmenü die Option „Erfüllung“.
- Aktivieren Sie die Einstellung „Inline-Editor“.
- Kopieren Sie den Inhalt der Dateien aus dem
functions
auf die entsprechenden Registerkarten im Abschnitt „Erfüllung“. - Geben Sie Ihren GIPHY-API-Zugriffsschlüssel auf der Registerkarte index.js ein .
- Gehen Sie zur Firebase-Konsole und ändern Sie Ihren Plan in Flame oder Blaze. Die Arbeit mit Diensten von Drittanbietern über das Netzwerk ist mit einem kostenlosen Tarifplan nicht verfügbar.