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.

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 ...
Weiterlesen …

Telegram Bot – Hirn ist aus

In einem früheren Post hatte ich ja schon über den Telegram Bot als Interface für die Heimautomatisierung geschrieben und die Idee, nicht-Kommandos über einen ChatBot zu bearbeiten. Die Idee ist inzwischen etwas weiter gedacht und erheblich komplexer geworden.Projekt: Telegram Bot ...
Weiterlesen …

Telegram Bot – Chat mit Raspberry

Mittelfristiges Ziel ist, die ganzen Projekte zusammen zu schließen und auch von außen sicher zu nutzen. Dazu ist ein kleiner Versuch zur Anbindung von Telegram an einen Raspberry gestartet worden. Am Ende ist ein funktionierender Telegram Bot in Python auf ...
Weiterlesen …

Telegram Bot – Hirn ist aus

In einem früheren Post hatte ich ja schon über den Telegram Bot als Interface für die Heimautomatisierung geschrieben und die Idee, nicht-Kommandos über einen ChatBot zu bearbeiten. Die Idee ist inzwischen etwas weiter gedacht und erheblich komplexer geworden.

Projekt: Telegram Bot

Kontakt: Boris Dirnfeldner

Link: – eigenes Projekt –

Grundsätzlich wäre es (auch für andere Projektideen) schön, wenn man sich mit dem Gerätenetzwerk unterhalten könnte ohne eine Reihe von Kommandos lernen zu müssen. Die aktuellen Assistenten von Google und Amazon sind da schon recht weit, aber aus einer Reihe von Gründen uninteressant:

  • Die Dinger sind Datenkraken. Ich lege überhaupt keinen Wert darauf das diese Firmen in diesem Bereich Daten sammeln, auch wenn die Lösungen wirklich gut sind und weitestgehend (für Private) kostenlos
  • Der Lerneffekt ist nahe Null. Die Arbeit reduziert sich auf Integration und geringe Anpassungen. Damit kann ich dann zwar genau das was die Umgebung liefert, habe aber darüber hinaus keinerlei Hintergrundwissen aufgebaut
  • Die Optionen zur Anpassung sind gering. Der Kern ist bereits erheblich zu komplex und in vielen Teilen auch nicht zugänglich. Sich da reinzufuchsen und zu lernen ist praktisch nicht möglich. Das Argument gilt natürlich auch bei anderen Frameworks, aber dort ist häufig die Architektur viel klarer dokumentiert, man kommt an alles ran und kann sich in die interessanten Aspekte einarbeiten
  • Erhebliche Teile der Lösungen sind auf die Server der Betreiber ausgelagert. Eine lokale Lösung ohne Internet-Verbindung ist faktisch unmöglich zu realisieren (versucht mal Alexa ohne Internet zu betreiben!).
  • Wenn man sich etwas mit den Assistenten beschäftigt hat, stellt man fest das die Dinger zwar inzwischen recht viele Funktionen haben (gerade mit den zusätzlichen Skills von Dritten), aber letztendlich recht eingeschränkt im Verständnis sind. Eigentlich lernt man als Benutzer die erforderliche Sprachstruktur der Assistenten. Natürliche Sprache ohne Schlagworte oder fehlende Disziplin beim Aufbau der Kommandos führen zu unterhaltsamen, aber nicht richtigen Reaktionen.
    Allerdings sind Aufweckwörter bei Assistenten, die alles auf Drittserver übertragen, eigentlich eine sehr gute Idee.

Damit sind diese Assistenten für mich uninteressant und werden auch weitestgehend vermieden (zumindest als Plattform). In einzelnen Geräten sind die Dinger auch bei mir drin, einfach weil in der Konsequenz manche Gerätegattungen (z.B. Smart TV) einfach zu begrenzt sind. In den Eigenbauten aber nicht.

Als einen ersten Versuch habe ich einen einfachen ChatBot aufgesetzt (ChatterBot). Das Teil ist in Python implementiert und recht intuitiv einzurichten. Die Anbindung an Telegram wie vermutet kein echtes Problem und schnell erledigt.
Trainiert wird das System über Konversation (online oder aufgezeichnet), das von System auf Frage-Antwort Szenarien umgesetzt wird und nach Wahrscheinlichkeit dann ausgegeben wird.
Die Lösung erlaubt auch sehr komfortabel die Einrichtung von einfacher, programmierter Logik (über Logikadaptern).

Man kann damit in relativ kurzer Zeit schon Gespräche mit dem System führen und mit entsprechendem Trainingsmaterial sicher auch relativ plausibel kommunizieren. Allerdings ist es auch offensichtlich das dieses System keine Ahnung vom Inhalt der Texte hat und einfach nur plappert was passt (oder auch nicht). Ebenso fehlt eine Merkfähigkeit und Kontext ist praktisch nicht existent. Damit kann kein Gespräch über das Niveau von billigsten Smalltalk durchgehalten werden. Auch ist die Basislogik für englische Sprache aufgebaut und ohne Überarbeitung mit deutschen Texten deutlich schwächer.

Also braucht das System Hirn, und damit wird das alles sehr komplex und in weiten Teilen erst mal theoretisch.

Nach einiger Recherche im Netz bin ich auf den Begriff NLP (Natural Language Processing) gestoßen. Mit dieser Technik kann das System eine Art von Verständnis über den eingegeben Text erhalten und mit den Strukturinformationen dann z.B. den Kontext erkennen. Das ganze Gebiet ist mit Sicherheit umfangreich genug für jahrzehntelanges Studium und rumprobieren.

In der Praxis gibt es hier schon eine ganze Reihe von Frameworks die viel der Theorie in Code umgesetzt haben (und es weiter tun). Ein interessanter Vertreter hier ist spaCy. Auch hier kann man sich lange spielen, aber auch das soll erstmal nicht Ziel sein.
Eigentlich will ich ja ein transparentes System, das diese Theorien bereits implementiert hat und mir die Option gibt daraus Nutzen zu ziehen und anhand von praktischer Anwendung zu lernen (oder zu versagen beim Versuch).

Weitere Recherche zeigte mir, das auch hier bereits Lösungen geschaffen wurden, die den Ansatz bereits recht weit getrieben haben. Ein für mich sehr interessanter Kandidat hierzu ist sicher Rasa. Die Firma dahinter baut intelligente Chatbots, hat aber erhebliche Teile des Frameworks als Open Source im Netz zur Verfügung gestellt.

Es beinhaltet als Logik neben spaCy auch andere Ansätze und Strategien, die je nach Bedarf und Implementierungsstrategie eingesetzt werden können (oder auch nicht). Das System besteht aus mehreren Komponenten und bietet ein umfassendes Framework für genau diese Problemstellung. Leider ist es auch entsprechend Komplex und damit auch nicht mehr in einem Abend zusammengebastelt. Für das Thema ist das aber auch unmöglich, und die Dokumentation ist schon recht ordentlich.

Fazit:

Mit einer einfachen Lösung wird hier gar nichts erreicht werden. Auch sehr gutes Training auf einen Bot ohne Intelligenz wird letztendlich ein “Eliza” erzeugen ohne Sachverstand. Und das hat dann auch keinen Mehrwert zum jetzigen Kommando-Bot.

Obgleich geringe Prio, wird das Thema weiter verfolgt und wahrscheinlich mal ein Prototyp mit Rasa aufgebaut. Je nach Aufwand kann das System ja dann weiter über die Zeit trainiert und verbessert werden, aber das ist erstmal noch Zukunftsgeschichte.

“Es kann keinen Flug geben ohne vorangegangene Träume vom Fliegen” (Stanislaw Lem).

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 ...
Weiterlesen …

Telegram Bot – Hirn ist aus

In einem früheren Post hatte ich ja schon über den Telegram Bot als Interface für die Heimautomatisierung geschrieben und die Idee, nicht-Kommandos über einen ChatBot zu bearbeiten. Die Idee ist inzwischen etwas weiter gedacht und erheblich komplexer geworden.Projekt: Telegram Bot ...
Weiterlesen …

Telegram Bot – Chat mit Raspberry

Mittelfristiges Ziel ist, die ganzen Projekte zusammen zu schließen und auch von außen sicher zu nutzen. Dazu ist ein kleiner Versuch zur Anbindung von Telegram an einen Raspberry gestartet worden. Am Ende ist ein funktionierender Telegram Bot in Python auf ...
Weiterlesen …

Telegram Bot – Chat mit Raspberry

Mittelfristiges Ziel ist, die ganzen Projekte zusammen zu schließen und auch von außen sicher zu nutzen. Dazu ist ein kleiner Versuch zur Anbindung von Telegram an einen Raspberry gestartet worden. Am Ende ist ein funktionierender Telegram Bot in Python auf einem Raspberry rausgekommen, mit dem vom Handy aus gequatscht wird.

Projekt: Telegram Bot

Kontakt: Boris Dirnfeldner

Link: – eigenes Projekt –

Nach einiger Suche zu Lösungen zur benutzerfreundlichen Anbindung an die eigenen Lösungen bin ich über die API von Telegram gestolpert und die wirklich mächtige Funktionalität der Bots.

Als Einstieg zu dem Thema hat Telegram selbst eine recht ordentliche Seite.

Grob gilt es folgende Schritte zu tun:

  • Erzeuge einen neuen Telegram-Bot über einige Messages mit dem Telegram-Bot “Botfather”. Nach erfolgreicher Erzeugung ist der Bot aktiv und man hat einen exklusiven Schlüssel für den Zugriff
  • Danach geht es daran, den Bot an sich zu entwickeln. Die Telegram-Server funktionieren als Vermittler zwischen den Clients (der App auf den Smartphone) und dem Server (der Python Anwendung auf dem Raspberry). Alle Seiten müssen sich auf den Servern anmelden, damit die Kette funktioniert. Der Bot ist immer aktiv, wenn also nur der Client angemeldet ist antwortet halt keiner. Ohne Client hört halt keiner zu.
    Die Bot-Applikation autorisiert sich gegenüber Telegram über den Schlüssel.

Für Python gibt es einen sehr guten Wrapper um die Telegram-API, zu finden hier.
Da sind auch die erforderlichen Dokumentationen und ein Tutorial zu finden.

Ich habe für meinen Bot ein Paar Kommandos eingerichtet und eine Sicherheitsschicht über User IDs. Die muss ich einmal rausfinden (durch eine Nachricht an meinen Bot). Da ich einen Bot nicht privat schalten kann, muss ich zwischen “autorisierten” Benutzern und Besuchern unterscheiden. Ebenso kann ich Nachrichten auch nur an bestimmte Benutzer “privat” schicken und so die Benutzer komplett von der Infrastruktur isolieren.

Wenn keine Kommandos kommen, könnte ich mich z.B. auch mit einer Instanz von ChatterBot unterhalten. Das habe ich mir dann aber gespart, zumal es keinen zusätzlichen Nutzen für mich hat. Aktuell liefet ein Standard-Handler einfach einen Satz zurück. Der Spieltrieb ist manchmal schon übel.
Die Unterhaltungen der einzelnen Clients mit dem Bot sind getrennt voneinander. Wenn also zwei verschiedene Personen verbunden sind, können diese sich nicht untereinander belauschen. Eine Gruppe ist mit Bots nicht möglich.

Die Telegram-Infrastruktur ist in Bezug auf die Nachrichten sehr mächtig und erlaubt eigentlich alle relevanten Medien zu empfangen und zu übertragen.
Ich werde später damit auf Anforderung z.B. Grafiken mit Temperaturverläufen vom Pool anfordern können oder auch nur Alarme von Geräten aufs Handy geschickt bekommen.

Probleme:

Primär mit der API, um nach dem supereinfachen Einstieg das Thema Security voran zu bekommen. Nach etwas rumprobieren und Recherche der Dokumentation ist aber alles lösbar gewesen und eigentlich ohne echte “Klippen”.

Fazit:

Die vorhandene Lösung ist bereits gut einsetzbar und leicht zu erweitern. Sobald das Thema Home Automation weiter getrieben wird und die entsprechenden Projekte eine ausreichende Reife erhalten, wird der Bot auch (zumindest für Teile der Funktion) eingebunden.

“Dif-tor heh smusma”

Komponenten:
Rechner: Raspberry PI 3B+
Language: Python
Runtime: Raspbian
Smartphone mit Telegram App

Überlegungen:
Telegram: Ein recht sicherer Messaging-Dienst, kostenlos und nicht der Google Datenkrake zugehörig. Außerdem eine sehr mächtige API zur Anbindung von Applikationen.

Schäden:
– mal zur Abwechslung keine –

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 ...
Weiterlesen …

Telegram Bot – Hirn ist aus

In einem früheren Post hatte ich ja schon über den Telegram Bot als Interface für die Heimautomatisierung geschrieben und die Idee, nicht-Kommandos über einen ChatBot zu bearbeiten. Die Idee ist inzwischen etwas weiter gedacht und erheblich komplexer geworden.Projekt: Telegram Bot ...
Weiterlesen …

Telegram Bot – Chat mit Raspberry

Mittelfristiges Ziel ist, die ganzen Projekte zusammen zu schließen und auch von außen sicher zu nutzen. Dazu ist ein kleiner Versuch zur Anbindung von Telegram an einen Raspberry gestartet worden. Am Ende ist ein funktionierender Telegram Bot in Python auf ...
Weiterlesen …
Wir benutzen Cookies und Logs mit personenbezogenen Daten ausschließlich für essentielle Funktionen wie z.B. bei der Benutzeranmeldung oder der Fehlersuche. Für Videos werden weitere Cookies von Drittanbietern benötigt. Details finden sie unter dem Link "Weitere Informationen".