Zwei Agenten schieben ein Ticket hin und her
Ein Multi-Agenten-System verteilt die Arbeit auf Agenten, die jeweils eine Rolle haben. Sie reichen die Arbeit mit Übergabenachrichten weiter. Das ist wichtig, weil jede Übergabe einen Aufruf kostet und Kontext verlieren kann.
Ein Abrechnungsagent schickt ein Ticket an einen Bestandsagenten. Der schickt es sofort zurück. Das Ticket sprang die ganze Nacht hin und her.
Am Ende dieser Lektion
Notiz
Ich kann Arbeit auf Agenten verteilen und sagen, wann ein Agent genügt.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Rolle | die eine Aufgabe eines Agenten | preis |
| Übergabe | eine Nachricht, die Arbeit an einen anderen Agenten gibt | |
| Verteiler | der Teil, der die Rolle für eine Aufgabe wählt | |
| Gemeinsames Protokoll | ein Log, das alle Agenten lesen und ergänzen | |
| Schleifenschutz | eine Prüfung, die endloses Hin und Her stoppt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Wann ein Agent genügt
Beginnen Sie mit einem Agenten und einer Aufforderung. Fügen Sie einen zweiten nur hinzu, wenn Sie den Gewinn nennen können. Das kann eine kürzere Aufforderung sein, weniger Werkzeuge im Blick, ein anderes Modell oder ein Schritt, den ein Mensch freigeben muss.
Jeder weitere Agent bringt Aufrufe, Verzögerung und eine Stelle, an der Kontext verloren geht. Schafft ein Agent mit drei Werkzeugen die Arbeit, hören Sie dort auf.
Ausgearbeitetes Beispiel: ein Agent oder mehrere
| Situation | Wahl | Grund |
|---|---|---|
| Einen Preis nachschlagen und nennen | Ein Agent | Ein Werkzeug, eine Aufforderung |
| Regeln für Preis, Bestand und Lieferung, 20 Werkzeuge | Rollen | Jede Rolle sieht nur ihre Werkzeuge |
| Eine Erstattung über 100 Euro | Ein Schritt für Menschen | Freigeben ist keine Agentenarbeit |
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.
Die Übergabe-Demo 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 };' 'const BESTAND = { brezel: 14, semmel: 0 };' 'function suchen(tabelle, q, einheit) {' ' const name = Object.keys(tabelle).find(function (w) { return q.indexOf(w) >= 0; });' ' return name === undefined ? \"nichts gefunden\" : name + \": \" + tabelle[name] + einheit;' '}' 'const rollen = {' ' preis: function (q) { return suchen(PREISE, q, \" Cent\"); },' ' bestand: function (q) { return suchen(BESTAND, q, \" auf Lager\"); },' '};' 'function leiten(q) {' ' if (q.indexOf(\"was kostet\") >= 0) return \"preis\";' ' if (q.indexOf(\"auf lager\") >= 0) return \"bestand\";' ' return null;' '}' > uebergabe1.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 Übergabe-Demo schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function waehlen(q) {' ' const regel = leiten(q);' ' if (regel) return regel;' ' const text = \"Welche Rolle passt zu dieser Aufgabe: preis, bestand oder keine? Antworten Sie mit einem einzigen Wort. Aufgabe: \" + q;' ' const wort = (await fragen([{ role: \"user\", content: text }], \"keine\", 10)).trim().toLowerCase();' ' return wort === \"preis\" || wort === \"bestand\" ? wort : \"keine\";' '}' 'const spur = [];' 'function erlaubt(von, nach) {' ' spur.push(von + \">\" + nach);' ' return spur.filter(function (t) { return t === von + \">\" + nach; }).length < 3;' '}' >> uebergabe1.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 Übergabe-Demo schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const protokoll = [];' ' for (const q of [\"was kostet eine brezel\", \"ist die semmel auf lager\", \"wie wird das wetter\"]) {' ' const rolle = await waehlen(q);' ' const ergebnis = rolle === \"keine\" ? \"keine Rolle passt, fragen Sie einen Menschen\" : rollen[rolle](q);' ' protokoll.push({ an: rolle, aufgabe: q, ergebnis: ergebnis });' ' }' ' protokoll.forEach(function (r) { console.log(r.an + \" | \" + r.aufgabe + \" | \" + r.ergebnis); });' ' let wer = \"preis\";' ' for (let i = 0; i < 6; i++) {' ' const naechster = wer === \"preis\" ? \"bestand\" : \"preis\";' ' if (erlaubt(wer, naechster) === false) { console.log(\"Schleife: \" + wer + \" an \" + naechster + \" zum dritten Mal, Stopp\"); break; }' ' wer = naechster;' ' }' '}' 'main();' >> uebergabe1.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.
Starten und das gemeinsame Protokoll lesen
docker exec -w /home/node/project agent node uebergabe1.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 |
|---|---|
| preis | was kostet eine brezel | brezel: 90 Cent |
| bestand | ist die semmel auf lager | semmel: 0 auf Lager |
| Die Wetteraufgabe | keine, oder eine vom Modell gewählte Rolle mit schwachem Ergebnis |
| Schleife | eine Zeile, dass ein Paar zum dritten Mal vorkam |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Übergabe ist eine Nachricht mit Form
Eine Übergabenachricht nennt den Absender, den Empfänger, die Aufgabe und den Kontext, den der Empfänger braucht. Der Empfänger soll nicht den ganzen Verlauf des Absenders lesen müssen.
Die Agenten notieren, was sie getan haben, in einem gemeinsamen Protokoll. Es ist der eine Ort, an dem die Wahrheit über den Auftrag liegt.
Hin und Her zwischen Agenten verhindern
Zwei Agenten können jeweils entscheiden, dass der andere eine Aufgabe übernehmen soll. In keinem ist etwas falsch, und doch endet die Arbeit nie.
Zählen Sie jedes Paar von Absender zu Empfänger. Erreicht ein Paar eine Grenze, stoppen Sie und geben Sie den Auftrag an einen Menschen. Halten Sie die Spur der Übergaben im Protokoll fest, damit die Schleife sichtbar ist.
Ein häufiger Fehler
Warnung
Viele glauben, ein Verteiler müsse immer ein Modell fragen. Ein Modellaufruf ist langsamer, kostet Geld und kann eine Rolle nennen, die es nicht gibt. Nutzen Sie Regeln, wo sie genau sind, fragen Sie das Modell nur für den Rest und prüfen Sie, was es nennt.