Die Teile in einer Schleife vereinen
Ein Agenten-Harness ist das Programm um das Modell: Es baut das Fenster, führt die Werkzeuge aus, wendet den Modus an und zeichnet die Änderungen auf. Das Modell schlägt nur einen Schritt vor. Das Harness entscheidet, was geschieht.
Diese Lektion vereint die fünf früheren in einer Schleife, die Sie ausführen und zurückspulen können.
Am Ende dieser Lektion
Notiz
Ich kann Kontext, Werkzeuge, Modi, Isolation und Rückgängig in einem Harness vereinen, das ich ausführen und zurückspulen kann.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Harness | das Programm, das einen Agenten um ein Modell herum betreibt |
| Schleife | einen Schritt anfordern, entscheiden, handeln, aufzeichnen, wiederholen |
| Skriptmodell | eine feste Liste von Schritten, die ein Modell ersetzt |
| Verlauf | die Aufzeichnung jedes Schritts und seines Ausgangs |
| Fenster | die letzten Ergebnisse, die als Nächstes an das Modell gehen |
| Zurückspulen | alle Änderungen nach einem gewählten Schritt rückgängig machen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die Schleife, Schritt für Schritt
In jeder Runde fordert das Harness einen Schritt vom Modell an. Es entscheidet nach Modus: erlauben, nachfragen oder verweigern. Muss es nachfragen, antwortet die Person. Ist der Schritt erlaubt, notiert das Harness, was er ersetzen wird, und führt ihn dann aus.
Das Ergebnis geht in ein Fenster, das nur die letzten behält. Dann wiederholt sich die Schleife, bis das Modell sagt, dass es fertig ist.
Was jede frühere Lektion beisteuert
| Lektion | Ihr Platz in der Schleife |
|---|---|
| Kontext | Das Fenster behält nur die letzten Ergebnisse |
| Werkzeuge | Jeder Schritt nennt ein schmales Werkzeug |
| Modi | Eine Funktion entscheidet erlauben, nachfragen oder verweigern |
| Isolation | Eine Nebenaufgabe gibt ein kurzes Ergebnis ins Fenster |
| Rückgängig | Vor einer Änderung wird ein Protokolleintrag geschrieben |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele lassen einen abgelehnten Schritt verschwinden. Dann erfährt das Modell nie, dass er abgelehnt wurde, und fragt erneut. Halten Sie die Ablehnung als Ergebnis fest, damit das nächste Fenster sie zeigt.
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.
Das Harness schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const RISIKO = { datei_lesen: \"lesen\", datei_schreiben: \"schreiben\", datei_loeschen: \"zerstoerend\", ausfuehren: \"ausfuehren\" };' 'const skript = [' ' { werkzeug: \"datei_lesen\", pfad: \"app.py\" },' ' { werkzeug: \"datei_schreiben\", pfad: \"app.py\", text: \"x = 2\" },' ' { werkzeug: \"ausfuehren\", pfad: \"pytest\" },' ' { werkzeug: \"datei_loeschen\", pfad: \"notizen.txt\" },' ' { werkzeug: \"datei_schreiben\", pfad: \".env\", text: \"SCHLUESSEL=1\" },' ' { werkzeug: \"fertig\" },' '];' 'const dateien = { \"app.py\": \"x = 1\", \"notizen.txt\": \"offen\" };' 'const protokoll = [];' > harness6.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 Harness schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function entscheide(modus, risiko, pfad) {' ' if (modus === \"plan\") return risiko === \"lesen\" ? \"erlauben\" : \"verweigern\";' ' if (pfad.startsWith(\".env\") || risiko === \"zerstoerend\") return \"nachfragen\";' ' if (modus === \"auto\" && (risiko === \"lesen\" || risiko === \"schreiben\")) return \"erlauben\";' ' if (modus === \"fragen\" && risiko === \"lesen\") return \"erlauben\";' ' return \"nachfragen\";' '}' >> harness6.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 Harness schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function handeln(s, n) {' ' if (s.werkzeug === \"datei_lesen\") return s.pfad in dateien ? dateien[s.pfad] : \"fehlt\";' ' if (s.werkzeug === \"ausfuehren\") return \"ausgeführt \" + s.pfad;' ' protokoll.push({ schritt: n, pfad: s.pfad, vorher: s.pfad in dateien ? dateien[s.pfad] : null });' ' if (s.werkzeug === \"datei_schreiben\") { dateien[s.pfad] = s.text; return \"geschrieben \" + s.pfad; }' ' delete dateien[s.pfad];' ' return \"gelöscht \" + s.pfad;' '}' >> harness6.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 Harness schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function alleAusfuehren(modus, freigaben) {' ' const verlauf = [];' ' for (let i = 0; i < skript.length; i++) {' ' const s = skript[i];' ' if (s.werkzeug === \"fertig\") break;' ' const v = entscheide(modus, RISIKO[s.werkzeug], s.pfad);' ' let ausgang = v === \"erlauben\" ? \"ok\" : \"gesperrt\";' ' if (v === \"nachfragen\") ausgang = freigaben.shift() === true ? \"freigegeben\" : \"abgelehnt\";' ' const gut = ausgang === \"ok\" || ausgang === \"freigegeben\";' ' verlauf.push({ schritt: i + 1, werkzeug: s.werkzeug, pfad: s.pfad, ausgang: ausgang, ergebnis: gut ? handeln(s, i + 1) : ausgang });' ' }' ' return verlauf;' '}' >> harness6.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 Harness schreiben, Teil 5
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function bisSchritt(schritt) {' ' for (const e of protokoll.slice().reverse()) {' ' if (e.schritt <= schritt) continue;' ' if (e.vorher === null) delete dateien[e.pfad];' ' else dateien[e.pfad] = e.vorher;' ' }' '}' >> harness6.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 Harness schreiben, Teil 6
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const verlauf = alleAusfuehren(\"auto\", [true, false]);' ' for (const o of verlauf) console.log(o.schritt + \" \" + o.werkzeug + \" \" + o.pfad + \" \" + o.ausgang + \" -> \" + o.ergebnis);' ' console.log(\"Fenster \" + JSON.stringify(verlauf.slice(-3).map(function (o) { return o.ergebnis; })));' ' console.log(\"Dateien \" + JSON.stringify(dateien));' ' bisSchritt(1);' ' console.log(\"nach Zurück bis 1 \" + JSON.stringify(dateien));' ' const text = verlauf.map(function (o) { return o.werkzeug + \" \" + o.ausgang; }).join(\", \");' ' const antwort = await fragen([{ role: \"user\", content: \"Schreiben Sie eine einzeilige Commit-Nachricht für einen Lauf, der Folgendes tat: \" + text }], \"Summe des Warenkorbs in app.py korrigieren\", 30);' ' console.log(\"Nachricht: \" + antwort.text);' '}' 'main();' >> harness6.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 Harness ausführen und zurückspulen
docker exec -w /home/node/project agent node harness6.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Modell ist ein Skript
Die Schritte stammen aus einer festen Liste, sodass alle denselben Lauf ausgeben. Ein echtes Harness würde jeden Schritt beim Modell anfordern. Der kurze Modellaufruf schreibt nur eine Commit-Nachricht aus dem, was der Lauf getan hat.
Ohne Modell gibt er für diese Zeile eine aufgezeichnete Probe aus.
Eine mögliche Ausgabe
| Zeile | Was sie zeigt |
|---|---|
| 1 datei_lesen app.py ok -> x = 1 | Ein Lesen geht im Modus auto durch |
| 3 ausfuehren pytest freigegeben -> ausgeführt pytest | Die erste Freigabe war Ja |
| 4 datei_loeschen notizen.txt abgelehnt -> abgelehnt | Die zweite Freigabe war Nein |
| 5 datei_schreiben .env abgelehnt -> abgelehnt | Keine Freigabe übrig, also Nein |
| Dateien {"app.py":"x = 2","notizen.txt":"offen"} | Nur das Schreiben hat etwas geändert |
| nach Zurück bis 1 {"app.py":"x = 1",...} | Das Zurückspulen stellte das Schreiben zurück |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.