Facebook-Bots mit Dialogflow
Beim letzten Treffen der Meetup-Reihe innovation:now hat uns innFactory Mitgründer Anton Spöck den Facebook-Bot innMensa vorgestellt. Wer nicht beim Meetup dabei war, für den gibt es hier eine kleine Zusammenfassung: https://innfactory.de/news/meetup-zum-thema-machine-learning-sprachtechnologien/
Die Aufgabe dieses Chatbots ist denkbar einfach und liefert dennoch relevantes Wissen für jeden Studenten. Der Bot ist in den Facebook Messenger integriert und liefert auf Anfrage Informationen dazu was es in der Mensa, der FH Rosenheim zu essen gibt. Anhand dieses Anwendungsfalls soll im Folgenden gezeigt werden, wie ein Chatbot mit Dialogflow erzeugt werden kann. Dialogflow ist eine Tochterfirma von Alphabet (Google) und bietet Werkzeuge um Sprache zu analysieren und zu verwerten.
Beginnen wir zunächst bei der Benutzereingabe, welche die Absicht des Nutzers enthält. Diese Absicht wiederum zu verstehen ist elementar, um eine passende Antwort formulieren zu können. Dialogflow bietet hierfür so genannte „Intents“.
Ein Intent besteht unter anderem aus Beispielsätzen und -wörtern, die Dialogflow dazu dienen die Absicht des Benutzers zu ermitteln. Je mehr Beispielsätze man zur Verfügung stellt, desto größer die Wahrscheinlichkeit, dass Dialogflow die Eingabe eines Nutzers richtig zuweisen kann.
In der Abbildung sind vier Beispiele gezeigt, anhand derer die Absicht eines Nutzers erkannt werden soll, der wissen möchte, was es an einem bestimmten Tag zu essen gibt.
Markiert sind hierbei Wörter, die einen bestimmten Zeitpunkt implizieren. Damit kommen wir zum nächsten Bestandteil eines Intents: den Parametern.
Absichten brauchen unter Umständen Parameter für eine korrekte Beantwortung. In unserem Fall ist das Datum ein relevanter Parameter, um zuordnen zu können, für welchen Tag ein Nutzer den Speiseplan erfahren möchte. Dieser Parameter ist in unserem Beispiel zwingend notwendig, was in Dialogflow mittels der Checkbox „Required“ festgelegt werden kann.
Für den Fall, dass zwar die Absicht, aber kein Datum erkannt wird, bietet Dialogflow die Möglichkeit, dem Nutzer Rückfragen zu stellen. In der zweiten Abbildung als „Prompts“ gekennzeichnet.
Jedes Wort, das für ein Datum steht, wird mit der Systementität „@sys.date“ gekennzeichnet. Dialogflow übernimmt dann die korrekte Übersetzung in das entsprechende Datum. Zusätzlich können Entitäten auch selbst angelegt werden.
An dieser Stelle ein kleiner Zwischenstand:
Bisher erkennt der Bot, wenn er nach dem Speiseplan gefragt wird und ordnet dieser Anfrage ein Datum zu.
Doch wie findet der Bot heraus was es an diesem Datum zu essen gibt?
An dieser Stelle benötigt Dialogflow etwas Unterstützung durch weitere Funktionalität. Diese lässt sich mit überschaubarem Aufwand einbringen, da Dialogflow Anforderungen an einen Webhook übermitteln und dessen Antworten empfangen kann.
Für den innMensa Bot wird eine AWS-Lambda-Funktion verwendet. Diese bekommt in einer http-Anfrage den Namen des Intents sowie das dazugehörige Datum übermittelt. Innerhalb der Lambda-Funktion wird dann mittels des Datums eine Anfrage an die OpenMensa API gestellt, die wie folgt aussehen kann:
Die Anfrage liefert als Ergebnis alle Gerichte im JSON-Format. Im Bild findet sich ein Teilausschnitt der Antwort zur Anfrage.
Nach dem Aufbereiten der Antwort erhält Dialogflow diese per http-Response und kann sie dann an den Nutzer weiterleiten.
Zuletzt bleibt nur noch zu klären, wie die Kommunikation zwischen Facebook und Dialogflow funktioniert. Dialogflow bietet dazu für einige Dienste, unter anderem den Facebook Messenger, einfache Integrationsmöglichkeiten und ausführliche Anleitungen an. Nähere Infos dazu: https://dialogflow.com/docs/integrations/facebook
Zum Abschluss nochmal der komplette Ablauf in einer Grafik zusammengefasst: