Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Einen funktionierenden Chatbot bauen

Nach dieser Lektion: Ich kann Zustand, Kürzen, Prompt, Datenstrom und Quellen in einem Chatbot vereinen.

Lektion, 70 Min.8 BefehleLab für KI-Coding-Agenten: mit opencode Code erklären und reparieren lassen und die Arbeit prüfen

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

BegriffWas er bedeutet
Chat-Schleifedie Schritte, die für jede Nutzernachricht wiederholt werden
Rundeeine Nutzernachricht und die Antwort darauf
Verlaufalle Nachrichten des Chats bisher
Budgetdie meisten Tokens, die Sie senden wollen
Notlösungwas 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

SchrittAus der LektionWas geschieht
Laden und hinzufügenEin Gespräch behaltenDie Nachricht der Nutzerin kommt in die Liste der Sitzung
KürzenEinen Verlauf kürzenAlte Nachrichten bleiben bei diesem Aufruf weg
Prompt und QuellenSystem-Prompt, ZitateDie System-Nachricht enthält die Regeln und die nummerierten Quellen
Aufrufen und prüfenZitateDie Antwort wird auf Marker ohne Quelle geprüft
Streamen und speichernDatenstrom in die SeiteDie 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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
docker exec -w /home/node/project agent node 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.

Eine mögliche Ausgabe

ZeileWas sie zeigen kann
Sie und BotDrei Fragen, jede mit einer kurzen Antwort, die eine Quelle nennen kann
gesendet n von mgesendet 1 von 1, dann 3 von 3, dann 5 von 5 oder weniger. Die aufgezeichneten Antworten ergeben 4 von 5
falsche MarkerMeist 0. Eine Zahl über 0 heißt, die Antwort nennt eine Quelle, die es nicht gibt
GespeichertGespeichert: 6 Nachrichten in chat.json

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Über dieses Lab und seinen Quellcode: Lab für KI-Coding-Agenten: mit opencode Code erklären und reparieren lassen und die Arbeit prüfen

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.