Chatbots mit natürlicher Sprachverarbeitung (NLP)

Chatbots mit natürlicher Sprachverarbeitung (NLP)
16/10/2020

Sind Sie schon einmal in eine Situation geraten, in der Sie sich auf einer Webseite befinden, ohne eine benutzerfreundliche Oberfläche, dafür vollgestopft mit zu vielen Informationen? Sie aber suchen nach einem kleinen Stück Information, das irgendwo in der tiefsten Unterkategorie versteckt ist? Und müssen eine Menge irrelevanter Texte lesen, nur um die richtige Seite und den richtigen Abschnitt zu finden? Leider müssen manche Websites eine Unmenge an Informationen enthalten, aber die Art und Weise, wie Sie damit interagieren, kann vereinfacht werden.

Chatbots und Sprachassistenten spielen eine große Rolle bei der Vereinfachung der Kommunikation mit unseren Endgeräten. Es liegt in der menschlichen Natur, mit Hilfe der Stimme zu kommunizieren. Mit der Erweiterung der Künstlichen Intelligenz, insbesondere der Verarbeitung natürlicher Sprache, können Programmierer Chatbots erstellen, die die menschliche Sprache und den Kontext von Gesprächen verstehen können, um relevante Antworten zu geben. In diesem Artikel werde ich Ihnen zeigen, wie einfach es ist, einen NLP-basierten Chatbot zu trainieren und in Ihre Anwendung zu integrieren.

Was ist NLP und CUI? 🤨

Es gibt viele Bereiche der Künstlichen Intelligenz, aber in diesem Artikel werden wir uns ausschließlich mit der Verarbeitung natürlicher Sprache beschäftigen, da sie für intelligente Chatbots entscheidend ist und die Kommunikation mit ihnen dramatisch verbessert.

Per Definition:

Natürliche Sprachverarbeitung ist die Fähigkeit eines Computers, die gleiche Sprache zu verarbeiten, gesprochen oder geschrieben, die Menschen im normalen Diskurs verwenden.

Ein Conversational User Interface (CUI) ist eine digitale Schnittstelle, bei der eine Konversation als Hauptwerkzeug für die Interaktion mit einem Benutzer eingesetzt wird. Die CUI ist insofern *sozialer und natürlicher*, als der Benutzer "meldet", "fragt", "zustimmt" oder "nicht zustimmt" statt "navigiert" oder "blättert".

Warum brauchen wir NLP? 🤔

Wozu benötigen wir also Natural Language Processing in Chatbots? Um es einfach auszudrücken: NLP macht die Kommunikation für den Benutzer einfacher und natürlicher, und deshalb zieht es mehr Menschen an und macht die Technologie für Unternehmen und für Benutzer im Allgemeinen nützlicher und attraktiver. Die Rolle, die NLP bei der Implementierung von Chatbots spielt, ist in der folgenden Abbildung dargestellt.

Botanalytics, Who’s doing it best: The top 10 industries for chatbots, [cit. 2019-05-16]. https://botanalytics.co/blog/2017/07/11/top-10- industries-for-chatbots/.

Verschiedene Arten von Chatbots 🤖

Der Grundtyp der Chatbots ist ein Menü-/Button-basierter Chatbot. Dieser Chatbot basiert auf Entscheidungsbaum-Hierarchien, die dem Benutzer in Form von Buttons dargestellt werden. Der Benutzer muss mehrere Auswahlen treffen, indem er die Buttons auswählt, die zur Antwort führen. Diese Art von Chatbot eignet sich gut für die Beantwortung häufig gestellter Fragen und ist am einfachsten zu implementieren. Wenn die Szenarien komplexer werden und mehr Variablen enthalten und es schwieriger ist, vorherzusagen, wie der Benutzer reagieren wird, versagen diese Chatbots in der Regel.

Eine weitere, fortgeschrittene Art von Chatbots sind auf Schlüsselworterkennung basierende Chatbots. Der Hauptunterschied besteht darin, dass sie erkennen können, was Benutzer eingeben, die Schlüsselwörter identifizieren und auf der Grundlage dieser Eingabe eine angemessene Antwort geben können.

Kontextbezogene Chatbots sind aktuell am weitesten fortgeschritten. Neben der Verarbeitung natürlicher Sprache nutzen sie auch einen anderen Zweig der Künstlichen Intelligenz, der als Maschinelles Lernen (ML) bekannt ist. ML hilft dabei, sich an Unterhaltungen mit bestimmten Benutzern zu erinnern und aus diesen Unterhaltungen zu lernen, Daten zu sammeln und so mit der Zeit eine Verbesserung herbeizuführen. Gerade diese Funktion verbessert die Kommunikation mit einem Chatbot dramatisch, da sie die Gesprächszeit verkürzt und die Interaktion erleichtert, sobald der Bot beginnt, die Bedürfnisse der Benutzer zu verstehen.

Welche Werkzeuge stehen für NLP zur Verfügung 🔨 🔧 🔩

Es gibt einige Werkzeuge, die als Services geliefert werden und für die Arbeit mit Künstlicher Intelligenz einschließlich NLP zur Verfügung stehen. Die meisten von ihnen haben APIs für die Integration in Ihre Anwendung und eine Art Werkzeug, normalerweise eine Benutzeroberfläche, um die NLP-Instanz zu erstellen, zu trainieren und zu verwalten.

Die bekanntesten sind:

Alle diese Lösungen wären geeignet, aber in diesem Artikel möchte ich mich auf IBM Watson konzentrieren, weil es einen kostenlosen Lite-Plan, eine benutzerfreundliche Oberfläche und eine Menge SDKs beinhaltet. Mir erschien es auch einfacher und leichter, damit zu beginnen.

Wie man das NLP-Modell in IBM Watson trainiert

Nun wollen wir uns anschauen, wie wir den Assistenten trainieren und integrieren können. Werfen Sie zunächst einen Blick auf die High-Level-Architektur eines jeden Systems, das mit IBM Watson zusammenarbeitet.

IBM, Ibm cloud documentation, [cit. 2019-05-16]. https://cloud.ibm.com/docs

Wie Sie sehen, können Sie Watson in einige beliebte Messaging-Plattformen bzw. jede andere Anwendung integrieren, da IBM SDKs für viele Programmiersprachen (einschließlich JavaScript) anbietet. Dann verbindet sich Ihr Client mit Watson Assistant, einem IBM Cloud-Service, der wiederum eine Verbindung zu anderen IBM Services herstellt, um eine Reihe von Tools für die Chatbot-Erstellung bereitzustellen. Als Entwickler sollten Sie sich nur darum kümmern, sich mit dem Watson Assistant und dessen Endpoints zu verbinden. Dieser Prozess wird in der nächsten Session beschrieben. Konzentrieren wir uns nun darauf, eine Chatbot-Instanz zu erstellen und diese zu trainieren.

Bevor wir beginnen, möchte ich Ihnen die Schlüsselkomponenten eines IBM NLP-Chatbots vorstellen: intents, entities und dialogs.

Die Namen sind mehr oder weniger selbsterklärend, aber um Klarheit zu schaffen, hier ein paar Beispiele für intents:

  1. get_information_about_weather
  2. buy_a_smartphone
  3. write_an_article

Sie sind derjenige, der die Absichten (Intents) definiert, also können Sie diese benennen, wie Sie möchten. Aber Sie müssen Watson Beispiele geben, damit er lernen kann, welche Fragen mit gegebenen Absichten verbunden werden sollten. Zum Beispiel kann der Chatbot lernen, dass die Frage "Kann ich ein Smartphone kaufen?" zu der Absicht "buy_a_smartphone" führt. Die Idee ist, dass Sie mehr als ein Beispiel geben können, und wenn Sie genügend Beispiele definieren, lernt der Chatbot andere Fragen, die diese Absicht meinen könnten, automatisch zu erkennen.  

Die entities sind etwas einfacher. Die Beispiele für Entitäten sind: Laptop, Wetter, Monitor, Ikea.  

Sie können dem Chatbot beibringen, Synonyme von Laptop als Laptop zu erkennen, oder wenn jemand ein bestimmtes Wort falsch tippt, sollte Watson es trotzdem verstehen und es der richtigen "Entität" zuordnen.

Die dritte Schlüsselkomponente ist ein dialog. Der Dialog ist die Definition der Art und Weise, wie sich der Chatbot verhalten soll. Die Art und Weise, wie er reagieren soll, wenn er eine bestimmte Absicht oder/und Entität erkennt, und die Aktionen, die er nach Benutzereingaben ausführen soll.  

Folgende Schritte sollten sie durchführen, um eine Instanz des Watson-Assistenten zu erstellen:

  1. Sich in der der IBM-Cloud registrieren
  2. Finden Sie den Watson-Service über den Katalog → Watson-Assistent
  3. Wählen Sie einen Assistentenplan, geben Sie ihm einen Namen, wählen Sie eine Region usw. und klicken Sie auf Erstellen.  
  4. Sie werden auf die Watson-Assistentenseite weitergeleitet, wo Sie ein Tutorial über Anmeldeinformationen finden, das Sie später lesen können. Für den Moment klicken Sie einfach auf Watson-Assistent starten.
  5. Sie werden auf eine Seite weitergeleitet, auf der Sie einen Assistenten erstellen und trainieren (Fertigkeiten, Intents und Entitäten erstellen). Nachdem Sie dies zum ersten Mal getan haben, werden Sie ein Tutorial durchlaufen, in dem erklärt wird, was jeder Begriff genau bedeutet. Aber im Moment lässt sich wahrscheinlich alles anhand von Beispielen leicht verstehen:
  1. Klicken Sie auf Watson-Assistent starten (Sie sollten auf die unten gezeigte Seite weitergeleitet werden). Klicken Sie danach auf das Symbol, das ich markiert habe).
  1. Dort sehen Sie die Chatbot-Fähigkeiten. Klicken Sie auf die erste Fertigkeit oder erstellen Sie eine neue Fertigkeit, wenn diese noch nicht erstellt worden ist. Dazu klicken sie auf die Schaltfläche "Create skill".  
  2. Sobald Sie bei der Fertigkeit sind, sehen Sie Intents, Entitäten, Dialog und andere Optionen. Zuerst müssen Sie "Intents/Absichten" definieren. In dieser Demo habe ich zwei einfache Intents definiert: Der erste ist, dass der Benutzer einen Artikel an einen E-Shop zurückgeben möchte, aber die Bedingungen nicht kennt. Sobald er also etwas bezüglich der Rückgabe eines Artikels fragt (was bedeutet vom Vertrag zurückzutreten), wird der Bot dies als "#withdraw_from_contract"-Intention identifizieren. Die zweite ist nur eine "#whats_up" Absicht, so dass der Bot höflich antwortet, wenn jemand fragt, wie es ihm geht. Mal sehen, wie Sie das definieren. Er hat eine wirklich einfache Benutzeroberfläche. Sie brauchen nur die Absicht zu benennen und einige Eingabebeispiele zu formulieren. Die empfohlene Anzahl der Beispiele beträgt mehr als 5. Je mehr Beispiele Sie angeben, desto besser identifiziert er die Absicht.
  1. Als nächstes müssen Sie Entitäten definieren. Für das Beispiel ist lediglich notwendig, dass der Bot versteht, ob der Benutzer positiv oder negativ (ja oder nein) antwortet. Also habe ich die Entitäten @positive_answer und @negative_answer definiert. Sie können auch Synonyme hinzufügen, und Watson schlägt automatisch verschiedene Synonyme vor.
  1. Jetzt kann unser Chatbot erkennen, ob der Benutzer wissen möchte, ob es dem Chatbot gut geht, oder ob er einen Artikel im E-Shop zurückgeben möchte. Er kann auch eine positive und eine negative Antwort erkennen. Dies sollte ausreichen, um unseren ersten kleinen Dialog aufzubauen. So, dann geht es zum Abschnitt Dialog.  
  2. 11. Im Abschnitt Dialog können Sie Knoten und Unterknoten erstellen. Stellen Sie sich einen Knoten als einen Schritt im Dialog vor. Sie können sie neu anordnen, Unterknoten erstellen und definieren, wie der Bot von einem Knoten zum anderen springt. Lassen Sie mich Ihnen ein Beispiel geben. Wie Sie sehen, hat es eine Baumstruktur. Jeder Knoten soll aktiviert werden, wenn Benutzereingaben den Bedingungen dieses Knotens entsprechen (Bedingungen werden mit Intents und Entitäten definiert). Hier haben wir zum Beispiel einen "What's up"-Knoten, der aktiviert wird, wenn der Bot die Absicht "#what_is_up" erkennt. Andernfalls wird er ihn überspringen.

    Sobald Watson Eingaben erhält:
  • geht Watson den Baum von oben nach unten durch und überprüft jeden Knoten (ob er vordefinierte Bedingungen erfüllt).  
  • prüft Watson keine Unterknoten, wenn der Elternknoten die Bedingungen nicht erfüllt.  
  • sobald die Eingabe die Bedingung des Elternknotens erfüllt, reagiert der Elternknoten und wartet auf die Antwort  
  • Nachdem der Benutzer eine Antwort vom übergeordneten Knoten erhalten hat, der seinerseits auf die Antwort des Benutzers wartet, beginnt der Bot zuerst mit der Überprüfung der Kinderknoten dieses Knotens. Wenn die untergeordneten Knoten die Bedingungen nicht erfüllen, beginnt der Bot mit der Überprüfung von Anfang an.
  1. Erstellen Sie jetzt einen Knoten, oder öffnen Sie einen der vorhandenen Knoten. Es öffnet sich das Seitenfenster, in dem Sie den jeweiligen Schritt definieren.

Die Definition des Knotens sieht wie folgt aus: wenn der Assistent Ihre Bedingungen erkennt, antwortet der Assistent (eine Antwort) und dann sollte der Assistent entweder auf eine Antwort warten oder zu einem anderen angegebenen Knoten springen.

Lassen Sie uns nun einen "Try it"-Knopf benutzen und sehen, wie es funktioniert. Ich werde absichtlich versuchen, komplizierte Sätze zu verwenden, die ich nicht in Beispielen definiert habe.  

Wie Sie sehen können, hat er alles richtig verstanden, auch wenn ich es kompliziert formuliert habe.

Wie integrieren Sie es in Ihre Anwendung?

Ich werde Ihnen zeigen, wie man dies mit node.js durchführt, da es extrem einfach ist. Folgen Sie einfach diesen Schritten:

  1. Erstellen Sie eine Express-App  
  2. Installieren Sie Body-Parser und IBM Watson mit

{% c-block language="js" %}
npm install body-parser ibm-watson --save-dev
{% c-block-end %}

  1. Lassen Sie die Anwendung auf dem gewünschten Port (in unserem Fall 3.000) laufen.

{% c-block language="js" %}
   app.listen(3000, function () {
     console.log('Example app listening on port 3000!');
   });
{% c-block-end %}

  1. Importieren Sie AssistentV2 und IamAuthenticator

{% c-block language="js" %}
   const bodyParser = require('body-parser');
   /* parser for post requests */
   const AssistantV2 = require('ibm-watson/assistant/v2');
   /* watson sdk */
   const { IamAuthenticator } = require('ibm-watson/auth');
    app.use(bodyParser.json());
{% c-block-end %}

  1. Definieren Sie die Zugangsdaten, die Sie benötigen

{% c-block language="js" %}
   const credentials = {
     API_KEY: 'your_api_key',
     URL:  'https://api.eu-gb.assistant.watson.cloud.ibm.com',
     VERSION: '2019-02-28',
     ASSISTANT_ID: 'your_assisntant_id'
   }
{% c-block-end %}

  1. Authentifikator erstellen

{% c-block language="js" %}
   const authenticator = new IamAuthenticator({
     apikey: credentials.API_KEY
   })
{% c-block-end %}

  1. Assistenten erstellen

{% c-block language="js" %}
   const authenticator = new IamAuthenticator({
     apikey: credentials.API_KEY
   })
{% c-block-end %}

  1. Erstellen Sie eine GET-Methode, die eine Sitzung erstellt und Ihnen eine session_id zurückgibt.

{% c-block language="js" %}
   app.get('/session_id', function (req, res) {
     assistant.createSession(
       {
         assistantId: credentials.ASSISTANT_ID,
       },
         function(error, response) {
           if (error) {
             return res.send(error);
           } else {
             return res.send(response);
           }
         }
       );
     })
{% c-block-end %}

  1. Erstellen Sie eine POST-Methode, die eine Nachricht an IBM Watson sendet und Ihnen ein Objekt mit der Antwort zurückgibt. Stellen Sie sicher, dass Sie sessionId und message zum Anfragetext hinzufügen.

{% c-block language="js" %}
   app.post('/message', function (req, res) {
     if (!req.body.sessionId || !req.body.message) {
       res.status(400).send("bad request")
     }
     var payload = {
       assistantId: credentials.ASSISTANT_ID,
       sessionId: req.body.sessionId,
       input: {
         message_type : 'text',
         text : req.body.message
       }
     };    
     assistant.message(payload, function(err, data) {
       if (err) {
         return res.status(err.code || 500).json(err)
       }
       return res.json(data)
     })
   })
{% c-block-end %}

Und das war's! Jetzt sind Sie in der Lage, sich über Ihre Anwendung mit Ihrer Chatbot-Engine zu verbinden!  

Zuerst müssen Sie eine Session-ID über den  Endpoint /session_id erhalten, und dann diese session_id verwenden, wenn Sie eine Nachricht über den Endpoint /message senden!

Schauen wir uns an, wie es im Postman funktioniert. Ich sende eine POST-Anforderung an den Endpunkt /message mit 'sessionId' und 'message' im Hauptteil und die Antwort lautet:

In der Antwort erhalten Sie alle Informationen, die Sie benötigen. Sie erhalten die Intents und Entitäten, die Watson erkannt hat (mit einem Vertrauenswert), und Sie erhalten die Antwort, die in einem bestimmten Knoten definiert wurde. Jetzt können Sie als Entwickler mit diesen Informationen tun, was immer Sie wollen. Sie können den Benutzer umleiten, den Inhalt Ihrer Seite ändern oder einfach nur die Antwort anzeigen.    

In diesem Beispiel würde ich auf die positive oder negative Antwort warten, dem Benutzer eine relevante Antwort geben und ihn auf den richtigen Abschnitt der Seite mit den allgemeinen Geschäftsbedingungen umleiten.  

Die Beispiele, die ich hier gezeigt habe, sind recht primitiv, aber ihr Hauptzweck bestand darin zu zeigen, wie der intelligente Assistent funktioniert. Sobald Sie eine Menge verschiedener Intentionen, Entitäten und Dialogpfade erstellen, kann dieser Bot Ihnen als Ersatz für jede Art von Kundenbetreuung oder einfach nur als coole Funktion dienen. Und falls er die Antwort nicht weiß, kann er den Benutzer zu einem echten Menschen umleiten.

Ich hoffe, dass ich Ihnen zeigen konnte, wie einfach dies möglich ist und dass die Verwendung mehrerer Arten von Künstlicher Intelligenz in Ihrer Anwendung keine speziellen Kenntnisse erfordert.  

Was denken Sie darüber? Hinterlassen Sie mir eine Nachricht über das Kontaktformular! 😃

Teilen:
Boris ist ein Junior-Webanwendungsentwickler, der hauptsächlich mit JavaScript/TypeScript, React und MobX arbeitet. Er hat den Kopf voller aktuellem Wissen und ist bestrebt, dies täglich anzuwenden. Beim Programmieren schätzt er die Kombination von Kreativität und Technologie und die Möglichkeit, die Ergebnisse seiner Arbeit sofort zu sehen. Er spielt gerne Tennis und verbringt Zeit mit Freunden.

Article collaborators

SABO Mobile IT

Für unsere Kunden aus der Industrie entwickeln wir spezialisierte Software zur Umsetzung von Industry 4.0. IoT, Machine Learning und Künstliche Intelligenz ermöglichen uns, signifikante Effizienzsteigerungen bei unseren Kunden zu erzielen.
Über uns