Wählen, was das Modell sieht
Kontext-Engineering heißt, in jedem Schritt eines Agentenlaufs zu entscheiden, was ins Fenster des Modells kommt. Das Fenster ist begrenzt, also ist jeder Teil eine Entscheidung.
Ein Agent, der alle Dateien und alle Werkzeugergebnisse behält, füllt sein Fenster im sechsten Schritt. Dann liegen die wichtigen Anweisungen unter Ausgaben, die niemand braucht.
Am Ende dieser Lektion
Notiz
Ich kann entscheiden, was in jedem Schritt ins Fenster kommt, jedem Teil ein Budget geben und sagen, was zuerst entfernt wird.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Kontextfenster | alles, was das Modell in einem Aufruf liest |
| Budget | die größte Zahl Tokens, die ein Fenster fassen darf |
| Angeheftet | ein Teil, der nie entfernt wird |
| Werkzeugergebnis | was ein Werkzeug ausgegeben hat, zurück an das Modell |
| Gedächtnis | Notizen, die zwischen Läufen bleiben und am Anfang geladen werden |
| Entfernreihenfolge | welche Teile zuerst gehen, wenn das Fenster voll ist |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Fenster besteht aus Teilen
Jeder Aufruf sendet Teile in fester Reihenfolge. Die Anweisungen sagen, wer der Agent ist und was er darf. Das Gedächtnis hält dauerhafte Notizen. Die Dateien sind das, woran er arbeitet. Die Werkzeugergebnisse sind das, was seine Werkzeuge ausgegeben haben. Der Verlauf ist das Gespräch bisher.
Wie ein Gedächtnis gespeichert wird, lernen Sie im Modul „Agenten bauen“. Hier geht es nur darum, wie viel davon hineinpasst.
Was zuerst entfernt wird
Geben Sie dem ganzen Fenster ein Budget und entfernen Sie Teile, bis es passt. Entfernen Sie zuerst, was am billigsten neu zu bauen ist. Ein altes Werkzeugergebnis lässt sich erneut anfordern. Eine Datei lässt sich erneut lesen. Das Gedächtnis ist langsamer neu aufzubauen.
Entfernen Sie nie die Anweisungen. Heften Sie die Datei an, die gerade bearbeitet wird. Hören Sie auf, sobald das Fenster passt, denn jedes überflüssige Entfernen verliert etwas.
Entfernreihenfolge für einen Code-Agenten
| Teil | Entfernt | Warum |
|---|---|---|
| Werkzeugergebnisse | Zuerst, die ältesten vorn | Das Werkzeug kann erneut laufen |
| Dateien | Danach, außer angeheftet | Die Datei lässt sich erneut lesen |
| Gedächtnis | Als Drittes | Notizen sind langsamer neu aufzubauen |
| Verlauf | Zuletzt | Er hält fest, was die Person wollte |
| Anweisungen | Nie | Ohne sie hat der Agent keine Regeln |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele kürzen von vorn und entfernen die ältesten Nachrichten, egal was sie enthalten. Dann gehen die Anweisungen zuerst. Entfernen Sie nach der Art eines Teils, nicht nach seinem Alter.
Modell-Hilfe 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.
Modell-Hilfe 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.
Fensterbauer schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const BUDGET = 55;' '// Ein Token ist hier ein Wort. Ein echter Tokenizer zählt anders.' 'function groesse(text) { return text.split(\" \").length; }' 'const teile = [' ' { art: \"anweisungen\", name: \"regeln\", text: \"Sie sind ein Code-Assistent. Ändern Sie nur Dateien, die Ihnen gezeigt wurden. Sagen Sie, was Sie geändert haben.\" },' ' { art: \"gedaechtnis\", name: \"notizen\", text: \"Das Projekt nutzt Tabulatoren. Die Tests liegen in tests. Starten Sie sie vor jedem Commit.\" },' ' { art: \"datei\", name: \"app.py\", angeheftet: true, text: \"def summe(posten): return sum(posten) # addiert die Preise eines Warenkorbs\" },' '];' > kontext1.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.
Fensterbauer schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'teile.push({ art: \"werkzeugergebnis\", name: \"lauf 1\", text: \"3 bestanden 1 fehlgeschlagen test_summe erwartet 12 erhalten 10 in tests slash test_app\" });' 'teile.push({ art: \"werkzeugergebnis\", name: \"lauf 2\", text: \"4 bestanden 0 fehlgeschlagen\" });' 'teile.push({ art: \"datei\", name: \"liesmich\", text: \"Ein kleines Shop-Skript, das Warenkörbe berechnet und eine Quittung druckt.\" });' 'const REIHENFOLGE = [\"werkzeugergebnis\", \"datei\", \"gedaechtnis\"];' 'function gesamt(liste) {' ' let summe = 0;' ' for (const t of liste) summe = summe + groesse(t.text);' ' return summe;' '}' >> kontext1.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.
Fensterbauer schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function zusammenstellen(alle, budget) {' ' const behalten = alle.slice();' ' const entfernt = [];' ' for (const art of REIHENFOLGE) {' ' for (const t of alle) {' ' if (gesamt(behalten) <= budget) break;' ' if (t.art === art && t.angeheftet === undefined) {' ' behalten.splice(behalten.indexOf(t), 1);' ' entfernt.push(t.name);' ' }' ' }' ' }' ' return { behalten: behalten, entfernt: entfernt, verbraucht: gesamt(behalten) };' '}' >> kontext1.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.
Fensterbauer schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const f = zusammenstellen(teile, BUDGET);' ' console.log(\"Budget \" + BUDGET + \", verbraucht \" + f.verbraucht);' ' for (const t of teile) {' ' console.log((f.behalten.includes(t) ? \"behalten \" : \"entfernt \") + t.art + \" \" + t.name + \" \" + groesse(t.text));' ' }' ' const rumpf = f.behalten.slice(1).map(function (t) { return t.name + \": \" + t.text; }).join(\" | \");' ' const frage = rumpf + \" | Welche Datei ändern Sie zuerst? Ein Satz.\";' ' const nachrichten = [{ role: \"system\", content: f.behalten[0].text }, { role: \"user\", content: frage }];' ' const antwort = await fragen(nachrichten, \"Ich ändere zuerst app.py, weil der fehlgeschlagene Test die Summe betrifft.\", 40);' ' console.log(\"Modell: \" + antwort.text);' '}' 'main();' >> kontext1.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.
Ausführen und Entferntes ansehen
docker exec -w /home/node/project agent node kontext1.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Wörter stehen für Tokens
Ein echtes Fenster wird mit dem Tokenizer des Modells in Tokens gezählt. Hier ist ein Wort ein Token, sodass alle dieselben Größen sehen. Die Idee bleibt gleich: Teile addieren und mit einer Grenze vergleichen.
Der Run macht einen kurzen Aufruf mit dem Behaltenen. Ohne Modell gibt er eine aufgezeichnete Probe aus.
Eine mögliche Ausgabe
| Zeile | Was sie zeigt |
|---|---|
| Budget 55, verbraucht 53 | Das Fenster passt jetzt |
| behalten anweisungen regeln 18 | Anweisungen werden nie entfernt |
| entfernt werkzeugergebnis lauf 1 13 | Das älteste Werkzeugergebnis geht zuerst |
| entfernt werkzeugergebnis lauf 2 4 | Das Entfernen endet, sobald es passt |
| behalten datei liesmich 10 | Keine Datei wurde entfernt, das liesmich bleibt |
| Modell: ... | Ein Satz. Die Wörter ändern sich bei jedem Lauf |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.