So erstellen Sie einen Movie Bot mit SAP Conversational AI und NodeJS

Erhalten Sie Filmempfehlungen aus der Filmdatenbank, indem Sie Ihren eigenen Chatbot im Facebook Messenger fragen.

Am Ende dieses Tutorials werden Sie in der Lage sein, einen voll funktionsfähigen Film-Bot zu erstellen, mit dem Sie Filmempfehlungen basierend auf mehreren Kriterien erstellen können. Wir verwenden SAP Conversational AI Bot Building Platform (hier kostenlos registrieren) und The Movie Database, um Informationen zu Filmen zu erhalten.

Hier ist ein Demo-Chat mit Movie Bot:

Was bauen wir heute?

Die Interaktion mit APIs von Drittanbietern ermöglicht viel interessantere Anwendungsfälle als einfache Q / A-Chatbots. Mit Bot Skills haben wir die Option hinzugefügt, Webhooks direkt vom Builder aufzurufen, was es noch einfacher macht.

Der heutige Bot erfordert mehrere Schritte:

  1. Schlüsselinformationen in einem Satz extrahieren
  2. Aufbau des Bot-Flows (Trigger, Anforderungen, Aktionen)
  3. Erstellen und Verbinden einer Bot-API, mit der Daten aus der Filmdatenbank abgerufen werden können

Zum Testen benötigen Sie ein SAP Conversational AI-Konto, Node.JS und möglicherweise Ngrok.

Bevor wir loslegen, überprüfen Sie stattdessen diese Anleitung, wenn Sie eine Anleitung suchen, in der die Erstellung Ihres ersten Bots detailliert beschrieben wird.

Lasst uns anfangen!

Schritt 1: Schlüsselinformationen aus einem Satz extrahieren

Absichten sind hilfreich, um die Gesamtbedeutung eines Satzes zu bestimmen. Für unseren Anwendungsfall reicht es nicht aus, zu wissen, dass der Benutzer etwas sehen möchte.

Wir müssen wissen, was die Benutzer sehen wollen.

Entitäten sollen dieses Problem lösen: Sie extrahieren wichtige Informationen in einem Satz.

Absichten lassen Sie verstehen, dass Sie etwas tun müssen. Entitäten helfen Ihnen dabei, tatsächlich etwas zu tun.

Stellen Sie sich vor, Sie sind ein Telekommunikationsunternehmen, das Telefon- und Internetzugang bietet. Ihr Bot hat eine Absicht, die versteht, wenn sich Leute über einen Ausfall beschweren:

Die extrahierten Entitäten helfen zu verstehen, was wo und seit wann schief läuft.

Für unseren Movie-Bot werden wir versuchen, drei wichtige Informationen zu extrahieren:

  1. Was der Benutzer sehen möchte (ein Film gegen eine Fernsehsendung)
  2. Nach welchem ​​Genre suchen sie?
  3. In welcher Sprache

Verwenden von Goldentitäten

Um Ihre Entwicklung zu beschleunigen, extrahiert SAP Conversational AI standardmäßig mehrere Entitäten: Daten, Standorte, Telefonnummern ...

Eine vollständige Liste finden Sie hier.

Die Sprachentität wird hilfreich sein:

Gold Entities - Sprache

Sehen Sie den kleinen Stern neben dem Namen der Entität? Es unterscheidet eine Goldentität von einer benutzerdefinierten.

Wir werden es verwenden, um unsere dritte Anforderung zu erfüllen: die Filmsprache.

Angepasste Entitäten erstellen

Wir erstellen benutzerdefinierte Entitäten, um die benötigten Informationen zu extrahieren. Wie bei Absichten ist Training sehr wichtig: Je mehr Beispiele Sie Ihrem Bot hinzufügen, desto genauer wird es.

Das Training Ihrer Entitäten kann durch mehrere Absichten geschehen. Entitäten sind unabhängig von Absichten.

Für unseren Movie Bot benötigen wir nur eine Absicht, eine Entdeckung und zwei Entitäten:

  • Aufzeichnung, um zu identifizieren, dass der Benutzer einen Film oder eine Fernsehsendung ansehen möchte
  • Genre

Öffnen Sie die Absicht, und fügen Sie Ausdrücke hinzu. Stellen Sie sicher, dass Sie alle Möglichkeiten abdecken. Dies bedeutet eine gesunde Mischung von Ausdrücken mit:

  • Überhaupt keine Entitäten: „Mein Freund möchte heute Abend etwas sehen“
  • Eine Entität: "Ich möchte einen Film sehen"
  • Viele Entitäten: "Kannst du mir ein paar französische Drama-TV-Shows empfehlen?"

Um Ihre Ausdrücke zu markieren, wählen Sie den zu markierenden Text aus und geben Sie den Namen Ihrer Entität ein:

Markieren von benutzerdefinierten Entitäten

Sie sollten viele weitere Beispiele hinzufügen: 15 wären nett, aber ein produktionsbereiter Bot würde mindestens 50 Beispiele erfordern, um eine gute Leistung zu erzielen. Um den Vorgang zu beschleunigen, können Sie die in diesem Bot erstellten Entitäten [Aufnahmeentität, Genreentität] und dann die Erkennungsabsicht dieses Bots aufteilen.

Sie können hier sehen, dass „Französisch“ als Staatsangehörigkeit und nicht als Sprache erkannt wurde, da dies in diesem Zusammenhang der Fall ist. Beim Erstellen des Bot-Flows stellen wir sicher, dass diese beiden Entitäten überprüft werden.

Hinzufügen von benutzerdefinierten Anreicherungen

Jetzt, wo wir unsere Entitäten beschriftet haben, werden wir sie bereichern! Öffnen Sie das Entitätenbedienfeld auf Ihrem Bot unter der Registerkarte "Training" (siehe unten):

Bereich

Öffnen wir nun das Genre-Objekt. Wenn Sie in der oberen rechten Ecke des Panels nachsehen, sollte ein Umschalter mit der Aufschrift "Frei" und "Einstellungen" angezeigt werden. Öffnen Sie es, damit wir Ihnen die verschiedenen Optionen, auf die Sie Zugriff haben, detailliert erläutern können:

Objektbereich

Innerhalb des Entitätsfensters haben Sie Zugriff auf verschiedene Optionen für Ihre Entität:

  • Frei gegen Eingeschränkt - Eine freie benutzerdefinierte Entität wird verwendet, wenn Sie keine strenge Werteliste haben und möchten, dass das maschinelle Lernen alle möglichen Werte erkennt. Während eine eingeschränkte benutzerdefinierte Entität verwendet wird, wenn Sie eine strenge Liste von Wörtern zur Erkennung haben und keine automatische Erkennung der Entität benötigen.
  • Fuzzy-Matching - Fuzzy-Matching ist ein Index zwischen 0 und 1, der angibt, wie nah ein Wort von dem in Ihrer Entitätsliste der Werte sein kann. Befindet sich das Wort über diesem Index, markiert die Plattform ihn als den nächstgelegenen Wert in Ihrer Liste.
  • Werteliste - Hier können Sie alle Wertelisten Ihrer Entität hinzufügen, bei denen es sich um unterschiedliche Werte oder Synonyme handeln kann

Ausführlichere Informationen zu Entitäten finden Sie in unserer ausführlichen Dokumentation.

In unserem Fall wird unsere Genre-Entität eingeschränkt, da die Movie-Datenbank-API nur eine bestimmte Liste von Genres verwaltet. Hier ist die Liste unten:

[
{id: 28, name: 'Aktion'},
{id: 12, name: 'Abenteuer'},
{id: 16, name: 'Animation'},
{id: 35, name: 'Comedy'},
{id: 80, name: 'Crime'},
{id: 99, name: 'Documentary'},
{id: 18, name: 'Drama'},
{id: 10751, name: 'Familie'},
{id: 14, name: 'Fantasy'},
{id: 36, name: 'Verlauf'},
{id: 27, name: 'Horror'},
{id: 10402, name: 'Musik'},
{id: 9648, name: 'Mystery'},
{id: 10749, name: 'Romance'},
{id: 878, name: 'Science Fiction'},
{id: 53, name: 'Thriller'},
{id: 10752, name: 'Krieg'},
{id: 37, name: 'Western'}
]

Fügen Sie all die verschiedenen Genres zu unserer Werteliste hinzu. Vergessen Sie nicht, auch Synonyme wie SF, Science-Fiction für Science-Fiction, Romantik für Romantik oder Zeichentrick für Zeichentrick hinzuzufügen. Sie können die Liste der Werte von dort abrufen.

Wie Sie dem obigen JSON entnehmen können, sind den Genres IDs zugeordnet. Der Grund dafür ist, dass die Filmdatenbank nicht anhand ihres englischen Namens nach einem bestimmten Genre suchen kann, sondern anhand einer benutzerdefinierten Nummer. Wir können für jeden Genre-Wert eine bestimmte ID zuordnen, die in der JSON der NLP-API zurückgegeben wird. Wir können es an die Movie Database API weiterleiten. Dies ist der Zweck von benutzerdefinierten Anreicherungen. Immer wenn eine Entität erkannt wird, wird der von der NLP-API zurückgegebene JSON-Code mit zusätzlichen Informationen zur Entität angereichert.

Innerhalb des benutzerdefinierten Anreicherungsfensters müssen drei Schlüssel erstellt werden:

  • name - um Synonyme unter demselben Wert abzubilden
  • id - um mit der ID der Filmdatenbank anzureichern
  • article - um den Artikel des Genres hinzuzufügen (wir werden ihn später verwenden)

Um eine benutzerdefinierte Bereicherung hinzuzufügen, klicken Sie auf Neuen Schlüssel hinzufügen und fügen Sie die drei oben aufgeführten Schlüssel hinzu. Setzen Sie für den Artikel den Standardschlüsselwert auf "a", da die meisten Genres mit "a" übereinstimmen würden. Innerhalb des Namens können Sie beginnen, die spezifische Bereicherung hinzuzufügen und sie den verschiedenen Werten für Ihren Artikel, Ihre ID und Ihren Namen wie folgt zuordnen:

Kundenspezifische NamensanreicherungenBenutzerdefinierte Anreicherungen für IDsKundenspezifische Ergänzungen für Artikel

Auf dieser Seite können Sie die gesamte Entität aufteilen, einschließlich der Anreicherung. Nachdem dies erledigt ist, testen wir es in der Testkonsole. Wenn Sie den Satz "Ich möchte einen Animationsfilm ansehen" senden, sollten Sie jetzt die folgende benutzerdefinierte Bereicherung sehen:

"Genre": [
      {
        "Wert": "animiert",
        "roh": "animiert",
        "Vertrauen": 0,99,
        "name": "animation",
        "id": 16,
        "article": "an"
      }

Großartig, jetzt gibt uns unsere Bereicherung den generischen Namen, die ID und den Artikel! Machen wir dasselbe für die Aufnahmeeinheit. Gehen Sie zurück zum Entitätenbedienfeld und klicken Sie auf Aufnahme. Machen Sie es dann eingeschränkt und fügen Sie alle möglichen Werte und Synonyme für TV-Sendungen und Filme hinzu (z. B. TV-Sendungen, Shows, Filme, Filme, Filme usw.). Sehen Sie die gesamte Liste hier. Gehen Sie nun zu benutzerdefinierten Anreicherungen, fügen Sie den Schlüsseltyp hinzu und fügen Sie zwei spezifische Werte hinzu:

  • Film - für alle Filme Synonyme
  • tv - für alle Fernsehsendungen Synonyme

Es sollte so aussehen:

Benutzerdefinierte Anreicherungen für Typ

Wenn wir unseren Satz "Ich möchte einen Animationsfilm sehen" zurückschicken, haben wir jetzt auch die Bereicherung für die Aufnahme:

"Aufzeichnung": [
      {
        "Wert": "Film",
        "raw": "movie",
        "Vertrauen": 0,99,
        "Typ": "Film"
      }
    ]

Schritt 2: Bauen Sie Ihren Bot Flow auf

Da wir nur sicherstellen müssen, dass alle unsere Kriterien erfüllt sind, bevor wir eine Node.JS-API aufrufen, ist der Build-Teil recht einfach.

Wir brauchen nur eine Fertigkeit, nennen wir sie "entdecken".

Ein Beispiel für eine konfigurierte Fähigkeit finden Sie hier.

Löst aus

Wir möchten diesen Skill auslösen, wenn die Absicht @discover vorliegt:

Nachricht wird ausgelöst

Auf dieser Registerkarte können Sie Daten erfassen, bevor Sie zu Aktionen wechseln. Wir möchten sicherstellen, dass der Benutzer eine Aufnahme, ein Genre, eine Sprache und eine Ja- oder Nein-Absicht angibt, bevor er fortfährt:

Bedarf

Die Anforderungen werden einzeln geprüft. Sie können alle in der ersten Nachricht erfüllt werden. Wenn der Benutzer zum Beispiel sagt, ich möchte einen Krimi auf Englisch sehen, werden die Aktionen sofort ausgelöst.

Für jede Anforderung können Sie festlegen, ob eine Nachricht gesendet werden soll, wenn sie vollständig ist oder fehlt.

Das Senden von Nachrichten, wenn eine Anforderung erfüllt ist, kann Ihren Bot lebendiger machen: Ein Krimi? Ich liebe sie auch !, aber sie sind fast obligatorisch, wenn die Anforderung fehlt: Sie müssen Ihre Benutzer bitten, das zu füllen, was Sie wissen müssen.

Zum Beispiel sende ich schnelle Antworten mit vorgeschlagenen Genres, wenn #genre fehlt:

Bedingte Nachricht, wenn eine Anforderung fehlt

Zur Bestätigung verwenden wir den Speicher, um eine dynamische Nachricht anzuzeigen, um die Auswahl des Benutzers mit @yes und @ no intent zu bestätigen:

Speicher für dynamische Nachrichten verwenden

Nachdem Sie Fragen für die 4 Gruppen von Entitäten eingerichtet haben, wechseln Sie zur Registerkarte Aktionen.

Aktionen

Sobald die Anforderungen erfüllt sind, möchten wir unsere API aufrufen, um die Suche tatsächlich durchzuführen, wenn der Benutzer mit Ja geantwortet hat. Andernfalls setzen wir den Speicher zurück und fragen erneut, was der Benutzer sehen möchte.

Wenn _memory.no vorhanden ist, setzen Sie den gesamten Speicher zurück und senden Sie eine Nachricht wie "Fangen wir erneut an, was möchten Sie sehen?"

Wenn _memory.yes vorhanden ist, erstellen Sie eine CALL WEHBOOK-Aktion. Sie können entweder eine vollständige URL (z. B. https://meinedomainname.com/discover-movies) oder eine relative URL (/ discover-movies) eingeben. SAP Conversational AI verwendet den Parameter Bot-Basis-URL in Ihren Bot-Einstellungen, wenn Sie eine relative URL eingeben.

Fügen Sie anschließend eine Aktion UPDATE CONVERSATION> EDIT MEMORY> RESET ALL MEMORY hinzu, um den Speicher zu leeren, nachdem der Anruf getätigt wurde.

Aktionen

Wenn Sie keinen öffentlichen Server haben oder Ihren Bot während der Entwicklung testen möchten, ist ngrok ein sehr nützliches Tool. Es erstellt eine öffentliche URL für Sie und leitet Anfragen an Ihren Computer weiter.

Sobald Sie es installiert haben, führen Sie es aus

ngrok http 5000

Kopieren Sie die Weiterleitungs-URL in HTTPS (https://XXX.ngrok.io) in Ihre Bot-Einstellungen (Feld "Bot-Webhook-Basis-URL"). Alle Anfragen an diese URL werden an den Port 5000 Ihres Computers weitergeleitet.

Alles, was Ihr Bot jetzt braucht, ist seine API, um Ihre Filme zu bekommen!

Schritt 3: Erstellen der Movie Bot-API

Der NodeJS-Teil dieses Bots ist recht einfach: Er verhält sich als HTTP-Proxy zwischen SAP Conversational AI und The Movie Database.

Wenn Ihre Anwendung eine Anfrage von SAP Conversational AI erhält, sendet sie eine Suchabfrage mit den Kriterien Ihres Benutzers an die Movie Database und formatiert die JSON-Antwort in das SAP Conversational AI-Nachrichtenformat.

Bot API Diagramm

Option 1: der automatische Weg

Sie können das gesamte Projekt direkt aus unserem Git-Repository klonen: https://github.com/plieb/movie-bot-skills-training

Option 2: der manuelle Weg

Schritt 1 - Gerüste deines Projekts

mkdir movie-bot & cd movie-bot
npm init
npm install --save express body-parser axios
Tippen Sie auf index.js config.js
mkdir discover-movies & cd discover-movies
Berühren Sie index.js movieApi.js
CD..

Schritt 2 - Abrufen eines TMDb-API-Tokens

Sie benötigen ein Token, um die Movie Database API zu verwenden. Gehen Sie hier, um ein Token zu generieren und bearbeiten Sie Ihre Datei config.js:

module.exports = {MOVIEDB_TOKEN: process.env.MOVIEDB_TOKEN || 'PURYOURTOKENHERE', PORT: process.env.PORT || 5000,};

Schritt 3 - Füllen Sie Ihre index.js mit einer Express-Anwendung
 
Erstellen Sie eine Express-Anwendung, um die Anforderungen von SAP Conversational AI zu verarbeiten. Um unser Projekt besser zu organisieren, haben wir, wie in Schritt 1 zu sehen, einen Ordner / discover-movies /, der den Kern unseres Bot-Codes enthält (anstatt alle unsere Dateien in demselben Ordner abzulegen), und wir rufen ihn über loadMovieRoute auf.

const express = require ('express');
const bodyParser = require ('body-parser');

const config = require ('./ config');
const loadMovieRoute = require ('./ discover-movies');

const app = express ();
app.use (bodyParser.json ());

loadMovieRoute (App);

app.post ('/ errors', function (req, res) {
  console.log (req.body);
  res.sendStatus (200);
});

const port = config.PORT;
app.listen (port, function () {
  console.log (`App lauscht auf Port $ {port}`);
});

Schritt 4 - Discovery-Movies / Index.js füllen

Wir bitten SAP Conversational AI, eine POST-Anfrage an / discover-movies zu senden, wenn ein Benutzer seine Suchkriterien erfüllt hat.

Das Hauptziel unseres Controllers ist es, die Einstellungen aus dem Speicher auszuwählen und zu formatieren, um sie an die API der Filmdatenbank zu senden:

const config = require ('../ config'); const {discoverMovie} = require ('./ movieApi'); Funktion loadMovieRoute (app) {app.post ('/ discover-movies', Funktion (req, res) {console.log ('[GET] / discover-movies'); const kind = req.body.conversation.memory [ 'aufnahme']. type; const genre = req.body.conversation.memory ['genre']. id; const language = req.body.conversation.memory ['language']; const nationalität = req.body.conversation. memory ['nationality']; const isoCode = language? language.short.toLowerCase (): nationality.short.toLowerCase (); return discoverMovie (kind, genreId, isoCode) .then (function (carouselle) {res.json ({ Antworten: Karussell, Konversation: {}});}) .catch (function (err) {console.error ('movieApi :: discoverMovie error:', err);});}); } module.exports = loadMovieRoute;

Schritt 5 - Füllen von "discover-movies / movieApi.js"

Nachdem wir alle Filter der Anfrage extrahiert und formatiert haben, müssen wir die Anfrage an die Filmdatenbank senden und die Antwort formatieren:

const axios = require ('axios');
const config = require ('../ config');

Funktion discoverMovie (Art, GenreId, Sprache) {
  Geben Sie moviedbApiCall (kind, genreId, language) zurück .then (response =>
    apiResultToCarousselle (response.data.results)
  );
}

Funktion moviedbApiCall (Art, GenreId, Sprache) {
  Geben Sie axios.get (https://api.themoviedb.org/3/discover/$ {kind} `, {zurück.
    params: {
      api_key: config.MOVIEDB_TOKEN,
      sort_by: 'popularität.desc',
      include_adult: false,
      with_genres: genreId,
      mit_ursprünglicher_sprache: sprache,
    },
  });
}

Funktion apiResultToCarousselle (Ergebnisse) {
  if (results.length === 0) {
    Rückkehr [
      {
        Typ: "quickReplies",
        Inhalt: {
          titel: 'Entschuldigung, aber ich konnte kein Ergebnis für Ihre Anfrage finden :(',
          Schaltflächen: [{title: 'Neu beginnen', value: 'Neu beginnen'}],
        },
      },
    ];
  }

  const cards = results.slice (0, 10) .map (e => ({
    Titel: e.title || e.name,
    Untertitel: e.overview,
    imageUrl: `https://image.tmdb.org/t/p/w600_and_h900_bestv2$ {e.poster_path}`,
    Tasten: [
      {
        Typ: "web_url",
        value: `https://www.themoviedb.org/movie/$ {e.id}`,
        titel: 'Mehr anzeigen',
      },
    ],
  }));

  Rückkehr [
    {
      Text eingeben',
      Inhalt: "Hier ist was ich für dich gefunden habe!",
    },
    {Typ: 'Karussell', Inhalt: Karten},
  ];
}

module.exports = {
  discoverMovie,
};

Schritt 6 - Starten Sie den Motor!

Das ist alles! Sie können Ihren Bot jetzt testen.

Starten Sie Ihre Anwendung, indem Sie Folgendes ausführen: node index.js

Wenn alles in Ordnung ist, sollten Sie sehen: Die App wurde auf Port 5000 gestartet

Filmempfehlungen, Wetter, Gesundheit, Verkehr ... Mit APIs von Drittanbietern ist alles möglich! Nachdem Sie mit dem Workflow vertraut sind, können wir es kaum erwarten, von Ihnen zu hören, was Sie gerade erstellen. Und denken Sie daran, Sie können uns gerne kontaktieren, wenn Sie Hilfe benötigen. Nutzen Sie dazu den Kommentarbereich unten oder nutzen Sie Slack.

Ursprünglich im SAP Conversational AI-Blog veröffentlicht.