Der Agent, der nie fertig wurde
Ein KI-Agent ist eine Schleife, in der ein Modell seinen nächsten Schritt selbst wählt. Weil ihm nichts sagt, wann er aufgeben soll, braucht er einen Plan und eine Regel zum Stoppen.
Ein Support-Agent wiederholt die ganze Nacht eine Abfrage, die fehlschlägt. Jeder Versuch kostet Geld und keiner kann gelingen. Die Schleife war richtig. Es fehlte die Stoppregel.
Am Ende dieser Lektion
Notiz
Ich kann einen Agenten seine Schritte planen lassen und nach einer Regel stoppen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Agent | eine Schleife, in der ein Modell den nächsten Schritt wählt | |
| Plan | die Schritte, die ein Agent vorhat, als Daten | |
| Schrittbudget | die größte Zahl von Schritten eines Laufs | 3 |
| Stoppregel | ein Test, der die Schleife beendet | |
| Ausgang | der Grund, warum ein Lauf endete |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Plan ist ein Datum, kein Gefühl
Bitten Sie das Modell um einen Plan als JSON-Liste und behandeln Sie ihn als Datum. Ihr Programm kann ihn zählen, jeden Schritt prüfen und einer Person zeigen, bevor etwas läuft.
Ein Plan ist ein Vorschlag. Das Modell kann eine Liste in falscher Form liefern oder einen Schritt, den kein Werkzeug kann. Prüfen Sie den Plan, bevor Sie ihm folgen.
Ausgearbeitetes Beispiel: ein Plan und sein Lauf
| Schritt | Der Plan sagt | Ergebnis des Werkzeugs | Zustand des Laufs |
|---|---|---|---|
| 1 | brezel nachschlagen | brezel kostet 90 Cent | ok |
| 2 | semmel nachschlagen | semmel kostet 45 Cent | ok |
| 3 | kiwi nachschlagen | kein Werkzeug passt | fehler |
| 4 | die Preise nennen | nicht erreicht | Budget oder Stillstand entscheidet |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die 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\";' '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.
Die Modell-Hilfe schreiben, Teil 2
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.
Den planenden Agenten schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const PREISE = { brezel: 90, semmel: 45, apfel: 60 };' 'const nachrichten = [' ' { role: \"system\", content: \"Sie antworten nur mit JSON.\" },' ' { role: \"user\", content: \"Planen Sie, wie man den Preis einer Brezel, einer Semmel und einer Kiwi herausfindet. Antworten Sie mit einem JSON-Array aus 3 kurzen Texten, je einem Produkt. Antworten Sie nur mit dem JSON.\" },' '];' '// Aufgezeichnete Probe, nur benutzt, wenn kein Modell antwortet.' 'const probe = JSON.stringify([\"brezel\", \"semmel\", \"kiwi\"]);' > plan1.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.
Den planenden Agenten schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function schritt(text) {' ' const name = Object.keys(PREISE).find(function (k) { return text.toLowerCase().indexOf(k) >= 0; });' ' if (name === undefined) return { ok: false, notiz: \"kein Werkzeug passt: \" + text };' ' return { ok: true, notiz: name + \" kostet \" + PREISE[name] + \" Cent\" };' '}' >> plan1.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.
Den planenden Agenten schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const antwort = await fragen(nachrichten, probe, 100);' ' let plan = null;' ' try { plan = JSON.parse(antwort.slice(antwort.indexOf(\"[\"), antwort.lastIndexOf(\"]\") + 1)); } catch (fehler) { }' ' if (Array.isArray(plan) === false) { console.log(\"Keine Liste, ein fester Plan wird benutzt.\"); plan = [\"brezel\", \"semmel\"]; }' ' const budget = 3, maxFehler = 2;' ' let genutzt = 0, fehlschlaege = 0, ausgang = \"fertig\";' ' for (const text of plan) {' ' if (genutzt === budget) { ausgang = \"budget\"; break; }' ' genutzt += 1;' ' const r = schritt(String(text));' ' fehlschlaege = r.ok ? 0 : fehlschlaege + 1;' ' console.log(\"Schritt \" + genutzt + \": \" + r.notiz);' ' if (fehlschlaege === maxFehler) { ausgang = \"festgefahren\"; break; }' ' }' ' console.log(\"Ausgang: \" + ausgang + \" nach \" + genutzt + \" Schritten\");' '}' 'main();' >> plan1.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.
Den Agenten starten und den Ausgang lesen
docker exec -w /home/node/project agent node plan1.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine mögliche Ausgabe
| Zeile | Was sie zeigen kann |
|---|---|
| Schritt 1 und 2 | Die Preise von Brezel und Semmel |
| Schritt 3 | kein Werkzeug passt: kiwi |
| Ausgang | fertig nach 3 Schritten, denn ein Fehler sind noch nicht zwei hintereinander |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Drei Arten, wie ein Lauf endet
Ein Lauf kann enden, weil die Arbeit fertig ist, weil der Agent festgefahren ist oder weil das Budget aufgebraucht ist. Jeder Ausgang ist eine andere Meldung an die Nutzer und eine andere Zeile im Protokoll.
Prüfen Sie sie in dieser Reihenfolge. Ein Lauf, der im letzten erlaubten Schritt endet, ist fertig, nicht über dem Budget. Festgefahren heißt wiederholte Fehler ohne Fortschritt.
Ein häufiger Fehler
Warnung
Viele glauben, ein Budget allein sei eine Stoppregel. Ein Budget begrenzt nur die Kosten. Es unterscheidet einen fertigen Lauf nicht von einem festgefahrenen. Behalten Sie das Budget als letztes Mittel und ergänzen Sie Regeln für fertig und festgefahren.