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

Kontext-Engineering für LLM-Agenten

Nach dieser Lektion: Ich kann entscheiden, was in jedem Schritt ins Fenster kommt, jedem Teil ein Budget geben und sagen, was zuerst entfernt wird.

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

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

BegriffWas er bedeutet
Kontextfensteralles, was das Modell in einem Aufruf liest
Budgetdie größte Zahl Tokens, die ein Fenster fassen darf
Angeheftetein Teil, der nie entfernt wird
Werkzeugergebniswas ein Werkzeug ausgegeben hat, zurück an das Modell
GedächtnisNotizen, die zwischen Läufen bleiben und am Anfang geladen werden
Entfernreihenfolgewelche 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

TeilEntferntWarum
WerkzeugergebnisseZuerst, die ältesten vornDas Werkzeug kann erneut laufen
DateienDanach, außer angeheftetDie Datei lässt sich erneut lesen
GedächtnisAls DrittesNotizen sind langsamer neu aufzubauen
VerlaufZuletztEr hält fest, was die Person wollte
AnweisungenNieOhne 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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

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

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

ZeileWas sie zeigt
Budget 55, verbraucht 53Das Fenster passt jetzt
behalten anweisungen regeln 18Anweisungen werden nie entfernt
entfernt werkzeugergebnis lauf 1 13Das älteste Werkzeugergebnis geht zuerst
entfernt werkzeugergebnis lauf 2 4Das Entfernen endet, sobald es passt
behalten datei liesmich 10Keine 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.

Ü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.