Wenn das Gespräch zu lang wird
Einen Chatverlauf zu kürzen heißt, dem Modell weniger Nachrichten zu schicken, damit die Liste in seine Grenze passt. Das ist nötig, weil ein langer Chat mit jeder Runde wächst und jede Nachricht Zeit und Guthaben kostet.
Nach einer Stunde mit einem Reise-Chatbot braucht niemand mehr die ersten Fragen. Sie zu entfernen hält den Chat schnell und billig.
Am Ende dieser Lektion
Notiz
Ich kann ein Gespräch innerhalb der Grenze des Modells halten.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Token | ein kleines Stück Text, das ein Modell zählt |
| Kontextgrenze | die meisten Tokens, die ein Modell je Aufruf annimmt |
| Budget | die meisten Tokens, die Sie senden wollen |
| Kürzen | alte Nachrichten entfernen, bis es passt |
| Zusammenfassung | ein kurzer Text anstelle entfernter Nachrichten |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Zählen Sie die Tokens vor dem Senden
Ein Modell zählt Text in Tokens und nimmt je Aufruf nur eine begrenzte Zahl an. Echte Zahlen liefert der Tokenizer des Modells. Eine grobe Schätzung: ein Token je vier Zeichen.
Diese Lektion addiert vier je Nachricht, für Rolle und Verpackung. Addieren Sie alle Nachrichten und vergleichen Sie die Summe mit Ihrem Budget.
Beispiel: sechs Nachrichten zählen
| Nachricht | Zeichen | Tokens |
|---|---|---|
| system: Sie helfen bei Zugreisen. Fassen Sie sich kurz. | 47 | 16 |
| user: Wie lange dauert die Fahrt von Köln nach Bonn? | 46 | 16 |
| assistant: Etwa eine halbe Stunde. | 23 | 10 |
| user: Und was kostet ein Ticket? | 26 | 11 |
| assistant: Das hängt von der Uhrzeit ab. | 29 | 12 |
| user: Gibt es einen Ruhewagen? | 24 | 10 |
| Summe | 195 | 75 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Älteste entfernen, Regeln behalten
Zum Kürzen entfernen Sie zuerst die ältesten Nachrichten, bis die Summe ins Budget passt. Zwei Nachrichten bleiben, was das Budget auch sagt: die system-Nachricht am Anfang und die neueste Nachricht am Ende.
Die system-Nachricht enthält die Regeln. Die neueste Nachricht ist die Frage, die gerade gestellt wird.
Eine Zusammenfassung ersetzt Entferntes
Entfernen verliert Fakten. Eine Zusammenfassung behält die wichtigsten in wenigen Worten. Bitten Sie das Modell, die entfernten Nachrichten zusammenzufassen, und hängen Sie sie an die system-Nachricht.
Das kostet bei jedem Kürzen einen Aufruf mehr. Bei einem kurzen Chat reicht oft das einfache Entfernen.
Ein häufiger Fehler
Warnung
Viele glauben, die älteste Nachricht sei immer die unwichtigste. Oft ist sie die system-Nachricht mit den Regeln oder die eine Tatsache, von der der Chat abhängt. Behalten Sie die system-Nachricht und fassen Sie zusammen, bevor Sie Wichtiges entfernen.
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.
Das Kürzungsskript schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const BUDGET = 50; // ein kleines Budget, damit gekürzt wird' '' 'function tokens(nachricht) { return Math.ceil(nachricht.content.length / 4) + 4; }' 'function summe(liste) {' ' return liste.reduce(function (s, n) { return s + tokens(n); }, 0);' '}' > kuerzen2.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.
Das Kürzungsskript schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function kuerzen(liste, budget) {' ' const behalten = liste.slice();' ' const entfernt = [];' ' while (summe(behalten) > budget && behalten.length > 2) {' ' const stelle = behalten[0].role === \"system\" ? 1 : 0;' ' entfernt.push(behalten.splice(stelle, 1)[0]);' ' }' ' return { behalten: behalten, entfernt: entfernt };' '}' >> kuerzen2.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.
Das Kürzungsskript schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const verlauf = [' ' { role: \"system\", content: \"Sie helfen bei Zugreisen. Fassen Sie sich kurz.\" },' ' { role: \"user\", content: \"Wie lange dauert die Fahrt von Köln nach Bonn?\" },' ' { role: \"assistant\", content: \"Etwa eine halbe Stunde.\" },' ' { role: \"user\", content: \"Und was kostet ein Ticket?\" },' ' { role: \"assistant\", content: \"Das hängt von der Uhrzeit ab.\" },' ' { role: \"user\", content: \"Gibt es einen Ruhewagen?\" },' '];' >> kuerzen2.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.
Das Kürzungsskript schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const ergebnis = kuerzen(verlauf, BUDGET);' ' console.log(\"Tokens vorher: \" + summe(verlauf) + \", nachher: \" + summe(ergebnis.behalten) + \", entfernt: \" + ergebnis.entfernt.length);' >> kuerzen2.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.
Das Kürzungsskript schreiben, Teil 5
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' const alt = ergebnis.entfernt.map(function (n) { return n.role + \": \" + n.content; }).join(\" \");' ' // Aufgezeichnete Proben, nur benutzt, wenn kein Modell antwortet.' ' const erste = \"Der Nutzer fragte nach der Fahrtdauer von Köln nach Bonn und erfuhr: etwa eine halbe Stunde.\";' ' const kurz = await fragen([{ role: \"user\", content: \"Fassen Sie in einem kurzen Satz zusammen: \" + alt }], erste, 50);' ' console.log(\"Zusammenfassung:\", kurz);' ' const anfrage = ergebnis.behalten.slice();' ' anfrage[0] = { role: \"system\", content: anfrage[0].content + \" Früher in diesem Chat: \" + kurz };' ' console.log(\"Antwort:\", await fragen(anfrage, \"Ja, die meisten Züge haben einen Ruhewagen.\", 50));' '}' 'main();' >> kuerzen2.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.
Kürzen und zusammenfassen
docker exec -w /home/node/project agent node kuerzen2.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 |
|---|---|
| Tokens | vorher: 75, nachher: 49, entfernt: 2 (immer gleich, nichts wird geraten) |
| Zusammenfassung | Ein Satz über die entfernte Fahrtdauer |
| Antwort | Eine kurze Antwort zu einem Ruhewagen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.