Codieren einer Chatbot-Builder-Plattform, Teil 1: So erstellen Sie einen dummen Chatbot

Wie ich mich der Herausforderung gestellt habe, programmgesteuert „Gespräche“ zu führen.

Letzte Woche habe ich beschlossen, eine Bot Builder-Anwendung zu erstellen. Das Ziel war (und ist es auch weiterhin, da das Projekt nächste Woche fertig sein wird), eine App zu erstellen, die Benutzern aller Ebenen als Plattform dient, um einfache Chatbots zu erstellen und sie auf meiner Website zu hosten. In diesem zweiteiligen Blog-Beitrag werde ich auf meinen Prozess und einige wertvolle Quellen für den Aufbau einer Plattform für Bots eingehen - zuerst dumme, dann Feature für Feature intelligentere. (Wenn ich dumm schreibe, meine ich nicht lahm oder schlecht. Meine Chatbots sind cool, aber alles andere als intelligent.)

Was macht einen minimalen Chatbot aus?

Um die richtige Antwort auf eine Nachricht zu finden, werden so viele Überprüfungen wie möglich durchgeführt, bevor schließlich die Ersatzantwort angeboten wird: "Ich verstehe nicht". Ich habe mich für diesen Ansatz entschieden, um meinen Chatbot zu erstellen. Auf diese Weise kann ich meinem minimalen Chatbot weitere Ebenen hinzufügen, in denen angegeben wird, dass die Nachricht mit diesem Teil des Stoffes übereinstimmt, den mein Bot kennt. Hier waren meine ersten Ziele:

  1. Benutzer können eigene Dialoge erstellen. Ein Benutzer kann "Auslöser" hinzufügen, dh Wörter oder Sätze, auf die sein Bot reagiert. Sie können beliebig viele verschiedene Antworten angeben. Wenn der Bot in der Lage ist, eine empfangene Nachricht den Auslösern zuzuordnen, wählt er eine zufällige Antwort. Dies bildet die "Skripte" jedes Bots.
  2. Bots können allgemeine Skripte (z. B. Begrüßungen und Antworten auf häufig gestellte Fragen) und "Ich verstehe nicht" -Antworten anbieten, wenn der Benutzer sie einbezieht
  3. Bots sollten in der Lage sein, zu verstehen, was der Benutzer ihnen sagt, auch wenn es nicht genau mit bekannten Triggern übereinstimmt.

Diese Eigenschaften machen meine Bots "abrufbasiert", wie dieser hervorragende Artikel beschreibt. Abrufbasierte Konversationsmodelle sind einfacher zu implementieren, da sie ein Repository vordefinierter Antworten und einige Regeln verwenden, um sie auszuwählen. Die andere Möglichkeit wäre gewesen, Chatbots zu erstellen, die in der Lage sind, ihre eigenen Antworten zu generieren, aber dieser Ansatz wäre viel zeitaufwendiger und anfälliger für grammatikalische Fehler gewesen. Es wäre mir unklar gewesen, wie ich Benutzern die Möglichkeit geben könnte, diese Bots mit ihren benutzerdefinierten Eingaben zu skripten.

Den Bot Builder bauen

Die einfachen Ziele lassen sich gut auf die tatsächlichen technischen Merkmale übertragen. Die Scripting-Plattform, die ich mit React implementiert habe, ist im Grunde genommen eine dynamische Form, die nach Wahl des Benutzers wächst und schrumpft. Die Anzahl der Trigger oder Antworten, die Sie hinzufügen können, ist unbegrenzt. In der Skriptphase können Benutzer ihre Bots testen und sie dann speichern, sobald sie mit ihren Skripten zufrieden sind. Sie können den Bot bearbeiten, mit ihm chatten oder einen Link für andere Personen freigeben, um mit dem Bot zu chatten, da er auf meiner Website gehostet wird. Jede Nachricht, die der Bot erhält, wird an mein Ruby on Rails-Backend gesendet, wo ein Matching-Prozess versucht, die richtige Antwort zu finden und sie an das Frontend (Benutzer) zu senden.

Zu diesem Zeitpunkt hatte ich bereits einige einfache "Bereinigungsfunktionen" implementiert, z. B. das Entfernen von nicht-alphabetischen Zeichen und Leerzeichen. Die Bots konnten jedoch nur sehr genaue Übereinstimmungen verstehen. Sie sagten, "Ich verstehe nicht viel", und das war keine großartige Benutzererfahrung. Es wurde deutlich, wie schwierig es ist, auch einen einfachen menschlichen Dialog programmatisch nachzuahmen.

Nachdem ich die Basislogik ausgewählt hatte, die alle meine Bots implementieren sollten, stellte ich die Standardauslöser und -antworten für das Scripting ein. Auf der Frontend-Bot-Scripting-Plattform können sich Benutzer für kleine Standardskripte wie Begrüßungen, Verabschiedungen, einfache Fragen (z. B. „Wie geht es Ihnen?“) Und existenzielle Fragen (z. B. „Was sind Sie?“) Anmelden. Die Bots wurden nach dieser einfachen Hinzufügung etwas weniger dumm.

Einfache Standardskripte

Fuzzy String Matching für den Gewinn

Der letzte Schritt für meinen dummen Bot-Hersteller war das Implementieren von "Fuzzy-String-Matching". Dafür gibt es ein erstaunliches Rubinjuwel und eine Bibliothek. Anstatt zu vergleichen, ob string1 == string2 ist, berechnet Fuzzy String Match den Abstand zwischen zwei Strings. Der Edelstein verwendet den Jaro-Winkler-Entfernungsalgorithmus, um einen Wert zwischen 0 und 1 zurückzugeben, um die Ähnlichkeit zwischen den Zeichenfolgen darzustellen. 1 bedeutet, dass die Wörter gleich sind, 0 bedeutet, dass sie überhaupt nicht ähnlich sind. Ich habe den Standard-Übereinstimmungsschwellenwert meiner Bots auf 0,8 festgelegt, da dies anscheinend über Tippfehler oder zusätzliche Füllwörter hinausging, ohne dass bedeutende Unterschiede vollständig verloren gingen. Das Initialisieren einer Vergleichsinstanz war einfach (fuzzy_match = FuzzyStringMatch :: JaroWinkler.create (: native)) und wurde daher verwendet.

Verwenden Sie den Edelstein „Fuzzy-String-Match“, nachdem Sie ihn initialisiert haben.

Meine letzte Methode, die richtige Antwort auf diese Nachricht zu finden, umfasst all diese drei Prüfungen. Ich habe einige Regeln aufgestellt, um die Antworten zu priorisieren, falls eine Benutzermeldung mit mehr als einem Auslöser übereinstimmt. An diesem Punkt manifestieren sich diese Regeln einfach in der Reihenfolge meiner Matching-Methode.

1) stimmt mit den Skripten des Benutzers überein

2) Standardskriptübereinstimmungen

3) Hinweise aus früheren Gesprächen finden (noch nicht implementiert)

Die drei Grundfunktionen zusammen haben die Bots auf ein angemessenes Niveau gebracht. Ich war froh zu sehen, dass meine Bots nicht zu sehr von Tippfehlern gestört wurden, dass sie die Skripte der Benutzer priorisieren und Standardantworten auf einige häufig verwendete Nachrichten anbieten konnten. Ich habe mit einfachen und anfängerfreundlichen Implementierungen für maschinelles Lernen experimentiert, um meinem Bot-Builder zusätzliches Verständnis zu verleihen, das ich für den nächsten Teil dieses Blog-Beitrags dokumentieren werde.