Einen Ordner zurückstellen, wie er war
Ein Schnappschuss ist eine Kopie jeder Datei in einem Ordner, gemacht, bevor ein Agent handelt. Ein Zurücksetzen stellt den Ordner auf diese Kopie zurück.
Das ist wichtig, weil selbst ein eingegrenzter Agent die Dateien ruinieren kann, die er anfassen darf. Mit einem Schnappschuss können Sie sagen: Alles zurück, genau so.
Am Ende dieser Lektion
Notiz
Ich kann einen Ordner so zurückstellen, wie er war, bevor ein Agent handelte.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Schnappschuss | eine Kopie jeder Datei samt Text |
| Unterschied | die Liste dessen, was sich zwischen zwei Zuständen geändert hat |
| Wiederherstellen | Dateien aus einem Schnappschuss zurückschreiben |
| Zurücksetzen | ein Wiederherstellen des ganzen Ordners |
| Neue Datei | eine Datei, die nicht im Schnappschuss war |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Schnappschuss enthält jede Datei
Bevor der Agent beginnt, lesen Sie jede Datei im Ordner und merken sich Pfad und Text. Bewahren Sie das dort auf, wo der Agent nicht hinkommt.
Verglichen wird nach Pfad. Nachdem der Agent gehandelt hat, ist eine Datei neu, wenn sie dazugekommen ist, entfernt, wenn sie fehlt, und geändert, wenn ihr Text anders ist.
Durchgerechnetes Beispiel: drei Änderungen
| Änderung des Agenten | Im Unterschied | Zum Zurückstellen |
|---|---|---|
| quellen/app.js mit neuem Text geschrieben | Geändert | Den alten Text schreiben |
| notizen.txt gelöscht | Entfernt | Die Datei erneut schreiben |
| neu.txt angelegt | Neu | Die Datei löschen |
| Eine Datei auf ihren alten Text zurückgeschrieben | Nichts | Nichts zu tun |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele denken, ein Zurücksetzen müsse nur die geänderten Dateien neu schreiben. Es muss auch die Dateien löschen, die der Agent angelegt hat, sonst ist der Ordner nicht wie vorher. Prüfen Sie dann: Nach dem Zurücksetzen muss der Unterschied leer sein.
Beweisen, dass das Zurücksetzen klappte
Ein Zurücksetzen, das Sie nicht prüfen, ist eine Hoffnung. Machen Sie danach einen neuen Schnappschuss und vergleichen Sie ihn mit dem ersten. Ist der Unterschied leer, ist der Ordner genau wie vorher.
Das vergleicht nur Dateien. Ein leerer Ordner, den der Agent anlegte, steht in keiner Dateiliste. Sagen Sie also, was Ihr Schnappschuss nicht abdeckt.
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 Rücksetz-Skript schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const fs = require(\"fs\");' 'const path = require(\"path\");' 'const wurzel = path.join(process.cwd(), \"sicherung-lab\");' 'function ablegen(rel, text) {' ' const f = path.join(wurzel, rel);' ' fs.mkdirSync(path.dirname(f), { recursive: true });' ' fs.writeFileSync(f, text);' '}' 'function namen(ordner) {' ' let aus = [];' ' for (const n of fs.readdirSync(ordner).sort()) {' ' const f = path.join(ordner, n);' ' aus = fs.statSync(f).isDirectory() ? aus.concat(namen(f)) : aus.concat([f]);' ' }' ' return aus;' '}' > sicherung.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 Rücksetz-Skript schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function aufnehmen() {' ' const s = {};' ' namen(wurzel).forEach(function (f) { s[path.relative(wurzel, f)] = fs.readFileSync(f, \"utf8\"); });' ' return s;' '}' 'function unterschied(a, b) {' ' const d = { neu: [], geaendert: [], entfernt: [] };' ' Object.keys(b).forEach(function (k) { if (a[k] === undefined) d.neu.push(k); else if (a[k] < b[k] || a[k] > b[k]) d.geaendert.push(k); });' ' Object.keys(a).forEach(function (k) { if (b[k] === undefined) d.entfernt.push(k); });' ' return d;' '}' >> sicherung.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 Rücksetz-Skript schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function zuruecksetzen(abzug) {' ' const jetzt = aufnehmen();' ' Object.keys(jetzt).forEach(function (k) { if (abzug[k] === undefined) fs.rmSync(path.join(wurzel, k)); });' ' Object.keys(abzug).forEach(function (k) { ablegen(k, abzug[k]); });' '}' >> sicherung.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 Rücksetz-Skript schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'fs.rmSync(wurzel, { recursive: true, force: true });' 'ablegen(\"quellen/app.js\", \"let x = 1;\");' 'ablegen(\"quellen/hilfen.js\", \"export {};\");' 'ablegen(\"notizen.txt\", \"offen\");' >> sicherung.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 Rücksetz-Skript schreiben, Teil 5
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const abzug = aufnehmen();' ' console.log(\"Schnappschuss: \" + Object.keys(abzug).join(\" \"));' ' ablegen(\"quellen/app.js\", \"let x = 2;\");' ' fs.rmSync(path.join(wurzel, \"notizen.txt\"));' ' ablegen(\"neu.txt\", \"hallo\");' ' console.log(\"Änderungen: \" + JSON.stringify(unterschied(abzug, aufnehmen())));' ' zuruecksetzen(abzug);' ' console.log(\"Nach dem Zurücksetzen gleich: \" + (JSON.stringify(aufnehmen()) === JSON.stringify(abzug)));' ' const q = \"Schreiben Sie in einem kurzen Satz, warum man einen Schnappschuss macht, bevor ein Agent Dateien ändert.\";' ' const probe = \"Gehen die Änderungen schief, kann man jede Datei genau so zurückstellen, wie sie war.\";' ' const antwort = await fragen([{ role: \"user\", content: q }], probe, 60);' ' console.log(\"Das Modell sagte: \" + antwort.text);' '}' 'main();' >> sicherung.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 Zurücksetzen ausführen
docker exec -w /home/node/project agent node sicherung.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 |
|---|---|
| Schnappschuss: notizen.txt quellen/app.js quellen/hilfen.js | Drei echte Dateien in sicherung-lab |
| Änderungen: {"neu":["neu.txt"],"geaendert":["quellen/app.js"],"entfernt":["notizen.txt"]} | Was der Ersatz-Agent tat |
| Nach dem Zurücksetzen gleich: true | Der Ordner gleicht wieder dem Schnappschuss |
| Das Modell sagte: ... | Ein Satz. Die Worte ändern sich bei jedem Lauf oder zeigen Aufgezeichnete Probe |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.