Intelligenter Chatbot mit Lernschwäche – Erste Schritte mit Rasa
Nach einigen anderen Arbeiten war es an der Zeit das Thema Chatbot wieder aufzunehmen. Die letzten Versuche mit Chatterbot und Telegram waren ja ganz nett, aber von „intelligent“ waren wir doch weit weg. Nun geht es an das Thema Satzverständnis und Kontext mit Rasa als Basisprodukt.
Projekt: Telegram Bot
Kontakt: Boris Dirnfeldner
Link: – eigenes Projekt –
Beim letzten Versuch hat sich herausgestellt, das einfaches Nachplappern tatsächlich ganz interessante Dialoge ermöglicht. Allerdings war es auch offensichtlich, dass der Bot absolut keine Ahnung hatte um was es da geht und die untrainierten Bereiche entsprechend zufällig beantwortete. Das war zwar zuweilen lustig, aber manchmal auch sehr unglücklich im Ergebnis.
Bei den Recherchen zum Thema sind die Themen NLP – Natual Language Processing und KI – Künstliche Intelligenz als nächste Evolutionsstufe identifiziert worden mit den (für Python geeigneten) Lösungen spacy (für NLP) und Rasa (als integriertes Paket, das bereits die notwendigen Komponenten für einen Chatbot und Lernfähigkeit per KI-Umgebung zusammenbringt). Und Schnittstellen, auch zu Telegram, sind im Paket auch schon enthalten.
Rasa – erste Schritte
Die Installation an sich ist (eine fertige Python-Umgebung vorausgesetzt) einfach und gut dokumentiert (link). Für den Start empfiehlt sich die Umgebung mit „rasa x“ zu starten und damit die mitgelieferte UI zu nutzen. Zwar ist die manchmal hakelig und nicht fehlerfrei, zumindest zu Beginn aber gut geeignet zur Einarbeitung.
Im Kern speichert Rasa seine Daten in ein Paar wenigen Dateien und der eigenen Datenbank. Diese Daten werden idealerweise aus Versuchsdialogen erzeugt und dann manuell nachgearbeitet.
Mit den Daten wird dann ein Training vorgenommen, das entsprechend seine Modelle aktualisiert. Dann beginnt man das ganze wieder von vorn, bis ein geeignetes Modell für seine Zwecke erreicht wurde. Für den Start wird die eigentlich vorhandene Komplexität der Umgebung recht gut versteckt. Mit jedem Schritt weiter geht es aber schnell tiefer in die Materie und weg von „einfach“. Spätestens wenn man ernsthaft versucht, einen etwas komplexeren Bot über das Niveau von „Hallo Welt!“ zu heben, ist man schon gut unterwegs und ohne Hintergrundwissen und Hilfen bzw. Doku ziemlich verloren. Allerdings ist da auch einiges vorhanden, wenn auch nicht immer einfach zu finden. Mit etwas guten Willen kommt man zurecht, und das Forum scheint auch recht gut zu laufen.
Modell und Elemente
Anders als in einfachen Lösungen, die einfach vorhandene Antworten mehr oder weniger gut nachplappern, kann Rasa durchaus ein gewisses Satzverständnis aufbauen und Kontextwissen zum Dialog halten. Das ist allerdings auch wesentlich komplexer als einfach nur Texte einzutippen bis es einigermaßen läuft.
Grundsätzlich (und stark vereinfacht) wird die Eingabe durch eine „Pipeline“ an Komponenten geschickt. Je nach Konfiguration (und die ist schon so gar nicht ohne Hintergrund möglich) werden hier die Strategie und auch die Möglichkeiten der Verarbeitung definiert. Hier lohnt es sich mit einer vorbereiteten Konfiguration zu starten und diese dann schrittweise anzupassen.
Der Kernablauf ist, dass zuerst mehr oder weniger Hintergrund zur Eingabe erarbeitet wird (hier ist bei mir z.B. spacy aktiv) und der Satz in seine Bestandteile zerlegt wird bzw. bewertet. Basierend auf vorher gelernten Beispielsätzen wird dann damit gefolgert, welche Absicht (Intent) der Benutzer gerade verfolgt. Je nach verwendeten Modulen in der Pipeline und der Qualität der Trainingsdaten werden hier auch schon bestimmte Daten erfasst (Entities) und gespeichert (Slots). Je nach Absicht kann man mit festen Regeln (Rules) oder längeren Geschichten (Stories), daraus geeignete Aktionen darauf (Actions) bestimmt werden. Die sind dann z.B. standardisierte Antwortsätze oder eigener Code zur weiteren Bearbeitung (Custom Actions).
Rules sind hierbei vordefinierte, idealerweise einfach als Frage-Antwort definierte Logikschnipsel, die verbindliche Reaktionen definieren. Stories sind dann meist längere Episoden, die einen Gesprächsverlauf über einer längere Strecke definieren. Letztere sind vor allen dann wertvoll, wenn ein Gespräch einen ungeplanten Verlauf nimmt. Dann wird auf Basis der vorhandenen Stories vom Modell „geschätzt“ wie eine Reaktion darauf sein könnte. Je nach Qualität und Menge der Eingabedaten ist das dann aber auch mehr oder weniger richtig.
Etwas eigene Meinung zur Umgebung und Aufgabe
Die Lösung ist intern ziemlich komplex und mächtig. Intelligente Bearbeitung von Sprache ist auch keine leichte Kost und leider auch nicht aus dem Ärmel zu schütteln. Man kann dies gut an der Entwicklung der „intelligenten“ Assistenten über die letzten Jahrzehnte verfolgen, die zu Beginn so gar keine Hilfe waren und inzwischen durchaus schon gute Ergebnisse erzielen. Man sollte aber nicht glauben das dies einfach und schnell erreicht werden konnte und wird. Ebenfalls ist Sprache ein unglaublich komplexes Thema, wenn man versucht hier ein künstliches Verständnis zu erreichen. Rasa erlaubt es hier langsam tiefer zu gehen und immer wieder eine neue Stufe zu erreichen. Allerdings ist das auch erforderlich, wenn man was erreichen möchte.
Lernkurfe und Leistungsfähigkeit
Bei den Versuchen, einen deutschsprachigen Bot aufzubauen, bin ich immer wieder von „es-läuft“ hin zu „gar-nix-geht-mehr“ gewechselt und wieder zurück. Mit jedem neu gelernten Detail haben sich neue Untiefen gezeigt oder notwendige Anpassungen in der Konfiguration. Gerade die richtige Strukturierung der Lerndaten ist nicht wirklich einfach, die Konfiguration des Systems so ganz und gar nicht. Da war ich schon mehrmals an einem Punkt von „ich kapiere gar nix mehr“. Mit der Zeit wird es aber immer besser, und die Lernkurfe des Systems ist eigentlich sehr ordentlich (auch meine bei der Einarbeitung). Man merkt der Lösung schon an, dass da einige viele Jahre Entwicklung und Hintergrund drinstecken und viel Mühe darauf verwendet wurde, es kontrollierbar zu halten.
Geschwindigkeit und Ressourcenbedarf
Rasa braucht (gerade im Vergleich zum sehr einfachen Chatterbot) schon einiges an Rechnerperformance, hier vor allen Speicher. Einige hundert MB am RAM sind für den Betrieb erforderlich. Beim Trainieren ist auch eine leistungsfähige CPU notwendig. Für einen Raspberry ist das jedenfalls nichts, da muss schon was Stärkeres her. Wenn man mit der UI arbeitet, erscheint das System auch im Chat recht träge. Allerdings wird hier viel in der UI verbraten. Auf der Kommandozeile sieht man dann aber, dass das Modell an sich aber relativ schnell, zumindest ausreichend, im Chat reagiert. In den Foren und auf der Webseite wird mit Docker-Containern und AWS-Systemen gearbeitet, also Rechenzentrumsumfeld. Für Embedded-Lösungen ist das System jedenfalls schwierig einzupassen.
Dinge zur Beachtung
Wenn man mit Rasa (bzw. Rasa x) arbeitet, sollte man folgende Punkte beachten:
- Alle Änderungen in der Konfiguration bzw. den Trainingsdaten sind erst nach erfolgreichem Training verfügbar.
- Ein Training erzeugt ein neues Modell, das zuerst aktiviert werden muss.
- Die UI zeigt manchmal widersprüchliches Verhalten und erscheint nicht überall stabil oder fehlerfrei. Im Zweifel mal in die Dateien schauen.
- Wenn man mit der UI arbeitet („rasa x“), benötigt man oft die Logs der Kommandozeile um Details zu auftretenden Fehlern zu bekommen.
- Manchmal ist es leichter direkt in den Dateien zu arbeiten, um z.B. schnell Trainingsdaten einzupflegen oder zu überarbeiten.
- YML-Dateien sind im aktuellen Format (2.x), MD-Dateien aus den alten Versionen (1.x). Allerdings werden beide berücksichtigt und aktiv verwendet.
- Kleine Frage-Antwort Dialoge sind gut in den Regeln aufgehoben, komplexere Dialogstrecken in den Stories.
- Regeln und Stories dürfen sich nicht widersprechen, sonst schlägt das Training fehl.
Fazit
Nach einigen Stunden mit Rasa läuft ein erstes Modell, das schon gut das Potential der Umgebung zeigt. Die elementaren Funktionen sind vorbereitet und erste Schnittstellen zum Haussystem vorbereitet (über Custom Actions). Für ein robustes Modell sind die Trainingsdaten aber einfach noch zu klein und das Verhalten noch zu ungerichtet. An manchen Stellen hakt es bei mir noch ganz klar am Verständnis der internen Vorgänge und den NLP-Hintergründen. Mal sehen wie gut das Modell über die Zeit werden kann.