Einer Nebenaufgabe ein eigenes Fenster geben
Ein Subagent ist ein zweiter Modellaufruf, der eine Nebenaufgabe übernimmt, in einem frischen Fenster arbeitet und eine kurze Antwort zurückgibt. Der Elternagent sieht die Arbeit nie, nur das Ergebnis.
Darum geht es. Eine Suche, die vierzig Dateien liest, würde das Fenster des Elternagenten füllen. In einem Subagenten erledigt, kostet sie ihn wenige Zeilen.
Am Ende dieser Lektion
Notiz
Ich kann einer Nebenaufgabe einen eigenen Kontext geben und nur die Antwort zurücknehmen, mit einem Briefing hinein und einem kurzen Ergebnis heraus.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Subagent | ein Modellaufruf, der allein eine Nebenaufgabe erledigt |
| Isolation | die Nebenaufgabe hat ein eigenes Fenster |
| Briefing | die kurze Nachricht, die einen Subagenten startet |
| Vertrag | die Felder und die Größe, die ein Ergebnis haben muss |
| Ergebnis | was der Subagent zurückgibt |
| Elternagent | der Agent, der die Nebenaufgabe angefordert hat |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Subagent ist keine Übergabe
Bei einer Übergabe geht die ganze Arbeit an einen anderen Agenten, der weitermacht. Ein Subagent ist anders. Der Elternagent bleibt zuständig und stellt eine einzige Frage.
Der Subagent startet leer. Er sieht den Verlauf des Elternagenten nicht. Er sieht das Briefing und sonst nichts.
Erst ein Briefing, dann ein Vertrag
Ein gutes Briefing nennt das Ziel, die Fakten, die zählen, die Dateien zum Ansehen und die Größe der Antwort. Alles, was der Subagent braucht, steht darin, denn er hat keine andere Quelle.
Ein Vertrag sagt, was zurückkommt: benannte Felder und eine Wortgrenze. Das Harness kürzt das Ergebnis auf den Vertrag, bevor der Elternagent es liest. Eine lange Antwort ist keine bessere Antwort.
Form eines Briefings und eines Ergebnisses
| Teil | Enthält | Warum |
|---|---|---|
| Ziel | Eine Frage | Der Subagent weiß, wann er fertig ist |
| Fakten | Was schon bekannt ist | Er wiederholt keine Arbeit |
| Dateien | Wo er suchen soll | Er irrt nicht umher |
| Größe | Eine Wortgrenze | Das Ergebnis bleibt kurz |
| Vertrag | Felder und eine Grenze | Der Elternagent liest eine feste Form |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele geben dem Subagenten sicherheitshalber den ganzen Verlauf des Elternagenten. Dann ist nichts isoliert und die Kosten verdoppeln sich. Schreiben Sie ein Briefing mit nur dem, was die Nebenaufgabe braucht.
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.
Subagentenlauf schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' '// Wörter stehen für Tokens, wie in Lektion 1.' 'function woerter(text) { return text.split(\" \").length; }' 'const eltern = \"Die Person will den fehlgeschlagenen Test beheben. Wir lasen app.py, ließen die Tests zweimal laufen, prüften das liesmich und sprachen eine Weile über Stil. Sie bat um kleine Änderungen.\";' 'const arbeit = [' ' \"ls: app.py liesmich tests notizen.txt alt.py\",' ' \"grep summe: app.py Zeile 4 def summe posten return sum posten\",' ' \"grep summe: tests Zeile 9 assert summe von 3 posten gleich 12\",' ' \"tests lesen: 40 Zeilen Testcode für den Warenkorb\",' ' \"app.py lesen: 22 Zeilen, die einen Warenkorb berechnen und Steuer addieren\",' '];' > sub4.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.
Subagentenlauf schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function briefingErstellen(ziel, fakten, dateien, max) {' ' const zeilen = [\"Ziel: \" + ziel];' ' for (const f of fakten) zeilen.push(\"Fakt: \" + f);' ' for (const f of dateien) zeilen.push(\"Datei: \" + f);' ' zeilen.push(\"Antworten Sie mit höchstens \" + max + \" Wörtern.\");' ' return zeilen.join(\" | \");' '}' 'function kuerzen(text, max) { return text.split(\" \").slice(0, max).join(\" \"); }' 'function summe(liste) { return liste.reduce(function (a, b) { return a + b; }, 0); }' >> sub4.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.
Subagentenlauf schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const briefing = briefingErstellen(\"Finden, wo die Summe des Warenkorbs berechnet wird\", [\"Der Test für 3 Posten ist falsch\"], [\"app.py\", \"tests\"], 20);' ' const probe = \"Die Summe wird in app.py in Zeile 4 berechnet. Sie addiert die Posten ohne Steuer. Siehe tests Zeile 9.\";' ' const eigen = briefing + \" | \" + arbeit.join(\" ; \");' ' const antwort = await fragen([{ role: \"user\", content: eigen }], probe, 60);' ' const ergebnis = kuerzen(antwort.text, 20);' ' console.log(\"Fenster des Elternagenten: \" + woerter(eltern) + \" Wörter\");' ' console.log(\"Fenster der Nebenaufgabe: \" + woerter(eigen) + \" Wörter, davon \" + summe(arbeit.map(woerter)) + \" Werkzeugergebnisse\");' ' console.log(\"Ergebnis behalten: \" + ergebnis);' ' console.log(\"der Elternagent zahlt \" + (woerter(briefing) + woerter(ergebnis)) + \" Wörter\");' '}' 'main();' >> sub4.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 Subagenten ausführen
docker exec -w /home/node/project agent node sub4.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Werkzeugergebnisse sind aufgezeichnet
Die fünf Werkzeugergebnisse sind erfunden und aufgezeichnet, anstelle dessen, was ein echter Subagent läse. Der kurze Modellaufruf bekommt das Briefing und diese Ergebnisse, und der Run kürzt die Antwort auf zwanzig Wörter.
Ohne Modell gibt er eine aufgezeichnete Probe aus und nutzt eine aufgezeichnete Antwort.
Eine mögliche Ausgabe
| Zeile | Was sie zeigt |
|---|---|
| Fenster des Elternagenten: 29 Wörter | Was der Elternagent schon enthält |
| Fenster der Nebenaufgabe: 84 Wörter, davon 48 Werkzeugergebnisse | Wo die Arbeit stattfand |
| Ergebnis behalten: Die Summe wird in ... | Höchstens zwanzig Wörter |
| der Elternagent zahlt 50 Wörter | Briefing und Ergebnis, nicht die 48 der Werkzeuge |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.