Multi-Stage/Prompt-Bot
In diesem Tutorial erstellen wir einen komplexeren Assistenten, der auf mehreren Stages basiert.
Hierbei lernen Sie:
- den Unterschied zwischen Single- und Multi-Stage/Prompt-Bots
- Stage-Übergänge
- Wie auf die von der KI extrahierten Daten über die
params-Variable zugegriffen werden kann.
Warum Multi-Stage-Bots verwenden?
Theoretisch ist es möglich, komplexe Call-Flows mit nur einer Stage, d. h. nur einen Prompt zu erstellen. LLMs neigen jedoch ab und zu zu Halluzinationen und nehmen dann andere unerwartete Pfade. Es werden dann Aussagen getroffen oder Fragen gestellt, die nicht der Wahrheit entsprechen z.B. bei einer Terminbuchung Slots vorgeschlagen, die gar nicht existieren. Um dies zu vermeiden, können wir mehrere Stages verwenden, wobei jede Stage einen eigenen Dialog in einer Anrufsession darstellt. Jede Stage hat ihren eigenen Prompt, der dann im Gesprächsverlauf eingefügt wird, sodass wir das LLM genau instruieren können, was als nächstes zu tun ist.
Ein Beispiel anhand einer Terminbuchung:
Der Assistent fragt den Benutzer/Anrufer zunächst, ob er einen Termin buchen oder eine Buchung stornieren möchte. Wenn der Benutzer einen Termin buchen möchte, fragt der Assistent in der ersten Stage nach der Art des Termins und dem gewünschten Tag, während er in der zweiten Stage alle Informationen zur buchenden Person abgefragt wird, z. B. Name, E-Mail, Telefonnummer.
Im Fall einer Stornierung würde der Bot zunächst den Namen des Anrufers abfragen, um den Benutzer zu identifizieren, und dann bestehende Buchungen abrufen, auflisten und den Benutzer fragen, welche konkrete Buchung er stornieren möchte.
Diese zwei Abläufe lassen sich zwar mit einer Wenn-Dann-Regel in einem Prompt ausdrücken, jedoch können diese Regeln sehr komplex und verschachtelt sein, wo das LLM dann manchmal vom Pfad abweicht. Genau dieses Problem wird mit Multi-Stage/Prompt-Bots verhindert.
Single vs. Multi-Stage/Prompt-Bot
Um den Unterschied zwischen Single- und Multi-Stage/Prompt-Bots besser zu veranschaulichen, erstellen wir zunächst einen Single-Stage-Bot, der zwei Informationen abfragt und splitten dies dann auf zwei Stages.
Zuerst definieren/verwenden wir die Welcome-Stage mit folgendem Prompt:
Du bist ein KI-Telefonassistent, der einige Benutzer-/Kundendaten sammelt.
Du antwortest auf Deutsch.
Du antwortest kurz und in einem sehr freundlich-konversationellen Stil.
Beantworte jede Frage, die außerhalb des Zwecks liegt, den Namen und das Geburtsdatum des Kunden zu sammeln, mit: Ich weiß es nicht.
Erfinde keine Antworten.
Begrüße den Benutzer und frage nach seinem Namen und seinem Geburtsdatum einschließlich des Jahres.Als Nächstes definieren wir im Reiter Aktionen/Werkzeuge eine Funktion collectData mit den folgenden Parametern:
name als String und dob als Date. Die Parameter der Funktion sollten anschließend wie folgt konfiguriert werden:

Im Reiter Funktionen können wir nun die leere JavaScript-Funktion collectData(params) noch mit
dem Text erweitern, den der Assistent nach Aufruf dieser Funktion sagen soll.
In unserem Beispiel antwortet der Assistent sobald er den Namen aufgenommen hat einfach mit "Danke!" und dem Namen,
den der Benutzer/Anrufer angegeben hat.
function collectData(params) {
return { text: "Danke! " + params.name };
}Der Parameter params enthält alle zuvor vom Anrufer/Benutzer gemachten Angaben als JSON-Datenstruktur.
{
"name": "Max",
"dob": "14.09.1989"
}Den Single-Stage Assistenten testen
Wie im folgenden Gespräch zu sehen, begrüßt der Assistent den Anrufer und fragt nach seinem Namen und seinem Geburtstag. Sobald der Benutzer/Anrufer die erforderlichen Informationen angegeben hat, antwortet der Assistent mit einem Dank und wiederholt den angegebenen Namen.
Außerdem sieht man den Aufruf der Funktion collectData() und die Werte des params-Parameters, wo die von der KI aus dem Gespräch extrahierten
Daten zu finden sind.
Bonus
Im obigen Beispiel sagt der Assistent lediglich, was als text in der Funktion collectData() zurückgegeben wurde.
Wie im Beispiel zu sehen ist, fand die Konversation jedoch auf Deutsch statt. Damit das LLM selbstständig eine Antwort in der passenden Sprache formuliert,
kann stattdessen ein Datenfeld data zurückgegeben werden.
function collectData(params) {
return { data: "Bedanke dich beim Benutzer und nenne seinen Namen." };
}
Multi-Stage/Prompt-Bot
Diesmal splitten wir den obigen Bot auf, sodass in der Welcome-Stage nur der Name und dann in der nächsten Stage nur das Geburtsdatum abgefragt wird.
Zuerst definieren/verwenden wir die Welcome-Stage und legen den folgenden Prompt fest:
Du bist ein KI Assistent, der einige Benutzer-/Kundendaten sammelt.
Du antwortest auf Deutsch.
Du antwortest kurz und in einem sehr freundlich-konversationellen Stil.
Beantworte jede Frage, die außerhalb des Zwecks liegt, den Namen und Geburtstag des Kunden zu sammeln, mit: Ich weiß es nicht.
Erfinde keine Antworten.
Begrüße den Benutzer und frage nur nach seinem Namen.Beachte, dass wir die Anweisung an das LLM nur auf die Namensabfrage verkürzt haben, aber nicht auf das Geburtsdatum, da diese Information in der zweiten Stage abgefragt wird, nachdem wir den Namen erfolgreich gesammelt und zur nächsten Stage gewechselt haben.
Wir fügen dann eine zweite Stage hinzu und nennen diese Stage DOB, lassen sie aber zunächst leer.
Als Nächstes definieren wir im Reiter Aktionen/Werkzeuge eine Funktion collectName mit dem Parameter name als string und geben eine passende Beschreibung an.
Die Werkzeuge sollten anschließend wie folgt konfiguriert werden:

Beachte, dass wir außerdem einen Key/Path (Pfad im Zustand) definieren, in dem die gesammelten Informationen, also der Name, im State gespeichert werden sollen.
Und wir definieren einen Übergang zur zuvor erstellten Stage Stage DOB, da wir anschließend das Geburtsdatum sammeln möchten.
Für diese Stage nutzen wir einen sehr kurzen Prompt, denn das LLM soll in dieser Phase des Gesprächs den Anrufer lediglich nach seinem Geburtsdatum befragen.
Frage den Anrufer nach seinem Geburtsdatum.Abschließend definieren wir die Aktionen/Funktionen für die DOB-Stage wie folgt fest:

Schließlich implementieren wir die Funktion collectDOB, die wir im Aktionen/Werkzeuge-Abschnitt definiert haben. In unserem Beispiel antworten wir einfach nur mit "Danke!" und legen auf.
function collectDOB(params) {
return { text: "Danke!", action: "hangup" };
}Den Multi-Stage-Bot testen
Wie im folgenden Gespräch zu sehen, begrüßt der Assistent den Anrufer und fragt nach seinem Namen.
Nachdem der Anrufer seinen Namen mitgeteilt hat, wird die Funktion collectName aufgerufen die auch den Übergang
in die Stage DOB auslöst.
In dieser Stage fragt dann das LLM wie im Prompt definiert den Anrufer nach seinem Geburtsdatum.
Abschließend wird die Funktion collectDOB aufgerufen mit den Daten, die der Anrufer bereitgestellt hat.
Im Debug-Modus ist zum einen ersichtlich, in welcher Stage sich der Assistent gerade befindet sowie der aktuelle Zustand, der letzte Prompt sowie die extrahierten Daten/Variablen etc.

Ausführungsreihenfolge Prompt und Funktionsaufrufe
Während der Ausführung werden die Rückgabewerte/Daten der Funktionaufrufe sowie der Prompt der nächsten Stage zusammen von dem LLM als eine Antwort und gleich anschließende Frage formuliert: