Generative KI für eigene Apps und Webseiten, Teil 2 Gesprächsführung für den Botpress-KI-Chatbot

Von Mirco Lang 6 min Lesedauer

Anbieter zum Thema

Der erste Prototyp unseres Chatbot ist fertig. Jetzt bekommt der Assistent über Botpress noch ein wenig Logik spendiert: Schleifen, Abfragen, Variablen, sowie erweiterte KI-Fähigkeiten.

Der Chatbot samt ChatGPT-Integration.(Bild:  Lang / Botpress)
Der Chatbot samt ChatGPT-Integration.
(Bild: Lang / Botpress)

Kurzes Recap: Im ersten Teil dieses Workshops wurde der Bot initiiert, per Sitemap-XML-Datei mit Wissen gefüttert und anschließend mit einem einzigen Knoten, Start- und Ende-Marker im Designer aufgebaut. Der Knoten gibt bislang einen fixen Begrüßungstext aus und kann Fragen auf Basis der Wissensbasis beantworten. Zuletzt bekam der Bot ein wenig Persönlichkeit: Ein humoriger Admin mit einem Faible für kurze Antworten und Emojis.

Der bisherige Workflow: Der Nutzer stellt eine Frage, der Bot antwortet oder gibt an, keine Antwort gefunden zu haben – in beiden Fällen endet die Konversation. Im nächsten Schritt soll der Bot nun unterschiedliche Wege gehen, je nachdem, ob eine Antwort gefunden wurde oder nicht – also eine Umsetzung einer Wenn-Dann-Abfrage. Und damit es nicht zu einfach wird, kommt auch gleich die Verwendung von Variablen mit dazu.

If-Abfrage und Variablen

Der erste Knoten für die If-Abfrage(Bild:  Lang / Botpress)
Der erste Knoten für die If-Abfrage
(Bild: Lang / Botpress)

Die If-Abfrage ist in Botpress grundsätzlich simpel und intuitiv umgesetzt – allerdings mit kleinen Stolpersteinchen und bisweilen etwas unpräzise. Zu Beginn benötigen wir einen Node mit folgenden Karten: „Raw Input“ aus dem Bereich „Capture Information“ und zweimal „Expression“ aus dem Bereich „Flow Logic“.

Die Karte „Raw Input“ verhält sich fast wie die reine Text-Karte aus dem ersten Teil: Es wird ein Text präsentiert – der hier allerdings in einer Variablen gespeichert werden kann. Wir geben also den gewünschten Text ein und erstellen unter „Store result in“ eine Variable (hier im Bild „workflow.frage1“).

Nun geht es an die beiden Expression-Karten. Dabei handelt es sich Botpress-intern um sogenannte Transitions – Übergänge, die an bestimmte Bedingungen geknüpft sind. Diese sollen hier sein: „Antwort gefunden“ oder „Antwort nicht gefunden“.

KI-generierter Code für Transitions.(Bild:  Lang / Botpress)
KI-generierter Code für Transitions.
(Bild: Lang / Botpress)

Achtung! Standardmäßig haben diese Ausdrücke das Label „always“ und das blaue Sternchen ist aktiviert. Das bedeutet, dass Ihre Eingaben unter Label automatisch in eine für Botpress verständliche Bedingung umgemünzt werden – standardmäßig wird aus always dann true abgeleitet. Nun können Sie hier etwas wie „Answer from Knowledge.“ eingeben und Botpress macht daraus automatisch die Bedingung „event.kb.results.length > 0“ und für „Now answer …“ kommt „event.kb.results.length === 0“.

Manuell eingefügte Bedingungen.(Bild:  Lang / Botpress)
Manuell eingefügte Bedingungen.
(Bild: Lang / Botpress)

Das klingt sehr logisch – funktioniert hier aber nicht. Stattdessen musste doch etwas Recherche her und es stellte sich heraus: der Code für die beiden Bedingungen lautet korrekt „{{turn.KnowledgeAgent.responded}}“ für Ja/True und entsprechend mit vorgestelltem Ausrufezeichen „{{!turn.KnowledgeAgent.responded}}“ für Nein/False.

Wenn-Dann in Botpress-Manier.(Bild:  Lang / Botpress)
Wenn-Dann in Botpress-Manier.
(Bild: Lang / Botpress)

Damit sind also zwei Wenns definiert, fehlen noch die Danns: In diesem Fall und zum Testen erstellen wir schlicht zwei Knoten mit Textkarten, die Wahr oder Falsch bestätigen und flanschen diese an die beiden Wenn-Karten an. Übrigens: Natürlich sollte man alle Knoten möglichst sinnvoll benennen, ansonsten geht irgendwann die Übersicht verloren.

Schließlich muss für den ersten Knoten noch wie üblich „Enable Knowledge Answering“ aktiviert werden (zu erkennen an dem blauen Buch neben „Bot1“) und Start- und End-Marker sollten verbunden werden.

Verwendung einer Variablen.(Bild:  Lang / Botpress)
Verwendung einer Variablen.
(Bild: Lang / Botpress)

Der Bot gibt nun also eine Antwort und dann den Text „Ja, ich hatte eine Antwort.“ aus – oder den Hinweis, dass keine Antwort in der Wissensbasis gefunden wurde und dann den NoAnswer-Text. Wir erinnern uns: Die Frage selbst wurde in einer Variablen gespeichert. Im Sinne des aktiven Zuhörens könnte der Bot die Frage nun beim Antworten wiederholen, hier beispielsweise, wenn keine Antwort gefunden wurde.

Selbst in den reinen Text-Antworten lassen sich vorhandene Variablen direkt über @+Autovervollständigung oder das @-Menü ansprechen.

Loop

Wo If-Abfragen zum Einsatz kommen, sind Schleifen meist nicht weit weg. Bislang startet der Bot am Ende immer von vorn, egal, ob eine Antwort gegeben wurde oder nicht. Üblicher wäre Folgendes: Wenn die Frage beantwortet werden konnte, landen Nutzer wieder bei der Eingabe einer neuen Frage. Falls nicht, bleibt es zunächst beim expliziten Ende via End-Marker.

Ein extra Loop verbessert die User Experience.(Bild:  Lang / Botpress)
Ein extra Loop verbessert die User Experience.
(Bild: Lang / Botpress)

Zwei Knoten kommen jetzt neu dazu: Der „Welcome“-Knoten mit statischem Text dient lediglich der Begrüßung und soll nur beim Start angezeigt werden, nicht, wenn die neue Schleife durchlaufen wird. Der Knoten „Loop1“ hat tatsächlich gar keinen Inhalt. Wenn eine Antwort verfügbar ist, wird der Knoten „YesAnswer“ getriggert, dann immer „Loop1“ und von dort aus geht es immer zurück zu „Bot1“ und der Aufforderung, eine Frage zu stellen.

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu RZ- und Server-Technik

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung. Die Einwilligungserklärung bezieht sich u. a. auf die Zusendung von redaktionellen Newslettern per E-Mail und auf den Datenabgleich zu Marketingzwecken mit ausgewählten Werbepartnern (z. B. LinkedIn, Google, Meta).

Aufklappen für Details zu Ihrer Einwilligung

Freilich könnte man auf den expliziten Loop-Knoten meist verzichten, Ausgänge von Knoten können sogar an den Eingang desselben Knotens gesetzt werden. Mit extra Loop-Schritt wird es aber übersichtlicher, flexibler und benutzerfreundlicher: Keine Antwort und dann einfach ein Neustart? Das lassen sich Nutzer tendenziell nicht lange gefallen.

ChatGPT als Fallback

Jetzt endlich kommt die geballte Macht von ChatGPT zum Einsatz – denn ChatGPT ist das, was in Botpress als generative KI genutzt und referenziert wird. Der Gedanke ist simpel: Wenn das eigene Wissen keine Antwort hergibt, soll bitte ChatGPT antworten.

Dazu legen wir einen zusätzlichen Knoten nach dem Knoten „NoAnswer“ an. Hier werden zwei Elemente benötigt, zunächst einmal eine Karte vom Typ „AI Task“. Unter „Task Instructions“ geben Sie in normaler Sprache ein, was denn die Aufgabe dieses Tasks-Knotens ist – zum Beispiel das Beantworten der Nutzerfrage, kurz und mit Emojis.

Nun wird abermals doch etwas Code-Wissen verlangt: Unter „AI Task Input“ muss folgen, was man bei ChatGPT eingeben würde – also nochmals die anfangs gestellte Nutzerfrage. Nur zur Erinnerung: Diese wurde in der Variablen „workflow.frage1“ gespeichert.

Die letzte Nutzereingabe findet sich allerdings immer in der Variablen „{{event.preview}}“. Das ist etwas generischer und funktioniert auch in komplexeren Workflows mit vielen Nutzereingaben. Die Antwort der generativen KI muss nun ebenfalls noch in einer Variablen gespeichert werden, hier etwa der neu angelegten „workflow.AIAnswer“.

ChatGPT-Fallback als KI-Aufgabe.(Bild:  Lang / Botpress)
ChatGPT-Fallback als KI-Aufgabe.
(Bild: Lang / Botpress)

Botpress weiß nun also, dass eine Frage beantwortet werden soll (AI Task), um welche Frage es sich handelt (AI Task Input) und wo das Ergebnis der Aufgabe gespeichert werden soll (workflow.AIAnswer). Damit die Nutzer diese Antwort auch zu Gesicht bekommen, fehlt noch eine simple Text-Karte in diesem Knoten, der lediglich die Variable mit der Antwort in der Form „@workflow.AIAnswer“ übergeben wird.

Ganz ohne Code geht es nicht – aber Botpress hilft.(Bild:  Lang / Botpress)
Ganz ohne Code geht es nicht – aber Botpress hilft.
(Bild: Lang / Botpress)

Natürlich lässt der Botpress-Editor einen nicht ganz allein, wenn der Workflow mal von No-Code zu Low-Code wechselt. Als Beispiel: Die wohl einfachste Art, eine Antwort der allgemeinen generativen KI zu bekommen, ist die Karte „AI Generate Text“. Dieser könnten schlicht fixe Texte übergeben werden oder abermals die letzte Nutzereingabe.

Das Bild zeigt die Autovervollständigung für gültige Ausdrücke samt Erklärung – und vor allem samt einer Vorschau. Hier ist etwa „Wo ist Köln?“ die letzte Nutzereingabe gewesen. So wird schnell klar, was genau hinter Ausdrücken und Variablen steckt.

Der Chatbot samt ChatGPT-Integration.(Bild:  Lang / Botpress)
Der Chatbot samt ChatGPT-Integration.
(Bild: Lang / Botpress)

Damit ist auch der zweite Prototyp soweit fertig. Der Bot begrüßt Nutzer und fordert sie so lange zu Fragen auf, bis die eigene Wissensbasis keine Antwort liefern kann. In dem Fall wird eine ChatGPT-Antwort geliefert und die Session explizit beendet. Im vorangestellten Bild noch einmal der Überblick.

Natürlich ist das soweit nur ein grober Rahmen, aber wir haben Wissensbasen, Schleifen, Variablen, Code-Referenzen, Bedingungen und vor allem die Integration generativer KI kennengelernt – sei es als Antwortgeber oder Interpreter für interne, menschlich formulierten Befehl (was wie erwähnt bisweilen nur mittelprächtig funktioniert).

Weitere Aufgaben wie Multiple-Choice-Fragen, das Triggern von Hooks oder selbst komplexe Fragebögen lassen sich mit diesen Grundkenntnissen recht fix umsetzen. Im kommenden letzten Teil geht es noch ans Feintuning, vor allem aber wird aus dem schematischen Abriss endlich eine App, (mit CSS) hübsch angepasst an und eingebettet in die Checkmk-Oberfläche.

(ID:49783195)