Die fünf Teile zusammenfügen
Ein funktionierender Chatbot vereint fünf Teile in einer Schleife. Er hält einen Zustand, kürzt ihn, folgt einem System-Prompt, streamt seine Antwort und zeigt seine Quellen. Das ist schwer, weil jeder Teil allein funktioniert und die Fehler dort auftreten, wo sie sich treffen.
Der Chatbot einer Bibliothek beantwortet drei Fragen hintereinander. Er muss sich an die erste erinnern, im Budget bleiben und jedes Mal eine Quelle nennen.
Am Ende dieser Lektion
Notiz
Ich kann Zustand, Kürzen, Prompt, Datenstrom und Quellen in einem Chatbot vereinen.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Chat-Schleife | die Schritte, die für jede Nutzernachricht wiederholt werden |
| Runde | eine Nutzernachricht und die Antwort darauf |
| Verlauf | alle Nachrichten des Chats bisher |
| Budget | die meisten Tokens, die Sie senden wollen |
| Notlösung | was der Bot tut, wenn kein Modell antwortet |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Runde nutzt alle fünf Teile
Jede Runde folgt denselben Schritten. Laden Sie den Verlauf. Fügen Sie die Nachricht der Nutzerin hinzu. Kürzen Sie, was Sie senden. Rufen Sie das Modell auf. Prüfen Sie die Antwort. Speichern Sie den Verlauf.
Schreiben Sie diese Schritte als eine Funktion, runde. Der Chat ist dann diese Funktion, immer wieder aufgerufen.
Beispiel: die Schritte einer Runde
| Schritt | Aus der Lektion | Was geschieht |
|---|---|---|
| Laden und hinzufügen | Ein Gespräch behalten | Die Nachricht der Nutzerin kommt in die Liste der Sitzung |
| Kürzen | Einen Verlauf kürzen | Alte Nachrichten bleiben bei diesem Aufruf weg |
| Prompt und Quellen | System-Prompt, Zitate | Die System-Nachricht enthält die Regeln und die nummerierten Quellen |
| Aufrufen und prüfen | Zitate | Die Antwort wird auf Marker ohne Quelle geprüft |
| Streamen und speichern | Datenstrom in die Seite | Die Stücke gehen an die Seite, der Verlauf wird gespeichert |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Behalten ist nicht Senden
Der Verlauf behält alle Nachrichten. Der Aufruf sendet nur, was ins Budget passt. Kürzen ändert also nie die Aufzeichnung. Es ändert einen Aufruf.
So können Sie das Budget später ändern, und ein Mensch kann trotzdem den ganzen Chat lesen.
Wenn das Modell nicht antwortet
Manchmal antwortet kein Modell: KI ist aus, das Guthaben ist aufgebraucht oder das Netz fällt aus. Eine Notlösung ist eine klare Meldung, die das sagt, damit der Chat nicht hängt oder abstürzt.
In diesem Labor gibt jeder Run dann eine aufgezeichnete Probe aus, als solche gekennzeichnet. Ein echtes Produkt zeigte seinen eigenen Hinweis.
Ein häufiger Fehler
Warnung
Viele glauben, ein Chatbot sei fertig, wenn die Vorführung klappt. Eine Vorführung nutzt freundliche Fragen. Probieren Sie knifflige Fragen, einen sehr langen Chat und gar kein Modell. Zählen Sie die Tokens, die ein Chat kostet, bevor andere ihn nutzen.
Die Modellhilfe 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.
Die Modellhilfe 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.
Den Chatbot schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const fs = require(\"fs\");' 'const { fragen } = require(\"./model\");' 'const BUDGET = 180; // Tokens für System-Nachricht und Verlauf zusammen' 'const QUELLEN = [' ' \"Mitglieder dürfen bis zu sechs Bücher drei Wochen lang ausleihen.\",' ' \"Ein verspätet zurückgegebenes Buch kostet zehn Cent pro Tag.\",' ' \"Die Bibliothek öffnet um neun Uhr und schließt werktags um siebzehn Uhr.\",' '];' > chatbot6.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 Chatbot schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function tokens(n) { return Math.ceil(n.content.length / 4) + 4; }' 'function summe(liste) {' ' return liste.reduce(function (s, n) { return s + tokens(n); }, 0);' '}' 'function systemNachricht() {' ' const nummeriert = QUELLEN.map(function (t, stelle) { return \"[\" + (stelle + 1) + \"] \" + t; }).join(\" \");' ' const regel = \"Sie sind der Assistent der Bibliothek. Antworten Sie in höchstens zwei Sätzen, nur mit diesen Quellen. Schreiben Sie nach jeder Tatsache die Nummer der Quelle in eckigen Klammern. Wenn sie es nicht sagen, antworten Sie: Das weiß ich nicht. \";' ' return { role: \"system\", content: regel + nummeriert };' '}' >> chatbot6.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 Chatbot schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function kuerzen(verlauf, system) {' ' const behalten = verlauf.slice();' ' while (summe([system].concat(behalten)) > BUDGET && behalten.length > 1) behalten.shift();' ' return behalten;' '}' 'function falscheMarker(antwort) {' ' const falsch = [];' ' const muster = /\[(\d+)\]/g;' ' let m = muster.exec(antwort);' ' while (m) {' ' if (Number(m[1]) < 1 || Number(m[1]) > QUELLEN.length) falsch.push(m[1]);' ' m = muster.exec(antwort);' ' }' ' return falsch;' '}' >> chatbot6.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 Chatbot schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function runde(zustand, text, probe) {' ' zustand.verlauf.push({ role: \"user\", content: text });' ' const system = systemNachricht();' ' const gesendet = kuerzen(zustand.verlauf, system);' ' const gehalten = zustand.verlauf.length;' ' const antwort = await fragen([system].concat(gesendet), probe, 70);' ' zustand.verlauf.push({ role: \"assistant\", content: antwort });' ' fs.writeFileSync(\"chat.json\", JSON.stringify(zustand, null, 1));' ' console.log(\"Sie: \" + text);' ' console.log(\"Bot: \" + antwort);' ' console.log(\" gesendet \" + gesendet.length + \" von \" + gehalten + \" Nachrichten, falsche Marker: \" + falscheMarker(antwort).length);' '}' >> chatbot6.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 Chatbot schreiben, Teil 5
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const zustand = { verlauf: [] };' ' // Aufgezeichnete Proben, nur benutzt, wenn kein Modell antwortet.' ' await runde(zustand, \"Wie viele Bücher darf ich ausleihen?\", \"Sie dürfen sechs Bücher drei Wochen lang ausleihen [1].\");' ' await runde(zustand, \"Und was kostet eine Verspätung?\", \"Ein verspätetes Buch kostet zehn Cent pro Tag [2].\");' ' await runde(zustand, \"Wann schließen Sie am Freitag?\", \"Die Bibliothek schließt werktags um siebzehn Uhr [3].\");' ' console.log(\"Gespeichert: \" + zustand.verlauf.length + \" Nachrichten in chat.json\");' '}' 'main();' >> chatbot6.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.
Einen Chat mit drei Runden führen
docker exec -w /home/node/project agent node chatbot6.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine mögliche Ausgabe
| Zeile | Was sie zeigen kann |
|---|---|
| Sie und Bot | Drei Fragen, jede mit einer kurzen Antwort, die eine Quelle nennen kann |
| gesendet n von m | gesendet 1 von 1, dann 3 von 3, dann 5 von 5 oder weniger. Die aufgezeichneten Antworten ergeben 4 von 5 |
| falsche Marker | Meist 0. Eine Zahl über 0 heißt, die Antwort nennt eine Quelle, die es nicht gibt |
| Gespeichert | Gespeichert: 6 Nachrichten in chat.json |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.