Multi-agent orchestráció: öt minta, és mikor győz az egyik
Ugyanaz a számlavita négy módon, egy táblában árazva: az orchestrator 1,66× annyiba került, mint az egyetlen agent, és ugyanarra jutott.
Ezen az oldalon
A 24. fejezet egy kiérdemelt kérdéssel zárult: ha egy sub-agent téved, pontosan mit láthat belőle a szülő?
Ez a fejezet egy számlával válaszol rá. Egy feladat — egy ügyfél vitat egy számlát, és választ kér — négyféleképpen megoldva; mindegyik a 23. fejezet harnessét futtatja ugyanazzal a szkriptelt szolgáltatóval, mindegyik ugyanazokat a tokeneket számolja ugyanazzal az encoderrel, és mindegyik azokkal az árakkal van árazva, amelyeket a 16. fejezet 2026. szeptember 6-án olvasott.
| elrendezés | modellhívások | input token | output | költség | falióra-idő | verdict |
|---|---|---|---|---|---|---|
| prompt chaining | 4 | 900 | 165 | $0,003780 | 1 648 ms | hibás |
| egy agent, négy eszköz | 5 | 2 697 | 179 | $0,007542 | 2 224 ms | helyes |
| párhuzamos szekciók | 9 | 2 910 | 324 | $0,009708 | 2 165 ms | helyes |
| orchestrator-workers | 12 | 3 628 | 438 | $0,012512 | 5 090 ms | helyes, de nem tudja bizonyítani |
Olvasd össze az első és az utolsó sort: köztük van minden vita, amelyet ez az iparág most folytat. A legolcsóbb elrendezés volt a leggyorsabb is, és magabiztos, hibás, elküldhető választ adott. A legdrágább eltalálta, 3,3-szor annyi pénzbe és 3,1-szer annyi időbe került, majd a végén egy worker olyan következtetését idézte, amelyet nincs módja ellenőrizni.
A sor, amelyet senki sem tesz bele ezekbe a táblázatokba, a második: egy agent a négy eszközzel ugyanarra a verdictre jutott, mint az orchestrator, a pénz 60 %-áért és a falióra-idő 44 %-áért. Ez nem az egyszerűség előnyben részesítése. Ez mérés, és a fejezet további része arról szól, mikor szűnik meg igaznak lenni.
Részletek megjelenítése
Amire ennek a fejezetnek szüksége van a korábbiakból.
- 18. fejezet az eszközszerződéshez: egy schema, amelyet a modell lát, és egy endpoint, amelyet soha nem lát. Egy teljes agent elfér e mögött az interfész mögött; ez a multi-agent lényege.
- 22. fejezet az „agent” két publikált, egymásnak ellentmondó definíciójához, és ahhoz az aritmetikához, hogy egy promptlánc N hívás.
- 23. fejezet a loophoz, az öt kilépési módhoz, a futási állapothoz és a trace-hez. Alább minden elrendezés ugyanaz a fájl, másképp meghívva.
- 24. fejezet ahhoz, mennyibe kerül egy context window, és mi esik ki belőle. A sub-agent a négy stratégiája közül a negyedik, és az egyetlen, amely nem policy, hanem második agent.
Nincsenek tenzorok. Itt minden TypeScript, kivéve két mérést, amelyet valódi helyi modellen végeztünk.
A feladat és a benne rejlő csapda
Link a szakaszhoz: A feladat és a benne rejlő csapdaEgy portugál cég ír a FT-2026-0918 számláról. Az email szerint az áfa hibásnak tűnik, és csatolja a számlát: nettó 248,00 EUR, 21 % áfa felszámítva, 52,08 EUR, összesen 300,08 EUR.
A válaszhoz szükséges tények három helyen élnek, és ezek közül csak egy van benne az emailben:
| hol | mit mond |
|---|---|
| a csatolt számla | az eladó Spanyolországban van, 21 % áfa alkalmazva, 52,08 EUR |
| a rendelési rekord | a vevő Portugáliában regisztrált, érvényes közösségi adószámmal, business-to-business |
| az adótábla | spanyol belföldi kulcs 21 %; EU-n belüli business-to-business érvényes azonosítóval: reverse charge, 0 % |
Rakd össze a hármat, és a számla hibás: reverse charge alkalmazandó, az áfának nullának kellett volna lennie, 52,08 EUR jóváíró számla jár. Ha csak a számlát nézed, aritmetikailag tökéletes — 248,00 plusz 52,08 az 300,08 —, és ezt fogod mondani.
Az email valóban állítja, hogy „portugál cég vagyunk”. Ez állítás, nem rekord, és egyetlen számlázórendszer sem állít ki jóváíró számlát puszta állítás alapján. A csapda nem trükk: ez az üzleti munka hétköznapi alakja, ahol a döntéshez olyan tény kell, amelynek lekérésére senki sem gondolt.
A fentiek mind a 23. fejezet stílusában szkriptelt szolgáltatóval futnak, pontosan egy szabállyal:
Egy válasz csak olyan tényt használhat, amely benne van a promptjában.
A „modell” minden nála lévő eszközt egyszer kér le, katalógussorrendben, majd rögzített szabályt alkalmaz arra a szövegre, amelyet lát. Semmi sincs elrendezésenként szkriptelve, ezért a nyitó táblázat különbségei nem a modellintelligenciáról szóló állítások: ezek információ-útvonalak, megmérve. Egy valódi modell ehhez hozzáadja a saját hibáit; nem tünteti el ezeket.
Az öt minta körülbelül negyven sorban
Link a szakaszhoz: Az öt minta körülbelül negyven sorbanAz alábbi öt név Anthropicé, a Building effective agents cikkből; ott állapodott meg ez a szókészlet.1 Az öt ötlet közül egyik sem új, és annak kimondása, melyik ház mit nevezett el — és melyik ötlet régebbi — a megértés értékének fele.
/* 1. Prompt chaining: a fixed pipeline. The control flow is yours. */
export async function chain(steps: Step[], first: string) {
let carry = first, all = first;
for (const s of steps) {
const r = await step(s.role, s.system, s.accumulate ? all : carry);
carry = r.text;
all = `${all}\n${r.text}`;
}
return carry;
}
/* 2. Routing: one cheap call picks the branch. The fallback is not a model. */
export async function route<T>(input: string, classify: Classifier,
routes: Record<string, Branch<T>>, fallback: Branch<T>) {
let label: string | undefined;
try { label = await classify(input); } catch { label = undefined; }
return ((label && routes[label]) || fallback)(input);
}
/* 3. Parallelisation. The pattern IS this line. */
export const parallel = <T>(workers: Branch<T>[], input: string) =>
Promise.all(workers.map((w) => w(input)));
/* 4. Orchestrator-workers: an agent behind a tool. Chapter 18's interface, unchanged. */
export function agentTool(o: WorkerSpec): Tool {
return {
name: o.name, description: o.description, readOnly: true,
parameters: { type: "object", properties: { question: { type: "string" } } },
async run(args: { question: string }) {
const child = newRun(o.system, args.question); // its own window
await runTracked(child, o.tools, o.usage); // its own limits
const conclusion = child.output ?? "no result";
if (!o.carryFindings) return conclusion;
return `${conclusion}\nFINDINGS ${evidence(child)}`;
},
};
}
/* 5. Evaluator-optimiser: make, judge, remake. Rounds are calls. */
export async function refine(make: Make, judge: Judge, maxRounds: number) {
let draft = "", feedback: string | undefined;
for (let r = 1; r <= maxRounds; r++) {
draft = (await make(feedback)).text;
const j = await judge(draft);
if (j.ok) return { draft, rounds: r };
feedback = j.note;
}
return { draft, rounds: maxRounds };
}Ez a teljes eszközkészlet: öt függvény, nincs framework, és a párhuzamos egyetlen sor — éppen ezért érdemes kiírni, nem lerajzolni. Most egyenként, az eredetükkel, az árukkal és azzal az esettel, ahol hibáznak.
Chaining, és a döntés, amelyet meghoz helyetted
Link a szakaszhoz: Chaining, és a döntés, amelyet meghoz helyettedA prompt chaining „egy feladatot lépések sorozatára bont, ahol minden LLM-hívás az előző kimenetét dolgozza fel”.1 Az ötlet régebbi a nyelvi modelleknél: ez pipeline, a pipeline alkújával — átláthatóságért cserébe olyan kontrollfolyam, amely rögzített, mielőtt az adat megérkezik.
Négy lépés a feladatunkhoz: a számlamezők kinyerése, az aritmetika ellenőrzése, annak eldöntése, mi jár, a válasz megírása. Itt két különböző módon bukik el, ami többet tanít, mintha csak egyszer bukna.
--- relay: each step sees only the previous step's output
extract: FIELDS invoice_id=FT-2026-0918 net=248.00 vat_rate_applied=21 vat_amount=52.08 ...
check: ARITHMETIC ok 248.00+52.08=300.08
decide: VERDICT=unknown reason=no_invoice_in_context
draft: "we are looking into invoice FT-2026-0918 and will come back to you."
--- accumulating: each step sees the email and everything produced so far
extract: FIELDS invoice_id=FT-2026-0918 net=248.00 vat_rate_applied=21 ...
check: ARITHMETIC ok 248.00+52.08=300.08
decide: VERDICT=invoice_correct reason=net_248.00_plus_21pct_vat_52.08_equals_300.08
draft: "we have checked FT-2026-0918 and it is correct... Nothing is owed back."A relay lánc $0,001940-ba került, és elvesztette a számlamezőket a második és harmadik lépés között, mert a harmadik lépés csak egy aritmetikáról szóló mondatot kapott, semmi mást. Tartóüzenetet adott: haszontalant, és láthatóan haszontalant.
Az akkumuláló lánc — a nyitó táblázat sora — $0,003780-ba került, ami 95 %-kal több négy azonos hívásért, mert most minden lépés visz magával mindent, ami előtte volt. Ez adta a veszélyes kimenetet. Folyékony, az aritmetikájára hivatkozik, minden említett számában helyes, és azt mondja az ügyfélnek, hogy semmi nem jár, miközben 52,08 EUR jár.
A kettő közti különbség egy ternary. Az a lánc, amely kevesebbet visz tovább, nyilvánvalóan hiányos válaszokat ad; az a lánc, amely mindent visz tovább, magabiztosan hibás válaszokat ad — és csak a második fajtát küldik el.
De egyik sem a valódi hiba. A valódi hiba az, hogy a pipeline még olvasás előtt eldöntötte: ez a feladat négy lépés egy email tartalma fölött. Ebben a struktúrában sehol sincs hely azt mondani: „a regisztrációs ország nincs ebben az emailben; menj, szerezd meg”. A chaining akkor helyes, ha a bontás előre ismert és stabil. Itt találgatás volt, és a találgatást élesítették.
Routing, a legrégebbi, és a B terv, amelyet senki sem ír meg
Link a szakaszhoz: Routing, a legrégebbi, és a B terv, amelyet senki sem ír megA routing „bemenetet osztályoz, és egy specializált follow-up feladathoz irányítja”.1 A név új; a mechanizmus a dispatcher, amely régebbi szinte minden másnál ebben a könyvben. Az az új, hogy az osztályozó lehet modell — ettől bukik el olyan módokon, ahogy egy switch soha.
const answer = await route(email,
(q) => classifyWithSmallModel(q), // cheap model, one call
{ billing: billingAgent, tax: taxAgent, dunning: dunningAgent },
taxAgent, // deterministic, chosen in advance
);Két dolog az utolsó argumentumról. Ez nem error handling; ez maga a minta. Egy modellalapú routernek van olyan hibamódja, amely egy dispatchernek nincs: visszaadhat nem létező címkét, timeoutolhat, vagy — ez a drága — visszaadhat hihető, de rossz címkét úgy, hogy semmi nem jelzi a hibát. Mindháromnak valahol landolnia kell, és ez a valahol nem lehet újabb modellhívás, mert már abban az ágban vagy, ahol a modellhívások megbuktak.
A második dolog: a router saját promptja sem ingyenes. Ahhoz, hogy modellt válasszon, a routernek kell egy választható modellkatalógus, és ennek minden bejegyzése olyan input, amelyért a router fizet, mielőtt elolvasta volna a felhasználó kérdését. Azon az input áron, amellyel ez a kurzus számol, egy nagyjából 3 800 tokenes katalógus már annyiba kerül, mint a nyitó táblázat teljes öthívásos agent futása. A gyakorlatban a routing hívás olcsó modellen fut, pontosan ezért térül meg a routing; de az aritmetikát ebbe az irányba érdemes elvégezni, nem feltételezni. A routing pontosan akkor hibás, amikor a routolt feladat olcsóbb, mint maga a routing döntés.
Párhuzamosítás: szekciók és voting, vagyis self-consistency
Link a szakaszhoz: Párhuzamosítás: szekciók és voting, vagyis self-consistencyAnthropic ezt kettébontja: sectioning — „egy feladat felbontása független részfeladatokra, amelyek párhuzamosan futnak” — és voting — „ugyanannak a feladatnak többszöri futtatása változatos kimenetekért”.1 Közös rajzuk van, és szinte semmi másuk nem közös.
A sectioning az olcsó győzelem, és ez a patterns.ts sora: három specialista — számlázás, adó, policy — mindegyik saját context window-val és eszközökkel, ugyanazon az emailen, a végén egy szintézishívással. Azonos munka, kétféle sorrendben:
| modellhívások | input | output | költség | falióra-idő | |
|---|---|---|---|---|---|
| a három worker egymás után | 9 | 2 910 | 324 | $0,009708 | 3 894 ms |
ugyanaz a három, Promise.all | 9 | 2 910 | 324 | $0,009708 | 2 165 ms |
Tokenről tokenre ugyanaz, 1,8-szor gyorsabban. Ezért érdemel saját nevet a minta: az öt közül ez az egyetlen, amely valamit úgy javít, hogy nem kerül semmibe. A bökkenő az, hogy a szekcióknak valóban függetlennek kell lenniük — adj B szekciónak egy tényt, amelyet A szekció állít elő, és a Promise.all mindkettőt olyan állapoton futtatja, amely még nem létezik. A for loop elrejtette ezt a hibát; az egysoros felfedi.
A voting más állat ugyanabban a képben. Ugyanazt a kérdést k alkalommal futtatni és többséget venni: ez self-consistency, amelyet Wang és társai 2022 márciusában decoding stratégiaként publikáltak, majdnem három évvel azelőtt, hogy bárki orchestrációs mintának nevezte volna. Az absztraktja pontos a mechanizmusról — „először változatos reasoning útvonalakat mintavételez ahelyett, hogy csak a greedy választ venné, majd a mintavételezett reasoning útvonalakat marginalizálva kiválasztja a legkonzisztensebb választ” — és a nyereségről is: +17,9 pont GSM8K-n.2
Ebből két dolog következik, amelyet a kép elrejt. Először: a voting igényli a 17. fejezet mintavételezését: nulla temperature mellett mind a k minta ugyanaz a minta, a többség pedig egy válasz, k-szor kifizetve. Másodszor: csak ott működik, ahol a többség értelmes — a fenti számlaválasznál nincs mit megszámolni, mert öt piszkozat öt különböző mondat. A voting olyan feladatokra való, ahol rövid, összehasonlítható válasz van; pontosan ilyenek Wang benchmarkjai, és szinte semmi, amit egy ügyféloldali agent csinál.
Itt 20 háromlépéses szöveges feladaton mérve, amelyeknek válaszai számítottak, nem megítéltek, a 23. fejezet helyi modelljével lépésről lépésre reasoningelve:
| modellhívások | input | output | a 20 költsége | helyes | 95 % intervallum | |
|---|---|---|---|---|---|---|
| egy greedy lánc | 20 | 1 330 | 2 649 | $0,034448 | 9/20 | 26–66 % |
| 5-ös többség, temperature 0,8 | 100 | 6 650 | 13 245 | $0,172240 | 9/20 | 26–66 % |
Ötször annyi hívás, ötször annyi token, pontosan ötször akkora számla, és egyetlen plusz helyes válasz sem. A voting fogadás, nem javítás, és ez a futás elveszítette.
Két fenntartás, mielőtt bárki Wang cáfolataként idézné. Húsz próba nem tudja megkülönböztetni a 45 %-ot a 60 %-tól — az intervallum a claim szélessége, ami a 4. fejezet fegyelme a saját eredményem ellen fordítva. A publikált nyereségek pedig nagyságrendekkel nagyobb modellekből jönnek, ahol a voting által marginalizált változatos reasoning útvonalak valóban változatosak. Nem a szám vihető át, hanem az, hogy a szorzó pontos és előre ismert, a nyereség viszont nem.
Orchestrator-workers, és mi nem egy összefoglaló
Link a szakaszhoz: Orchestrator-workers, és mi nem egy összefoglalóAz orchestrator-workers workflow-ban „egy központi LLM dinamikusan bontja le a feladatokat, worker LLM-ekre delegálja őket, és szintetizálja az eredményeiket”, a sectioningtől pedig az különbözteti meg, hogy „a részfeladatok nincsenek előre definiálva, hanem az orchestrator határozza meg őket”.1 Az eredet itt egyáltalán nem nyelvi modellekből jön: ez master-worker, az a változata pedig, ahol a workerek leleteket írnak egy közös térbe, amelyet egy controller olvas, a blackboard architektúra, az 1970-es évek beszédértési kutatásaiból. Ami 2026-ban új, az az, hogy a controller modell, ezért a bontás bemenetenként eldönthető — ez a rugalmasság és a költség egy mondatban.
12 modellhívásba került az egyetlen agent 5 hívásával szemben, és ugyanarra a verdictre jutott. Aztán tett valamit, amit érdemes közelről nézni:
orchestrator final: VERDICT=credit_note_due amount=52.08 source=worker_unverified
| PO_MISMATCH=yes source=worker_unverified
single agent: VERDICT=credit_note_due amount=52.08 reason=reverse_charge_should_have_applied
| PO_MISMATCH=yes invoice_says=PO-4417 order_says=PO-4471Mindkettő helyes. Csak az egyik tudja, miért. Az adó workernek a saját context window-jában ott volt a számla, a rendelés és az adótábla, levonta a következtetést, és azt is észrevette — senki sem kérdezte —, hogy a számlán lévő beszerzési rendelési szám nem egyezik a rendelésével. Aztán visszaadott egy összefoglalót. Az orchestrator mindkét állítást meg tudja ismételni, de egyiket sem tudja ellenőrizni, mert a bizonyíték abban a context window-ban maradt, amelyet soha nem látott. Ez a 24. fejezet zárókérdésének válasza: a szülő azt láthatja, amit a gyerek úgy döntött, leír.
A javítás egy flag, és ára van:
| mit ad vissza a worker | orchestrator input token | költség | mit tehet a szülő |
|---|---|---|---|
| a következtetését | 3 628 | $0,012512 | megismétli |
| a következtetését és a bizonyítékát | 4 065 | $0,013554 | újra levezeti, és vitatkozik vele |
Tizenkét százalékkal több input token, 8,3 %-kal több pénz, és a source=worker_unverified kifejezés eltűnik a válaszból. Ez az alku minden multi-agent rendszerben, és szinte soha nem mondják ki: a gyerek tiszta context window-ja értékes, a szülő auditálási képességéért érdemes fizetni, és a kettőt nem kaphatod meg ingyen.
Mikor hibás tehát az orchestrator-workers? Itt, ezen a feladaton. Olyan helyes választ vett meg, amelyet egy agent ugyanazzal a négy eszközzel szintén elért, 1,66-szoros költségért és 2,3-szoros falióra-időért, ráadásul nehezebben védhetővé tette a választ. Anthropic saját iránymutatása ezt már a minták előtt kimondja: találd meg „a lehető legegyszerűbb megoldást, és csak akkor növeld a komplexitást, amikor szükséges”, mert „az agentic rendszerek gyakran latencyt és költséget cserélnek jobb feladatteljesítményre”.1 A fenti táblák ennek a mondatnak a számai.
Evaluator-optimiser, és a bíró, aki a vizsgát írta
Link a szakaszhoz: Evaluator-optimiser, és a bíró, aki a vizsgát írtaAz egyik hívás generál, a másik értékel, a loop pedig addig ismétlődik, amíg az értékelés át nem megy.1 A publikált elődök a Self-Refine — ugyanaz a modell „generator, refiner, and feedback provider” szerepben, hét feladaton átlagosan körülbelül 20 pont abszolút javulást jelentve3 — és a Reflexion, amely a kritikát epizodikus bufferben tárolja a próbálkozások között, és 91 % pass@1-et jelent HumanEvalon, ahol a baseline 80 %-ot ért el.4
Az öt közül ennek a legegyszerűbb a költségmodellje: két hívás körönként, és a körök száma nem a tiéd. Három finomítási kör egy egyhívásos feladaton hat hívás, tehát a minta padlója 6×, a plafonja pedig az a cap, amelyet beállítasz — ezért a 23. fejezet budget exitje kötelező, nem csinos extra.
A plafon finomabb, és mérhető. Ugyanazon a 20 feladaton a helyi modell 9-re válaszolt helyesen. Ezután megmutattuk neki mindegyik saját válaszát, és megkérdeztük, helyes-e — anélkül, hogy megmondtuk volna, hogy a sajátja, ami eltávolítja a hízelgési konfúziót, és meghagyja a képességbelit:
| a modell saját válasza | „igent” mondott | „nemet” mondott |
|---|---|---|
| a 9 helyes | 9 | 0 |
| a 11 hibás | 3 | 8 |
Ez jobb bíró, mint amit a szekciócím sugall, és éppen ez a mérés, nem az állítás lényege: semmi helyeset nem blokkolt, és 11 hibából 8-at elkapott. Szűrőként megéri a hívásait.
Megállási szabályként viszont, márpedig egy evaluator-optimiser loop ténylegesen erre használja, az a három jóváhagyás az egész történet: hibás válasszal a kézben zárják le a loopot, és semennyi extra kör nem jut el hozzájuk. Egy finomítási loop nem lehet helyesebb, mint a bírája. Több kör vásárlása próbálkozásokat vesz azokhoz a hibákhoz, amelyeket a bíró lát, teljes áron, és semmit azok ellen, amelyeket nem lát.
Ezért a szabály: egy evaluator csak akkor érdemli ki a hívásait, ha van valamije, ami a generatornak nincs. Compiler, test suite, schema validator, másik modell, ember. A Self-Refine saját eredményeit emberi preferenciával és feladatmetrikákkal mérték, soha nem a modell önmagáról alkotott véleményével. Ha az evaluator egyetlen előnye egy másik prompt, akkor kétszer fizetsz az egyetértésért. A 29. fejezet azt a változatot építi fel, amelynek valódi előnye van: golden setet, előre leírt válaszokkal.
A loopok nem a minták
Link a szakaszhoz: A loopok nem a mintákA fenti öt alakzat a te kódodhoz. Alattuk ül egy második család, amelyet gyakran melléjük sorolnak, pedig nem kellene: a ReAct, a Reflexion, a plan-and-execute és a tree of thoughts reasoning loopok, és a költségük requestekben van.
A 12. fejezet a modellen belüli reasoningről szólt, amelyért egy hívás output tokenjeiben fizetsz. Ez a másik fajta. A különbség akkor számít, amikor megérkezik a számla: egy hosszabb chain of thought egy hívást drágít, egy reasoning loop pedig egy feladatból sok hívást csinál, amelyek mindegyike újraküld mindent, ami előtte volt — azt a kvadratikust, amelyet a 23. fejezet a runaway táblájában mért.
| loop | hívások feladatonként | mit vesznek az extra hívások |
|---|---|---|
| ReAct | lépésenként egy, amíg meg nem áll | a modell reagál arra, amit az eszközök visszaadtak5 |
| plan-and-execute | egy a tervhez, majd lépésenként egy | a terv rögzül, mielőtt az első lépés lefut6 |
| Reflexion | próbálkozások × (act + reflect) | a kritika túlél a következő próbálkozásig4 |
| tree of thoughts | elágazási tényező × mélység, plusz egy értékelés csomópontonként | keresés, backtrackinggel7 |
A tree-of-thoughts tanulmány saját költségtáblát közöl, ami ritkább, mint kellene. Game of 24-en GPT-4-gyel: az input/output prompting best-of-100 33 %-ot oldott meg esetenként $0,13-ért, a chain of thought best-of-100 49 %-ot $0,47-ért, a tree of thoughts pedig 74 %-ot $0,74-ért, miközben a szerzők megjegyzik, hogy „5–100-szor több generált tokent igényelhet, mint a CoT”.7
Majdnem hatszorosa az olcsó módszer árának, valamivel több mint kétszeres sikerarányért. Hogy ez jó üzlet-e, attól függ, mennyibe kerül neked egy sikertelen eset — ezt a kérdést kell feltenni, mielőtt a négy bármelyikét bevezeted.
Ez a kurzus nem implementálja újra őket. Mind a négynek van referenciaimplementációja a saját szerzőitől, Pythonban, és az értékük az, hogy források, nem fordítások: ysymyth/ReAct, noahshinn/reflexion, princeton-nlp/tree-of-thought-llm és AGI-Edgerunners/Plan-and-Solve-Prompting. Olvasd el a promptokat ezekben a repositorykban; a promptok maguk a tanulmányok.
Két topológia, és az egyik nem jön vissza
Link a szakaszhoz: Két topológia, és az egyik nem jön visszaMost jön a valódi multi-agent rész, ahol a legtöbb zavar él. Két módja van annak, hogy egy agent bevonjon egy másikat; ezek nem variánsok, és a különbség az, ki irányít utána.
Agent mint eszköz. A szülő meghívja, választ kap, és folytatja. Ez a 18. fejezet eszközinterfésze, mögötte egy teljes agenttel, és a szülő soha nem veszíti el az irányítást. Ezt csinálja a fenti orchestrator.
Handoff. A szülő átadja a beszélgetést, és nem kapja vissza. OpenAI útmutatója a legtisztább publikált megfogalmazás: a handoff „egyirányú átadás, amely lehetővé teszi, hogy egy agent másik agentre delegáljon... Ha egy agent handoff függvényt hív, azonnal elindítjuk a végrehajtást azon az új agenten, amelynek átadták, miközben a legfrissebb beszélgetésállapotot is átvisszük.”8
Szókészleti figyelmeztetés, mert ez állandóan megbotlatja az embereket: a „handoff” egy SDK szava, nem szabvány. Az OpenAI Agents SDK és az útmutató terminológiája; az útmutató a két elrendezést „manager” és „decentralized” néven is említi, és megjegyzi, hogy a manager mintában „az élek tool callokat jelentenek, míg a decentralized mintában az élek handoffokat jelentenek”.8 Van nyílt szabvány ezen a területen — az A2A, 1.0.0 verziónál, a Linux Foundation copyrightja alatt, verziózott release historyval és dokumentált breaking changes listával, amelynek kimondott elve az opaque execution: az agentek „deklarált képességek és kicserélt információ alapján működnek együtt, anélkül, hogy meg kellene osztaniuk belső gondolataikat, terveiket vagy eszközimplementációikat”.9 Ez nem handoff, és az összehasonlítás a 26. fejezetbe tartozik. Itt az számít, hogy a két szó közül az egyik egy könyvtár API-ja, a másik pedig kormányzással rendelkező specifikáció.
A különbség adatstruktúra, nem diagram:
export type EdgeKind = "tool" | "handoff";
export interface AgentEdge { from: string; to: string; kind: EdgeKind }
export interface AgentGraph { root: string; agents: Record<string, AgentSpec>; edges: AgentEdge[] }
/** One agent may not be both a tool of X and a handoff target of X. */
export function conflicts(g: AgentGraph): AgentEdge[] {
const seen = new Map<string, EdgeKind>();
const bad: AgentEdge[] = [];
for (const e of g.edges) {
const key = `${e.from}->${e.to}`;
const other = seen.get(key);
if (other && other !== e.kind) bad.push(e);
else seen.set(key, e.kind);
}
return bad;
}
/** Every agent reachable from the root, and at what depth. */
export function reachable(g: AgentGraph): Map<string, number> {
const depth = new Map([[g.root, 0]]);
const queue = [g.root];
while (queue.length) {
const id = queue.shift()!;
for (const e of g.edges.filter((x) => x.from === id)) {
if (depth.has(e.to)) continue;
depth.set(e.to, depth.get(id)! + 1);
queue.push(e.to);
}
}
return depth;
}Húsz sor, két bug, amelyet különben productionben találnál meg. reachable megtalálja azt az agentet, amelyhez senki sem tud eljutni — konfigurálva, kifizetve, soha meg nem hívva. conflicts visszautasítja azt az élt, amely egyszerre mindkét fajta; ez pedánsnak hangzik, amíg hangosan ki nem mondod: a szülő egyszerre tartja meg az irányítást és adja is át. Futtasd egy öt agentből álló rendszeren, egy orphan-nel és egy dupla éllel:
reachable: lead@0 billing@1 tax@1 dunning@1
orphans: ghost
conflicts: lead->taxMi lépi át ténylegesen a határt
Link a szakaszhoz: Mi lépi át ténylegesen a határtMost az a mérés, amelyért ez a szekció létezik, és az egyetlen ebben a fejezetben, amely valódi modell ellen futott, nem szkriptelt ellen.
Egy ügyfél már az első üzenetében megad egy korlátozást — a fiókunk Portugáliában van regisztrálva, nem Spanyolországban; minden adózással kapcsolatos dolgot Portugáliával kell kezelni —, beszélget valami másról, majd olyan kérdést tesz fel, amelyre a számlázásnak kell válaszolnia. Az ügy átadásra kerül. Huszonnégy próba, minden alkalommal más ország és cég, négy átadási payload, majd a fogadó agent egyetlen kérdést kap: melyik országban van regisztrálva ennek az ügyfélnek a fiókja?
| mi került átadásra | átlagos payload | benne volt a korlátozás | a specialist emlékezett rá | 95 % intervallum |
|---|---|---|---|---|
| a teljes beszélgetés | 173 token | 24/24 | 20/24 — 83 % | 64–93 % |
| a küldő agent által írt összefoglaló | 62 token | 1/24 | 0/24 — 0 % | 0–14 % |
| csak az utolsó felhasználói üzenet | 61 token | 0/24 | 0/24 — 0 % | 0–14 % |
| egy tipizált rekord | 69 token | 24/24 | 24/24 — 100 % | 86–100 % |
A harmadik sor kontroll, és úgy is viselkedik: a tény nincs ott, tehát nem lehet felidézni. A másik három a finding.
A teljes transcript 173 token, és az esetek 83 %-ában működik; a négy hiba inkább a 24. fejezet tárgya, nem ezé. A tipizált rekord 69 token — héttel több, mint az összefoglaló — és minden alkalommal működik, mert a korlátozás névvel ellátott mezőben ül, nem mondatban.
Az összefoglaló sora az, amelyet nézni kell. 24-ből 24-szer megbukott, és nem azért, mert az olvasó elszalasztotta. A korlátozás a 24 összefoglalóból összesen 1-ben jelent meg. A fogadó agent nem volt figyelmetlen; olyan szöveget kapott, amely nem tartalmazta a választ. Az összefoglaló olyan tömörítés, amelyet nem te írtál, egy modell állítja elő, amelynek context window-ját nem látod, és arra optimalizál, hogy összefoglalónak hasson — márpedig „az ügyfél szerint a rekordjainkban rossz ország szerepel” pontosan az a mellékmondat, amelyet egy summariser eljárási zajként dob el.
Őszinte korlát ehhez a számhoz: a summariser félmilliárd paraméteres modell, és egy nagyobb többet megtartana. Ami mérettel sem javul, az a kockázat alakja — a küldő agent handoffonként, megfogalmazásonként, megfigyelhetetlenül dönt arról, mely tények maradnak életben. A tipizált rekord egyáltalán nem függ ettől az ítélettől, ezért konstrukcióból győz, nem intelligenciából. Ami túl kell éljen egy átadást, mező legyen, ne mondat.
Ugyanez az érvelés a másik irányban is érvényes, az agent-as-tool topológiára, és a korábbi tábla már beárazta: ami egy workertől visszajön, az is összefoglaló, és 8,3 %-kal többet fizetni azért, hogy a bizonyíték is visszajöjjön vele, ugyanaz a javítás a szülő oldaláról nézve.
Amikor egy agent győz
Link a szakaszhoz: Amikor egy agent győzHárom záró tény, mind a fenti táblákból.
Egy multi-agent rendszer szorozza a hívásokat, a hívások pedig kvadratikusak a contextben. Az orchestrator 12 modellhívást tett ott, ahol egy agent 5-öt, és mindegyik viszi a saját növekvő transcriptjét — 3 628 input token a 2 697-tel szemben, és ez a rés a feladat hosszával nő.
Minden határ veszteséges csatorna. Két agent egy összefoglalót jelent. Négy agent láncban hármat, egymásra épülve, mindegyiket egy modell írja, amely valami másra optimalizál, mint a te döntésed.
Az egyetlen agent olyasmit talált, amit senki sem kért. A beszerzési rendelés eltérése azért került felszínre, mert egy context window-ban egyszerre volt ott a számla és a rendelés. A specialisták közötti felosztás azt a képességet is felosztja, hogy észrevegyük: két tény ellentmond egymásnak.
Mindez nem a publikált multi-agent frameworkök ellen szól; ezeket elsődleges forrásként érdemes olvasni, nem tutorialokon keresztül.10 Amellett érvel, hogy a második agent érdemelje ki a helyét.
Tehát teszt, nem preferencia. Akkor adj hozzá második agentet, ha ezek közül legalább egy igaz: a részfeladatnak tiszta context window kell, amelyet a szülő nem örökölhet (24. fejezet); a részfeladatok valóban függetlenek, és számít a falióra-idő — ez a fenti 1,8×; a részfeladatnak eltérő jogosultságok vagy másik modell kell, amit a 30. fejezet security érvvé alakít; vagy a részfeladatot valaki más birtokolja, ahol egy valódi protocol kezd számítani. Ha a válasz az, hogy „így minden agentnek tisztább promptja van”, adj az egyetlen agentnek tisztább promptot. Ingyen van.
Merre megyünk tovább
Link a szakaszhoz: Merre megyünk továbbMost már meg tudod nevezni az öt mintát, be tudod árazni őket egymáshoz képest egy feladaton, meg tudod különböztetni az orchestratort a sectionertől és a tool callt a handofftól, és egyetlen agentet táblával tudsz védeni, nem preferenciával.
Itt minden elrendezés osztozott egy kényelmen, amely semmi valódival találkozva nem marad életben: minden eszköz a miénk volt. Számla, rendelés, adótábla, az orchestrator mögötti workerek — ugyanaz a repository, ugyanaz a deploy, ugyanazok a típusok, ugyanazok az emberek.
Most tedd az egyiket egy céghatár túloldalára. Az adótábla egy könyvelési vendoré, a rendelési rekord egy raktári rendszeré, és egyik sem olvasta a te Tool interfészedet. Kell egy mód arra, hogy egy modell, amelyet nem te írtál, felfedezzen, leírjon és meghívjon egy képességet, amelyet valaki más üzemeltet — authenticationnel (ez a 27. fejezet fele), versioninggel, és azzal a garanciával, hogy egy server nem olvashatja a beszélgetésed többi részét. Ez protocol probléma, van hozzá normatív schemával rendelkező specifikáció, és szinte minden, amit indexeltek róla, olyan revisiont ír le, amely már nem létezik.
A 26. fejezet összefoglalás helyett ezt a specifikációt olvassa, és azzal kezd, hogy kézzel beírja a JSON-RPC-t egy terminalba.
Források és módszer
Link a szakaszhoz: Források és módszerA fenti minden költség és token count a második szekcióban leírt szkriptelt szolgáltatótól jött, Node 22-n, loopback interfészen, o200k_base encodinggal számolva, és azokkal az árakkal árazva, amelyeket a 16. fejezet 2026. szeptember 6-án olvasott — $2,00 millió input tokenenként és $12,00 millió outputonként. A falióra-adatok ugyanazokból a futásokból származnak, a provider latencyje hívásonként 400 ms-ra, az eszközöké 50 ms-ra állítva, tehát az elrendezést mérik, nem valamelyik providert. A két valódi modellen végzett mérés — a handoff tábla és a voting-and-judging tábla — Qwen/Qwen2.5-0.5B-Instruct-t használt float32-ben, CPU-n, azonos alakú endpoint mögött, greedy módon, kivéve ahol temperature szerepel, az intervallumokat pedig a 4. fejezet Wilson-módszerével számítva. Ebben a fejezetben egyetlen request sem ment fizetős endpointnak, és egyetlen szám sem becslés.
Hivatkozások
Link a szakaszhoz: Hivatkozások-
Anthropic, Building effective agents, 2024. december 19.,
anthropic.com/engineering/building-effective-agents, olvasva: 2026. szeptember 7. A fent használt öt workflow-név forrása, és minden tőlük idézett kifejezésé — prompt chaining, routing, parallelisation a sectioning és voting variánsokkal, orchestrator-workers, evaluator-optimiser —, valamint annak az ajánlásnak is, hogy találjuk meg „a lehető legegyszerűbb megoldást, és csak akkor növeljük a komplexitást, amikor szükséges”, illetve annak a megfigyelésnek, hogy „az agentic rendszerek gyakran latencyt és költséget cserélnek jobb feladatteljesítményre”. A 22. és 23. fejezet az agent definícióját idézi belőle. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 -
Wang, X., Wei, J., Schuurmans, D., Le, Q., Chi, E., Narang, S., Chowdhery, A. és Zhou, D. Self-Consistency Improves Chain of Thought Reasoning in Language Models. arXiv:2203.11171 (2022. március). A voting minta eredete, ott decoding stratégiaként, nem architektúraként leírva: változatos reasoning útvonalak mintavételezése, majd „a legkonzisztensebb válasz kiválasztása a mintavételezett reasoning útvonalak marginalizálásával”, jelentett nyereségekkel: +17,9 GSM8K-n, +11,0 SVAMP-on, +12,2 AQuA-n, +6,4 StrategyQA-n és +3,9 ARC-challenge-en. ↩
-
Madaan, A. és mtsai. Self-Refine: Iterative Refinement with Self-Feedback. arXiv:2303.17651 (2023). Az evaluator-optimiser loop egy modellel mindhárom szerepben — „generator, refiner, and feedback provider” —, amely hét feladaton „átlagosan ~20% abszolút” teljesítményjavulást ért el, emberi preferenciával és automatikus metrikákkal mérve, nem a modell saját verdictjével. ↩
-
Shinn, N., Cassano, F., Berman, E., Gopinath, A., Narasimhan, K. és Yao, S. Reflexion: Language Agents with Verbal Reinforcement Learning. arXiv:2303.11366 (2023). Epizodikus memóriát ad az önkritikákhoz a próbálkozások között — „a language agentek megerősítése nem weightfrissítéssel, hanem nyelvi feedbackkel” —, 91 % pass@1-et jelentve HumanEvalon a GPT-4 baseline 80 %-ával szemben. Figyeld meg azt a követelményt, amelytől az eredményei függnek: valódi jel a környezetből, például egy failing test, nem a modell saját véleménye önmagáról. ↩ ↩2
-
Yao, S., Zhao, J., Yu, D., Du, N., Shafran, I., Narasimhan, K. és Cao, Y. ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629 (2022). Összefűzött reasoning trace-ek és műveletek; a 23. fejezet ezt a loopot építette. Itt a költségalakja miatt idézzük, nem az eredményei miatt: lépésenként egy modellhívás, minden alkalommal az egész transcript újraküldésével. ↩
-
Wang, L., Xu, W., Lan, Y., Hu, Z., Lan, Y., Lee, R. K.-W. és Lim, E.-P. Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning by Large Language Models. arXiv:2305.04091 (2023). „Először terv készítése az egész feladat kisebb részfeladatokra bontásához, majd a részfeladatok végrehajtása a terv szerint” — a plan-then-execute alak, és annak az alkúnak a forrása, amely ezt a fejezetet érdekli: a terv rögzül, mielőtt az első megfigyelés megérkezik, vagyis prompt chaining, csak a bontást modell írja, nem te. ↩
-
Yao, S., Yu, D., Zhao, J., Shafran, I., Griffiths, T. L., Cao, Y. és Narasimhan, K. Tree of Thoughts: Deliberate Problem Solving with Large Language Models. arXiv:2305.10601 (2023). Keresés köztes „thoughts” felett self-evaluationnel és backtrackinggel; 74 % Game of 24-en a chain-of-thought prompting 4 %-ával szemben. A fent idézett költségadatok a tanulmány sajátjai, a B.3 függelék 7. táblájából: esetenként input/output prompting best-of-100 $0,13-ért 33 %-ra, chain of thought best-of-100 $0,47-ért 49 %-ra, tree of thoughts $0,74-ért 74 %-ra, a szerzők megjegyzésével, hogy a ToT „5–100-szor több generált tokent igényelhet, mint a CoT”. ↩ ↩2
-
OpenAI, A practical guide to building agents (PDF), olvasva: 2026. szeptember 7. A manager és decentralized közötti felosztás, a fent idézett graph-keretezés („a manager mintában az élek tool callokat jelentenek, míg a decentralized mintában az élek handoffokat jelentenek”), valamint a handoff definíciója mint „egyirányú átadás... azonnal elindítjuk a végrehajtást azon az új agenten, amelynek átadták, miközben a legfrissebb beszélgetésállapotot is átvisszük”. Figyeld meg, mit dönt el az utolsó tagmondat: ebben az SDK-ban a beszélgetésállapot tényleg utazik, ami ennek a könyvtárnak a design döntése, nem a handoffok általános tulajdonsága. ↩ ↩2
-
Agent2Agent (A2A) Protocol Specification, legutóbbi kiadott verzió: 1.0.0,
a2a-protocol.org/latest/specification/, olvasva: 2026. szeptember 7.; copyright: Linux Foundation, Apache-2.0. Fent idézve: „nyílt szabvány, amely független, potenciálisan opaque AI agent systems közötti kommunikációt és interoperabilitást hivatott megkönnyíteni”, valamint az opaque execution elve — az agentek „deklarált képességek és kicserélt információ alapján működnek együtt, anélkül, hogy meg kellene osztaniuk belső gondolataikat, terveiket vagy eszközimplementációikat”. Az oldal release historyt tartalmaz (0.1.0, 0.2.6, 0.3.0, 1.0.0), egy breaking changes függeléket, és egy függeléket az MCP-hez való viszonyáról. A 26. fejezet ezt az összehasonlítást végzi el. ↩ -
A multi-agent frameworkök, amelyeket ez a fejezet nem tanít, annak az olvasónak, aki tutorial helyett elsődleges forrásokat akar: Wu, Q. és mtsai., AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation, arXiv:2308.08155 (2023), ahol az agentek „customizable, conversable”, és maga a beszélgetés a programozási modell; Hong, S. és mtsai., MetaGPT: Meta Programming for a Multi-Agent Collaborative Framework, arXiv:2308.00352 (2023), amely standard operating procedure-öket kódol role promptokba, és expliciten kimondja, hogy „összetettebb feladatok megoldásai logikai inkonzisztenciák miatt bonyolódnak, amelyeket az LLM-ek naiv láncolásából eredő cascading hallucinations okoznak” — ez a fejezet elején mért magabiztosan hibás lánc, absztraktban megnevezve; valamint Park, J. S. és mtsai., Generative Agents: Interactive Simulacra of Human Behavior, arXiv:2304.03442 (2023), huszonöt agenttel, memóriával, reflexióval és tervezéssel, ami a legnagyobb publikált válasz arra, hogy „mi történik, ha tovább adogatod hozzá az agenteket”. ↩