Eine Kundin, die ihre Meinung ändert
Ein simulierter Nutzer ist ein Skript, das den Kunden in einem Gespräch mit Ihrem Assistenten spielt. Er lohnt sich, denn ein Dialog hat keine einzige richtige Antwort, und Testchats von Hand zu tippen, kostet bei jedem Test Zeit.
Anna bittet um eine Erstattung, nennt eine Bestellung und ändert dann ihre Meinung. Hält der Assistent Schritt?
Am Ende dieser Lektion
Notiz
Ich kann einen Dialog mit einem geskripteten Nutzer testen und das Gespräch bewerten.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Simulierter Nutzer | ein Skript, das den Kunden spielt |
| Rolle | wer der Nutzer ist und wie er schreibt |
| Ziel | was der Nutzer am Ende will |
| Abbruchbedingung | die Regel, die den Dialog beendet |
| Protokoll | das ganze Gespräch, Zeile für Zeile |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Schreiben Sie den Nutzer als Skript
Geben Sie dem Nutzer eine Rolle, ein Ziel und eine Liste von Zeilen. Fügen Sie eine Abbruchbedingung hinzu, etwa ein Auf Wiedersehen oder eine Höchstzahl an Runden, damit der Dialog immer endet.
Ein Skript liefert bei jedem Lauf denselben Nutzer. Ein Modell, das den Nutzer spielt, würde variieren, bei jeder Zeile Guthaben kosten und einen Fehler schwer wiederholbar machen. Beginnen Sie mit einem Skript.
Durchgerechnetes Beispiel: Annas vier Zeilen
| Zeile | Was Anna sagt | Was es testet |
|---|---|---|
| 1 | hallo, bitte eine Erstattung | ob der Assistent nach der Bestellung fragt |
| 2 | Bestellung A17 | ob er die Erstattung startet |
| 3 | eigentlich doch die Bestellung B02 | ob er den Meinungswechsel bewältigt |
| 4 | danke, auf Wiedersehen | ob er den Dialog beendet |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Bewerten Sie das Protokoll, nicht jede Antwort
Prüfen Sie drei Dinge am ganzen Protokoll. Wurde das Ziel erreicht? Blieben die Runden im Limit? Geschah die Aktion genau so oft wie nötig?
Die letzte Prüfung findet einen stillen Fehler. Ein Assistent, der eine Erstattung für A17 und noch eine für B02 startet, hat das Ziel erreicht und zweimal erstattet.
Modell-Helfer schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const basis = process.env.AI_URL || \"http://ai:4000\";' 'async function fragen(nachrichten, probe, max) {' ' try {' ' const res = await fetch(basis + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: nachrichten, max_tokens: max || 200 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"Status \" + res.status);' ' return (await res.json()).choices[0].message.content;' > model.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Modell-Helfer schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' } catch (fehler) {' ' console.log(\"Aufgezeichnete Probe: Kein Modell hat geantwortet (\" + fehler.message + \").\");' ' const liste = [].concat(probe);' ' const runde = nachrichten.filter(function (m) { return m.role === \"assistant\"; }).length;' ' return liste[Math.min(runde, liste.length - 1)];' ' }' '}' 'module.exports = { fragen };' >> model.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Dialogtreiber schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' '// Ein geskripteter Nutzer: eine Rolle, ein Ziel, die Zeilen und ein Meinungswechsel in Zeile 3.' 'const nutzer = {' ' rolle: \"Anna, in Eile, schreibt kurze Nachrichten\",' ' ziel: \"eine Erstattung für die Bestellung B02\",' ' zeilen: [\"hallo, bitte eine Erstattung\", \"Bestellung A17\", \"eigentlich doch die Bestellung B02\", \"danke, auf Wiedersehen\"],' '};' '// Ein Ersatzassistent aus Regeln. Ein echter wäre der Agent, der getestet wird.' 'function assistent(text) {' ' const bestellung = text.match(/[AB][0-9][0-9]/);' ' if (bestellung) return \"Erstattung gestartet für \" + bestellung[0] + \".\";' ' if (text.includes(\"Wiedersehen\")) return \"Auf Wiedersehen.\";' ' return \"Wie lautet die Bestellnummer?\";' '}' > simulation.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Dialogtreiber schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function fuehren(maxRunden) {' ' const protokoll = [];' ' for (let i = 0; i < nutzer.zeilen.length && i < maxRunden; i = i + 1) {' ' protokoll.push(\"nutzer: \" + nutzer.zeilen[i]);' ' const antwort = assistent(nutzer.zeilen[i]);' ' protokoll.push(\"assistent: \" + antwort);' ' if (antwort.includes(\"Wiedersehen\")) break;' ' }' ' return protokoll;' '}' 'const protokoll = fuehren(6);' 'protokoll.forEach(function (zeile) { console.log(zeile); });' 'const erstattungen = protokoll.filter(function (zeile) { return zeile.includes(\"Erstattung gestartet\"); });' >> simulation.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Dialogtreiber schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'console.log(\"Ziel erreicht: \" + protokoll.join(\" \").includes(\"Erstattung gestartet für B02\"));' 'console.log(\"Runden genutzt: \" + protokoll.filter(function (zeile) { return zeile.startsWith(\"nutzer\"); }).length);' 'console.log(\"Erstattungen gestartet: \" + erstattungen.length + \" (der Nutzer wollte eine)\");' 'async function main() {' ' const system = \"Sie sind ein Support-Assistent eines Shops. Fragen Sie nach der Bestellnummer, bevor Sie etwas erstatten. Antworten Sie kurz.\";' ' const probe = \"Gern. Wie lautet die Bestellnummer?\";' ' const text = await fragen([{ role: \"system\", content: system }, { role: \"user\", content: nutzer.zeilen[0] }], probe, 60);' ' console.log(\"Antwort live: \" + text.trim());' ' console.log(\"Fragt nach der Bestellung: \" + text.toLowerCase().includes(\"bestell\"));' '}' 'main();' >> simulation.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Assistenten mit Anna treiben
docker exec -w /home/node/project agent node simulation.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Was der Treiber ausgibt
| Zeile | Was sie zeigt |
|---|---|
| Protokoll | Vier Zeilen des Nutzers und vier des Assistenten |
| Ziel erreicht | true |
| Runden genutzt | 4 |
| Erstattungen gestartet | 2, der Nutzer wollte eine |
| Antwort live | Eine mögliche Ausgabe: eine Frage zur Bestellung |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Probieren Sie es aus
Tipp
Entfernen Sie in simulation.js die dritte Zeile, „eigentlich doch die Bestellung B02“, und starten Sie erneut. Die gestarteten Erstattungen fallen auf 1, aber das Ziel wird nicht mehr erreicht. Erklären Sie, warum.
Ein häufiger Fehler
Warnung
Viele glauben, ein Dialog bestehe, wenn seine letzte Antwort richtig klingt. Ein höfliches Auf Wiedersehen kann auf zwei Erstattungen folgen. Bewerten Sie, was der Assistent im ganzen Protokoll getan hat: das Ziel, die Aktionen und die Runden.