Wie ein Kontextbudget funktioniert
Ein Kontextbudget legt fest, wie viele Token jeder Teil eines Prompts verbrauchen darf. Ein Modell liest nur begrenzt viel auf einmal, also muss etwas weichen, wenn die Teile zusammen zu viel werden.
Das Modul über Kosten, Tracing und Zuverlässigkeit plant Geld und Aufrufe. Diese Lektion geht weiter: Sie plant das Fenster selbst, entscheidet, welcher Teil zuerst weicht, und sagt der Nutzerin, was fehlt.
Am Ende dieser Lektion
Notiz
Ich kann entscheiden, was in ein Fenster passt und was zuerst weicht.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Token | ein kleines Stück Text, das ein Modell zählt | etwa ein Wort |
| Fenster | die meisten Token, die ein Modell in einem Aufruf lesen und schreiben kann | |
| Budget | die Token, die ein Teil des Prompts verbrauchen darf | |
| Priorität | wie wichtig ein Teil ist; 0 wird nie verworfen | |
| Kürzen | einen Teil kleiner machen, damit er passt | |
| Reserve | Platz, der für die Antwort frei bleibt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Auch die Antwort braucht Platz
Das Fenster teilen sich der Prompt und die Antwort. Füllt der Prompt es ganz, wird die Antwort abgeschnitten, oder der Aufruf scheitert.
Halten Sie also zuerst Platz für die Antwort frei. Dann ziehen Sie einen kleinen Sicherheitsabstand ab, denn Ihre Zählung ist nur eine Schätzung. Der Rest ist das Prompt-Budget.
Durchgerechnetes Beispiel: das Prompt-Budget
| Schritt | Token | Warum |
|---|---|---|
| Fenster | 4000 | Das Meiste, was das Modell verarbeitet |
| Reserve für die Antwort | 500 | Die Antwort braucht Platz |
| Sicherheit, 5 Prozent | 200 | 5 Prozent von 4000, falls die Zählung etwas abweicht |
| Prompt-Budget | 3300 | 4000 minus 500 minus 200 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele denken, das Fenster gehöre nur dem Prompt. Das stimmt nicht: Es enthält auch die Antwort. Ein Prompt, der das ganze Fenster füllt, lässt keinen Platz zum Antworten.
Welcher Teil kommt zuerst?
Geben Sie jedem Teil eine Priorität. Die Regeln und die Frage der Nutzerin haben Priorität 0: Sie werden nie verworfen. Passen sie nicht, ist der Prompt kaputt, und Sie müssen es melden.
Dann nehmen Sie den Rest nach Wichtigkeit. Passt ein Teil, bleibt er. Passt er nicht, wird er verworfen, aber ein kleinerer Teil danach kann noch passen.
Durchgerechnetes Beispiel: Budget 3300
| Teil | Token | Priorität | Summe bisher | Ergebnis |
|---|---|---|---|---|
| Regeln | 300 | 0 | 300 | Behalten |
| Frage | 100 | 0 | 400 | Behalten |
| Dokument A | 900 | 1 | 1300 | Behalten |
| Dokument B | 800 | 2 | 2100 | Behalten |
| Dokument C | 700 | 2 | 2800 | Behalten |
| Verlauf | 1400 | 3 | 4200 wäre zu viel | Verworfen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Kürzen statt alles verwerfen
Wer den Verlauf ganz verwirft, verliert das ganze Gespräch. Besser kürzen Sie ihn: Behalten Sie die neuesten Nachrichten, die noch passen.
Gehen Sie von der neuesten Nachricht rückwärts. Halten Sie bei der ersten an, die nicht passt, denn eine Lücke mitten im Gespräch ergibt keinen Sinn.
Durchgerechnetes Beispiel: 500 Token übrig
| Nachricht | Token | Summe | Ergebnis |
|---|---|---|---|
| Neueste | 200 | 200 | Behalten |
| Eine davor | 250 | 450 | Behalten |
| Zwei davor | 300 | 750 wäre zu viel | Hier anhalten |
| Älteste | 40 | Nie erreicht | Verworfen, obwohl sie mit 490 passen würde |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
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\";' '// Die Token einer Antwort oder null, wenn sie keine nennt.' 'function zaehlen(daten, name) {' ' return daten.usage && typeof daten.usage[name] === \"number\" ? daten.usage[name] : null;' '}' > 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' '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 || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"Status \" + res.status);' ' const d = await res.json();' ' return { text: d.choices[0].message.content, eingabe: zaehlen(d, \"prompt_tokens\"), ausgabe: zaehlen(d, \"completion_tokens\"), aufgezeichnet: false };' ' } catch (fehler) {' ' console.log(\"Aufgezeichnete Probe: Kein Modell hat geantwortet (\" + fehler.message + \").\");' ' return { text: probe, eingabe: null, ausgabe: null, aufgezeichnet: true };' ' }' '}' '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 Budget-Skript schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'function woerter(text) { return text.split(\" \").length; }' 'const teile = [' ' { name: \"Regeln\", token: 60, prio: 0 },' ' { name: \"Frage\", token: 25, prio: 0 },' ' { name: \"Dokument A\", token: 120, prio: 1 },' ' { name: \"Dokument B\", token: 90, prio: 2 },' ' { name: \"Verlauf\", token: 150, prio: 3 },' ' { name: \"Dokument C\", token: 80, prio: 2 },' '];' > budget.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 Budget-Skript schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function zusammenstellen(teile, budget) {' ' const reihe = teile.slice().sort(function (a, b) { return a.prio - b.prio; });' ' const behalten = [];' ' let benutzt = 0;' ' for (const t of reihe) {' ' if (t.prio === 0 || benutzt + t.token <= budget) { behalten.push(t.name); benutzt = benutzt + t.token; }' ' }' ' return { behalten: behalten, benutzt: benutzt };' '}' >> budget.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 Budget-Skript schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' for (const budget of [350, 600]) {' ' const e = zusammenstellen(teile, budget);' ' const namen = teile.map(function (t) { return t.name; });' ' console.log(\"Budget \" + budget + \": behalten \" + namen.filter(function (n) { return e.behalten.includes(n); }).join(\", \"));' ' console.log(\" verworfen \" + (namen.filter(function (n) { return e.behalten.includes(n) === false; }).join(\", \") || \"keine\") + \", benutzt \" + e.benutzt);' ' }' >> budget.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 Budget-Skript schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' const f = \"Was sollte ein zu langer Prompt zuerst verlieren? Antworten Sie in einem kurzen Satz.\";' ' const probe = \"Zuerst gehen die ältesten oder unwichtigsten Teile verloren, niemals die Regeln oder die Frage.\";' ' const antwort = await fragen([{ role: \"user\", content: f }], probe, 60);' ' console.log(\"Das Modell sagte: \" + antwort.text);' ' console.log(\"Meine Zahl \" + woerter(f) + \", Zahl des Modells \" + (antwort.eingabe === null ? \"nicht gemeldet\" : antwort.eingabe));' '}' 'main();' >> budget.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 Budget ausführen
docker exec -w /home/node/project agent node budget.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 Run ausgibt
| Zeile | Was sie zeigt |
|---|---|
| Budget 350: behalten Regeln, Frage, Dokument A, Dokument B | Die Teile, die passen, in ihrer ersten Reihenfolge |
| verworfen Verlauf, Dokument C, benutzt 295 | Was fehlt, und die benutzten Token |
| Budget 600: behalten ... und verworfen keine | Bei viel Platz kommt jeder Teil hinein |
| Das Modell sagte: ... | Ein Satz aus dem Labor. Eine Aufgezeichnete Probe, wenn kein Modell antwortet |
| Meine Zahl 14, Zahl des Modells ... | Meine Wortzahl neben der Zahl des Modells oder nicht gemeldet |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.