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

Prüfen, was ein KI-Agent verändert hat

Nach dieser Lektion: Ich kann prüfen, was ein Lauf verändert hat, statt was er gesagt hat.

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

Er sagte, er habe die Bestellung erstattet

Eine Endzustandsprüfung vergleicht, was ein Lauf verändert hat, mit dem, was er verändern sollte. Sie lohnt sich, denn ein Agent schreibt einen selbstsicheren Bericht, ob die Arbeit getan ist oder nicht.

Zwei Läufe des Shop-Agenten sagen „Erledigt, A17 ist erstattet“. Nur einer hat es getan.

Am Ende dieser Lektion

Notiz

Ich kann prüfen, was ein Lauf verändert hat, statt was er gesagt hat.

Schlüsselwörter

BegriffWas er bedeutet
Endzustandwas die Welt enthält, wenn der Lauf endet
Erwarteter Zustandder Endzustand, den ein richtiger Lauf hinterlässt
Unterschiedeine Stelle, an der die beiden Zustände abweichen
Nebenwirkungeine Änderung, die die Aufgabe nicht verlangte
Eintragein Element des Zustands, etwa eine Bestellung

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

Vergleichen Sie den Zustand, nicht den Satz

Die meisten Agenten verändern etwas: eine Datei, eine Zeile, ein Ticket. Prüfen Sie daher den Endzustand. Bauen Sie eine frische Kopie der Welt, spielen Sie den Lauf darauf ab und vergleichen Sie das Ergebnis mit dem erwarteten Zustand.

Jede Stelle, an der beide nicht übereinstimmen, ist ein Unterschied. Eine leere Liste von Unterschieden ist bestanden.

Durchgerechnetes Beispiel: die drei aufgezeichneten Läufe

LaufWas er sagteWas er tatZustandsprüfung
AA17 ist erstatteterstattete A17stimmt
BA17 ist erstattetschrieb nur eine NotizA17 ist weiter bezahlt
CA17 erstatteterstattete A17 und B02B02 änderte sich, zu Unrecht

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

Suchen Sie Änderungen, die niemand verlangt hat

Ein Lauf kann den erwarteten Zustand erreichen und trotzdem Schaden anrichten. Lauf C erstattete eine zweite Bestellung. Der erwartete Zustand würde das zeigen, aber nur, wenn die Prüfung jeden Eintrag ansieht.

Eine Nebenwirkung ist ein Eintrag, der sich änderte, obwohl die Aufgabe ihn unberührt lassen wollte. Vergleichen Sie den Zustand vorher mit dem nachher und listen Sie diese Einträge auf.

Modell-Helfer 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.

Modell-Helfer 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.

Shop und Läufe schreiben

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const start = {' '  A17: { status: \"bezahlt\", betrag: 1200 },' '  B02: { status: \"versendet\", betrag: 800 },' '};' 'const erwartet = {' '  A17: { status: \"erstattet\", betrag: 1200 },' '  B02: { status: \"versendet\", betrag: 800 },' '};' '// Aufgezeichnete Läufe. Jeder sagt eine Sache und tut eine andere Liste von Dingen.' 'const laeufe = [' '  { name: \"Lauf A\", sagt: \"Erledigt, A17 ist erstattet.\", aktionen: [[\"erstatten\", \"A17\"]] },' '  { name: \"Lauf B\", sagt: \"Erledigt, A17 ist erstattet.\", aktionen: [[\"notiz\", \"A17\"]] },' '  { name: \"Lauf C\", sagt: \"A17 erstattet.\", aktionen: [[\"erstatten\", \"A17\"], [\"erstatten\", \"B02\"]] },' '];' 'module.exports = { start, erwartet, laeufe };' > shop.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.

Zustandsprüfung schreiben, Teil 1

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { start, erwartet, laeufe } = require(\"./shop\");' 'const { fragen } = require(\"./model\");' 'function kopie(zustand) { return JSON.parse(JSON.stringify(zustand)); }' 'function anwenden(aktionen) {' '  const zustand = kopie(start);' '  aktionen.forEach(function (aktion) {' '    if (aktion[0] === \"erstatten\") zustand[aktion[1]].status = \"erstattet\";' '  });' '  return zustand;' '}' > pruefen.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.

Zustandsprüfung schreiben, Teil 2

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function unterschiede(soll, ist) {' '  const zeilen = [];' '  Object.keys(soll).sort().forEach(function (id) {' '    Object.keys(soll[id]).sort().forEach(function (feld) {' '      if ((soll[id][feld] === ist[id][feld]) === false) {' '        zeilen.push(id + \".\" + feld + \": erwartet \" + soll[id][feld] + \", erhalten \" + ist[id][feld]);' '      }' '    });' '  });' '  return zeilen;' '}' >> pruefen.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.

Zustandsprüfung schreiben, Teil 3

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'laeufe.forEach(function (lauf) {' '  const gefunden = unterschiede(erwartet, anwenden(lauf.aktionen));' '  console.log(lauf.name + \" sagt: \" + lauf.sagt);' '  console.log(lauf.name + \" Zustand: \" + (gefunden.length === 0 ? \"stimmt\" : gefunden.join(\"; \")));' '});' 'async function main() {' '  const frage = \"Das Erstattungswerkzeug hat für die Bestellung A17 einen Fehler gemeldet. Schreiben Sie einen kurzen Satz, der das Ihrer Teamleitung mitteilt.\";' '  const probe = \"Die Erstattung der Bestellung A17 ist mit einem Fehler gescheitert, die Bestellung bleibt also bezahlt.\";' '  const text = await fragen([{ role: \"user\", content: frage }], probe, 60);' '  console.log(\"Bericht live: \" + text.trim());' '  console.log(\"Zustandsprüfung: A17 ist weiterhin \" + start.A17.status + \", was die Worte auch sagen.\");' '}' 'main();' >> pruefen.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 drei Endzustände prüfen

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

Was die Prüfung ausgibt

ZeileWas sie zeigt
Lauf Astimmt
Lauf BA17.status: erwartet erstattet, erhalten bezahlt
Lauf CB02.status: erwartet versendet, erhalten erstattet
Bericht liveEine mögliche Ausgabe: ein Satz über die gescheiterte Erstattung
ZustandsprüfungA17 ist weiter bezahlt

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

Probieren Sie es aus

Tipp

Geben Sie in shop.js dem Lauf A die Aktionen erstatten A17 und notiz A17. Prüfen Sie erneut. Der Zustand stimmt weiter, denn eine Notiz ändert nichts von dem, was der erwartete Zustand enthält.

Ein häufiger Fehler

Warnung

Viele vergleichen nur die Felder, die die Aufgabe nennt. So besteht ein Lauf, der zusätzlich etwas anderes löschte. Vergleichen Sie den ganzen Zustand oder listen Sie die Felder auf, die Sie ignorieren, samt Grund, etwa einen Zeitstempel, der sich bei jedem Lauf ändert.

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