Erstelle deine eigenen Chatbots

Einführung

Mann programmiert am computer
Quelle: Flickr © Glenn Carstens Peters

Wer nach meinem letzten Artikel Lust bekommen hat, sich mit der Technik hinter Chatbots zu beschäftigen, kann dies mit Hilfe des Microsoft Bot Frameworks tun. Die Firma aus Redmond stellt einem alles zur Verfügung, was für die Erstellung eines Bots notwendig ist. Es gibt ein SDK für .NET oder Node.js. Für Nutzer anderer Programmiersprachen gibt es als Alternative eine REST API. Das folgende Beispiel basiert auf JavaScript. Es zeigt die Umsetzung eines simplen Dialogs. Damit ist natürlich nur ein kleiner Teil der möglichen Funktionalitäten ausgeschöpft.

Setup

Als Voraussetzung für das Tutorial benötigen wir zunächst einmal die JavaScript Umgebung Node.js [1]. Beim Test kam die Version 7.2.1 zum Einsatz.

Mit dem Bot Framework Emulator lässt sich der fertige Bot auf dem eigenen Rechner testen. Den Emulator gibt es als Installationspaket von Microsoft [2] für Mac, Linux oder Windows.

Der Quellcode ist hier zu finden.

 

Starten des Chatbots

  1. Zunächst legen wir ein leeres Verzeichnis an. Das Verzeichnis initialisieren wir für ein Node Projekt. Wir führen im entsprechenden Ordner den folgenden Befehl aus:
    npm init
  2. Nun müssen wir den Microsoft Botbuilder und Restify installieren. Dies geschieht ganz bequem mit dem Node Package Manager (npm). Restify ist ein Node Framework zur Erstellung einer REST API. Diese benötigt der Bot zur Kommunikation.
    npm install --save botframework
    npm install --save restify
  3. Den Code für unseren Bot kopieren wir nun in das Verzeichnis. Wir starten den Bot mit diesem Aufruf:
    node app.js
  4. Läuft der Bot, erscheint folgende Ausgabe in der Konsole:
    restify listening to http://[::]:3978
  5. Zum Testen starten wir den Emulator. Der Bot horcht auf Port 3978 und der Route „/api/messages“. Der Emulator muss eine Verbindung zur URL „http://localhost:3978/api/messages“ aufbauen. Das Erreichen wir durch klicken auf das blaue Feld („Enter your endpoint URL“). Wir geben die URL ein und betätigen den Connect-Button. Ein Passwort ist hierbei nicht notwendig.
  6. Nachrichten, die wir im Emulator eingeben, gehen nun an unseren Bot. Dieser sendet nach Auswertung eine entsprechende Antwort. Um die Konversation zu starten, geben wir ein Einfaches „hallo“ ein und bestätigen mit der Return-Taste.

Erklärung des Codes

Das Programm bindet zunächst die notwendigen Bibliotheken ein und legt den Restify Server an. Diesen benötigt der Bot als Schnittstelle nach außen. Nun erzeugt es einen sogenannten „Connector“. Diesen gibt es in zwei Ausprägungen. Zum einen für die Konsole (ConsoleConnector), zum anderen für das Bot Framework bzw. den Emulator (ChatConnector). Wir benutzen letzteren.

var connector = new builder.ChatConnector({
    appId: process.env.MICROSOFT_APP_ID,
    appPassword: process.env.MICROSOFT_APP_PASSWORD
});

Um ID und Passwort brauchen wir uns nicht zu kümmern. Diese würde man im Produktiv-Betrieb in Umgebungsvariablen hinterlegen. Das Programm legt den Bot an und verbindet ihn mit dem erzeugten Connector. Der Server soll unserem Connector die Nachrichten unter der Route „/api/messages“ weitergeben.

var bot = new builder.UniversalBot(connector);
server.post('/api/messages', connector.listen());

Wichtiger Teil des Codes: Dialoge

Nach der Vorbereitung legt das Programm im zweiter Teil des Codes sogenannte Dialoge an. Diese sind für das Empfangen, Verarbeiten und Senden von Nachrichten verantwortlich. Jeder bildet einen Teil der kompletten Unterhaltung. Ein aktiver Dialog wird auf den Stack des Programmes gelegt. Jeder Dialog kann auch selbst einen anderen aufrufen. Nach Ablauf geht die Kontrolle wieder zurück an den aufrufenden Dialog. In unserem Programm gibt es sechs Dialoge:

  • Einstieg (‚/‘)
  • Erfragung des Benutzernamens (‚/profile‘)
  • Simple Frage (‚/whoami‘)
  • Bild von Hund oder Katze (‚/showcat‘)
  • Musikempfehlung (‚/music‘)
  • Verabschiedung (‚/goodbye‘)

Die Ausführung beginnt beim Einstieg. Unser Konsolenfenster gibt immer den aktiven Dialog des Bots aus. Ist der Nutzername nicht bekannt (session.userData.name), kommt ein neuer Dialog auf den Stack.

session.beginDialog('/profile');

Nun wird der Nutzername erfragt. Die Speicherung erfolgt im Objekt session.userData. Der Zugriff auf das Objekt ist über mehrere Unterhaltungen hinweg möglich.

builder.Prompts.text(session, "Hi, what's your name?");

Das Dialog-Ende wird durch eine Funktion gekennzeichnet. Hier verschwindet der Dialog wieder vom Stack. Das Programm geht an den Startpunkt des abgearbeiteten Dialogs. In unserem Fall ist das die zweite Funktion im Dialog „Einstieg“.

session.endDialog()

Im nächsten (‚/whoami‘) wird dem Nutzer eine einfache Frage gestellt. Die Auswertung der Antwort erfolgt mittels einer einfachen Regular Expression. Der Bot reagiert und eine neue Funktion nimmt den Dialog vom Stack und ersetzt ihn durch den nächsten.

session.replaceDialog('/showpic');

Definierte Antwortmöglichkeiten des Chatbots

Das Framework kann dem User eine Auswahl an definierten Antwortmöglichkeiten geben. Ist seine Antwort nicht unter den angebotenen Optionen, so kümmert sich das Framework um eine passende Rückmeldung.

builder.Prompts.choice(session, "Choose cats or dogs.", "cats|dogs", { listStyle: builder.ListStyle.none })

Zu beachten ist der Aufruf der kleinen Funktion „next“. Die Ausführung verhindert das Hängenbleiben des Dialoges in einer Schleife. Dieser geht sonst nach Festlegung der URL wieder an seinen Anfang zurück.

Als Letztes werfen wir noch einen schnellen Blick auf den Message Builder. Das Framework ermöglicht es, Bilder, Videos oder Karten an den User zu senden.

var msg = new builder.Message(session)...

Im Code wird dies einmal verwendet, um ein Bild zu senden. Beim zweiten Aufruf erhält der User eine Karte mit Informationen von Wikipedia.

Abschluss

Unser Bot bietet einen kleinen Einblick in die Möglichkeiten des Microsoft Bot Frameworks. In der Online-Dokumentation findet man viele weitere Beispiele und die komplette Beschreibung des API [3]. Ein Bot kann mit vielen verschiedenen Diensten (Microsoft nennt dies Channels) verbunden werden: Skype, Slack, Web Chat, E-Mail, um nur einige zu nennen. Für komplexe Bots bietet das Framework auch Natural Language Processing und künstliche Intelligenz.

Viel Spaß beim Ausprobieren!

 

[1] https://nodejs.org

[2] https://docs.botframework.com/en-us/tools/bot-framework-emulator

[3] https://docs.botframework.com/en-us

Daniel Frank
Letzte Artikel von Daniel Frank (Alle anzeigen)