Mehr Agenten sind nicht mehr Intelligenz
Ein Multi-Agenten-System ist ein Programm, in dem ein Modellaufruf Arbeit an andere Aufrufe verteilt, jeder mit eigenem Kontext. Das ist wichtig, denn jeder zusätzliche Agent kostet Token, Zeit und bringt neue Fehlermöglichkeiten.
Agententeams werden oft als nächster Schritt verkauft. Manchmal stimmt das. Häufig erledigt ein einzelner Agent mit guten Werkzeugen die Arbeit billiger.
Am Ende dieser Lektion
Notiz
Ich kann sagen, wann mehr als ein Agent die Kosten wert ist, und es mit Token-Schätzungen belegen.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Kontextfenster | der meiste Text, den ein Agent auf einmal halten kann |
| Orchestrator | der Agent, der die Arbeit aufteilt und die Antworten zusammenführt |
| Arbeiter | ein Agent, der einen Teil erledigt und berichtet |
| Gemeinsamer Text | die Anweisungen, die jeder Agent erneut lesen muss |
| Gekoppelte Arbeit | Schritte, bei denen jeder das Ergebnis des vorigen braucht |
| Parallel | Teile, die zur selben Zeit erledigt werden können |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Jeder Agent liest den gemeinsamen Text neu
Ein einzelner Agent liest seine Anweisungen einmal. Ein Team nicht. Der Orchestrator liest sie, und jeder Arbeiter auch, denn er hat einen eigenen Kontext und sieht den der anderen nicht.
Ein Team kostet also den gemeinsamen Text einmal pro Agent, dazu einen Auftrag und ein Ergebnis je Teil. Den Teil selbst liest nur der Arbeiter, dem er gehört.
Ausgearbeitetes Beispiel: drei Berichte
| Wer | Liest | Token |
|---|---|---|
| Ein einzelner Agent | Gemeinsam 1500 + drei Berichte 5500 + Antwort 400 | 7400 |
| Orchestrator | Gemeinsam 1500 + drei Aufträge 600 + Abschluss 300 | 2400 |
| Drei Arbeiter | Je gemeinsam 1500 + ein Bericht + ein Ergebnis | 10600 |
| Das Team insgesamt | Orchestrator und Arbeiter zusammen | 13000 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Wann sich eine Aufteilung lohnt
Teilen Sie auf, wenn ein einzelner Agent die Arbeit nicht halten kann. Teilen Sie auf, wenn die Teile unabhängig sind und Tempo zählt. Teilen Sie auf, wenn ein Teil einen sauberen Kontext braucht, damit früherer Text ihn nicht in die Irre führt.
Teilen Sie gekoppelte Arbeit nicht auf. Braucht Schritt zwei das genaue Ergebnis von Schritt eins, fügt ein zweiter Agent nur eine verlustbehaftete Zusammenfassung dazwischen.
Ein häufiger Fehler
Warnung
Viele teilen eine Aufgabe auf, weil sie mehrere Hauptwörter enthält. Zählen Sie die Abhängigkeiten, nicht die Hauptwörter. Arbeit, die einen einzigen Datensatz teilt und der Reihe nach bearbeitet, gehört einem einzelnen Agenten.
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 Kostenskript schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const FENSTER = 8000; // Token, die ein Agent halten kann' 'const NOTIZ = 200; // ein Auftrag oder ein Ergebnis' 'const FAELLE = [' ' { name: \"drei Berichte\", gemeinsam: 1500, teile: [1800, 2000, 1700], gekoppelt: false },' ' { name: \"ein langer Bericht\", gemeinsam: 1500, teile: [900], gekoppelt: false },' ' { name: \"eine Datei bearbeiten\", gemeinsam: 1500, teile: [1200, 1000], gekoppelt: true },' ' { name: \"zehn Dokumente\", gemeinsam: 1500, teile: Array(10).fill(900), gekoppelt: false },' '];' > aufteilen.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 Kostenskript schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function summe(liste) { return liste.reduce(function (a, b) { return a + b; }, 0); }' '// Ein einzelner Agent liest den gemeinsamen Text einmal, dann alle Teile, dann antwortet er.' 'function einzeln(f) { return f.gemeinsam + summe(f.teile) + 400; }' '// Ein Team: Der Chef liest den gemeinsamen Text neu, und jeder Arbeiter auch.' 'function team(f) {' ' const chef = f.gemeinsam + NOTIZ * f.teile.length + 300;' ' const arbeiter = f.teile.map(function (t) { return f.gemeinsam + t + NOTIZ; });' ' return chef + summe(arbeiter);' '}' >> aufteilen.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 Kostenskript schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function waehlen(f) {' ' if (f.gekoppelt || f.teile.length < 2) return \"einer\";' ' if (einzeln(f) > FENSTER) return \"mehrere\";' ' return team(f) <= 2 * einzeln(f) ? \"mehrere\" : \"einer\";' '}' 'async function main() {' ' for (const f of FAELLE) {' ' const x = Math.round((team(f) * 10) / einzeln(f)) / 10;' ' console.log(f.name + \": einzeln \" + einzeln(f) + \", Team \" + team(f) + \" (x\" + x + \"), Wahl \" + waehlen(f));' ' }' ' const q = [{ role: \"user\", content: \"Nennen Sie in einem Satz eine Arbeit, die man nicht auf mehrere Agenten verteilen sollte.\" }];' ' const r = await fragen(q, \"Eine Datei schrittweise bearbeiten, weil jeder Schritt den vorigen braucht.\", 40);' ' console.log(\"Modell: \" + r.text.trim());' '}' 'main();' >> aufteilen.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 Kostenskript starten
docker exec -w /home/node/project agent node aufteilen.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 sind Schätzungen
Der Run ruft kein Team auf. Er rechnet vier aufgezeichnete Fälle durch, denn ein echtes Team würde das Guthaben des Labors auf einmal aufbrauchen. Die Token-Größen sind erfunden, und ein echtes System misst seine eigenen.
Der eine Live-Aufruf bittet nur um einen Satz.
Eine mögliche Ausgabe
| Zeile | Was sie zeigt |
|---|---|
| drei Berichte: einzeln 7400, Team 13000 (x1.8), Wahl mehrere | Passt in ein Fenster, aber das Team kostet weniger als das Doppelte |
| ein langer Bericht: … Wahl einer | Ein einziger Teil lässt sich nicht verteilen |
| eine Datei bearbeiten: … Wahl einer | Gekoppelte Arbeit bleibt bei einem Agenten |
| zehn Dokumente: einzeln 10900, Team 29800 (x2.7), Wahl mehrere | Ein Agent kann nicht alles halten, also zahlt man |
| Modell: … | Ein Satz, der bei jedem Lauf anders ist |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.