Multi-Agent Orchestration: Beş Kalıp ve Hangisi Ne Zaman Kazanır
Aynı fatura dört yolla çözüldü: orchestrator tek agent maliyetinin 1,66 katına çıktı ve aynı karara vardı.
Bu sayfada
Bölüm 24, hak ettiği bir soruyla bitmişti: bir sub-agent yanlış yaptığında, parent tam olarak neye bakabilir?
Bu bölüm bunu bir faturayla yanıtlıyor. Tek görev — bir müşteri bir faturaya itiraz ediyor ve yanıt istiyor — dört şekilde çözüldü; hepsi Bölüm 23 harness’ını aynı scripted provider’a karşı çalıştırdı, hepsi aynı token’ları aynı encoder ile saydı, hepsi Bölüm 16’nın 6 Eylül 2026’da okuduğu fiyatlarla ücretlendirildi.
| arrangement | model calls | input tokens | output | cost | wall clock | verdict |
|---|---|---|---|---|---|---|
| prompt chaining | 4 | 900 | 165 | $0.003780 | 1,648 ms | wrong |
| one agent, four tools | 5 | 2,697 | 179 | $0.007542 | 2,224 ms | right |
| parallel sections | 9 | 2,910 | 324 | $0.009708 | 2,165 ms | right |
| orchestrator-workers | 12 | 3,628 | 438 | $0.012512 | 5,090 ms | right, and it cannot prove it |
İlk ve son satırı birlikte oku: aralarında, sektörün şu anda tartıştığı her argüman duruyor. En ucuz arrangement aynı zamanda en hızlısıydı ve kendinden emin, yanlış, gönderilebilir bir cevap üretti. En pahalı olan doğru sonuca vardı, 3,3 kat para ve 3,1 kat süre harcadı, sonunda da kontrol etme yolu olmayan bir worker sonucunu alıntıladı.
Bu tablolara kimsenin koymadığı satır ikincisi: dört tool’a sahip tek agent, orchestrator ile aynı karara paranın %60’ı ve wall clock’un %44’üyle ulaştı. Bu sadelik tercihi değil. Bu bir ölçüm; bu bölümün geri kalanı da bunun ne zaman doğru olmaktan çıktığıyla ilgili.
Ayrıntıları göster
Bu bölümün önceki bölümlerden ihtiyaç duyduğu şeyler.
- Bölüm 18 tool contract için: modelin gördüğü bir schema, hiç görmediği bir endpoint. Bir agent’ın tamamı bu interface’in arkasına sığar; multi-agent’ın tamamı da budur.
- Bölüm 22 birbiriyle uyuşmayan iki yayımlanmış “agent” tanımı ve bir prompt zincirinin N call olduğu aritmetiği için.
- Bölüm 23 loop, çıkışın beş yolu, run state ve trace için. Aşağıdaki her arrangement o dosyanın farklı çağrılmış hâlidir.
- Bölüm 24 bir window’un maliyeti ve ondan düşenler için. Bir sub-agent, onun dört stratejisinden dördüncüsüdür ve policy değil ikinci bir agent olan tek stratejidir.
Tensor yok. Buradaki her şey TypeScript; gerçek bir yerel modele karşı alınmış iki ölçüm hariç.
Görev ve içindeki tuzak
Bölüme bağlantı: Görev ve içindeki tuzakPortekizli bir şirket, FT-2026-0918 numaralı fatura hakkında yazıyor. E-posta KDV’nin yanlış göründüğünü söylüyor ve faturayı ekliyor: net EUR 248.00, %21 KDV uygulanmış, EUR 52.08, toplam EUR 300.08.
Yanıtlamak için gereken bilgiler üç yerde duruyor ve bunlardan yalnızca biri e-postada:
| where | what it says |
|---|---|
| ekli fatura | satıcı İspanya’da, KDV %21 uygulanmış, EUR 52.08 |
| sipariş kaydı | alıcı Portekiz’de kayıtlı, geçerli bir KDV kimliği var, business-to-business |
| vergi tablosu | İspanya yurt içi oranı %21; geçerli kimlikle AB içi business-to-business, reverse charge, %0 |
Üçünü birleştirince fatura yanlış: reverse charge uygulanmalıydı, KDV sıfır olmalıydı, EUR 52.08 tutarında bir alacak dekontu borçlu. Yalnızca faturaya bakarsan aritmetik kusursuzdur — 248.00 artı 52.08, 300.08 eder — ve öyle söylersin.
E-posta “Portekizli bir şirketiz” diyor. Bu bir iddia, kayıt değil; hiçbir faturalama sistemi bir iddiaya dayanarak alacak dekontu düzenlemez. Tuzak hile değil: iş kararının kimsenin getirmeyi düşünmediği bir bilgiye ihtiyaç duyduğu sıradan business work şekli.
Yukarıdaki her şey, Bölüm 23’tekine benzer bir scripted provider’a karşı, tam olarak tek kuralla çalışır:
Bir cevap yalnızca prompt’unda bulunan bir bilgiyi kullanabilir.
“Model”, sahip olduğu her tool’u katalog sırasıyla bir kez ister, sonra görebildiği metne sabit bir kural uygular. Hiçbir şey arrangement’a özel script’lenmedi; bu yüzden açılış tablosundaki farklar model zekâsı iddiaları değil: ölçülmüş information routing. Gerçek bir model bunun üstüne kendi hatalarını ekler; bunları ortadan kaldırmaz.
Beş kalıp, yaklaşık kırk satırda
Bölüme bağlantı: Beş kalıp, yaklaşık kırk satırdaAşağıdaki beş ad Anthropic’in Building effective agents yazısından; bu kelime dağarcığının oturduğu yer orası.1 Beş fikrin hiçbiri yeni değil; hangi evi neyi adlandırdı — ve hangi fikir daha eski — bunu bilmek değerin yarısı.
/* 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 };
}Bütün araç seti bu: beş function, framework yok, parallel olanı ise tek satır — onu çizmek yerine yazmanın amacı da bu. Şimdi her birini sırayla, kökeni, fiyatı ve yanlış olduğu durumla birlikte ele alalım.
Chaining ve senin yerine verdiği karar
Bölüme bağlantı: Chaining ve senin yerine verdiği kararPrompt chaining, “bir görevi, her LLM call’unun bir öncekinin output’unu işlediği adımlar dizisine ayırır”.1 Fikir dil modellerinden daha eski: bu bir pipeline’dır; pipeline’ın takası da veri gelmeden önce sabitlenmiş bir control flow karşılığında netliktir.
Görevimiz için dört adım: fatura alanlarını çıkar, aritmetiği kontrol et, ne borçlu olunduğuna karar ver, yanıtı yaz. Burada iki farklı şekilde başarısız oluyor; bu da tek başarısızlıktan daha çok şey öğretiyor.
--- 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."Relay chain $0.001940 tuttu ve fatura alanlarını ikinci ile üçüncü adımlar arasında kaybetti; çünkü üçüncü adıma yalnızca aritmetik hakkında bir cümle verildi, başka hiçbir şey değil. Bir bekletme mesajı üretti: işe yaramaz ve görünür şekilde işe yaramaz.
Accumulating chain — açılış tablosundaki satır — $0.003780 tuttu; bu, aynı dört call için %95 daha fazla, çünkü artık her adım kendinden önceki her şeyi taşıyor. Tehlikeli output’u üretti. Akıcı, aritmetiğini kaynak gösteren, bahsettiği her sayıda doğru ve EUR 52.08 borçluyken müşteriye hiçbir şey borçlu olunmadığını söyleyen.
İkisi arasındaki fark tek bir ternary. Daha az taşıyan bir chain bariz eksik cevaplar üretir; her şeyi taşıyan bir chain ise kendinden emin biçimde yanlış cevaplar üretir — ve yalnızca ikinci tür gönderilir.
Gerçek başarısızlık ikisi de değil. Gerçek başarısızlık, pipeline’ın daha hiçbir şeyi okumadan bu görevin bir e-postanın içeriği üzerinde dört adımdan oluştuğuna karar vermesidir. Bu yapının hiçbir yerinde “kayıt ülkesi bu e-postada yok; git al” diyecek bir yer yok. Chaining, decomposition önceden bilindiğinde ve stabil olduğunda doğrudur. Burada bir tahmindi ve tahmin ship edildi.
Routing, en eskisi ve kimsenin yazmadığı plan B
Bölüme bağlantı: Routing, en eskisi ve kimsenin yazmadığı plan BRouting, “bir input’u sınıflandırır ve onu uzmanlaşmış bir followup task’a yönlendirir”.1 Adı yeni; mekanizma dispatcher’dır ve bu kitaptaki neredeyse her şeyden eskidir. Yeni olan, classifier’ın bir model olabilmesidir — onu bir switch’in hiç yaşamadığı şekillerde başarısız yapan da budur.
const answer = await route(email,
(q) => classifyWithSmallModel(q), // cheap model, one call
{ billing: billingAgent, tax: taxAgent, dunning: dunningAgent },
taxAgent, // deterministic, chosen in advance
);Son argüman hakkında iki şey. Bu error handling değildir; kalıbın kendisidir. Model tabanlı bir router’ın dispatcher’da olmayan bir failure mode’u vardır: var olmayan bir label döndürebilir, time out olabilir ya da — pahalı olan — yanlış olduğuna dair sinyal olmadan makul ama yanlış bir label döndürebilir. Üçü de bir yere düşmek zorunda ve o yer başka bir model call olamaz; çünkü zaten model call’ların başarısız olduğu branch’tesin.
İkinci şey, router’ın kendi prompt’unun ücretsiz olmadığıdır. Bir model seçmek için router’ın seçebileceği bir model kataloğuna ihtiyacı vardır ve içindeki her girdi, router’ın kullanıcının sorusunu okumadan önce ödediği input’tur. Bu kursun fiyatlandırmada kullandığı input rate ile yaklaşık 3.800 token’lık bir katalog, daha şimdiden açılış tablosundaki beş çağrılık agent run’ın tamamı kadar tutar. Pratikte routing çağrısı ucuz bir model üzerinde çalışır ve routing’in kendi masrafını çıkarmasının bütün nedeni de budur; ama bunu varsaymak yerine aritmetiği o yönde yapmaya değer. Routing, tam da yönlendirilen task routing kararının kendisinden daha ucuz olduğunda yanlıştır.
Parallelisation: sectioning ve voting, yani self-consistency
Bölüme bağlantı: Parallelisation: sectioning ve voting, yani self-consistencyAnthropic bunu ikiye ayırır: sectioning — “bir görevi paralel çalışan bağımsız subtasks’a bölmek” — ve voting — “çeşitli outputs almak için aynı görevi birden çok kez çalıştırmak”.1 Aynı diyagramı paylaşırlar ve bunun dışında neredeyse hiçbir şeyi paylaşmazlar.
Sectioning ucuz kazançtır ve patterns.ts satırıdır: üç uzman — billing, tax, policy — her biri kendi window’u ve tool’larıyla, aynı e-posta üzerinde, sonunda bir synthesis call. Aynı iş, iki farklı sırayla:
| model calls | input | output | cost | wall clock | |
|---|---|---|---|---|---|
| üç worker, birbiri ardına | 9 | 2,910 | 324 | $0.009708 | 3,894 ms |
aynı üçü, Promise.all | 9 | 2,910 | 324 | $0.009708 | 2,165 ms |
Token token aynı, 1,8 kat daha hızlı. Kalıbın kendi adını hak etmesinin nedeni bu: beşinin içinde hiçbir şeye maliyet eklemeden bir şeyi iyileştiren tek kalıp. Püf noktası, section’ların gerçekten bağımsız olması gerektiğidir — section B’ye section A’nın ürettiği bir bilgi ver ve Promise.all ikisini de henüz var olmayan bir state’e karşı çalıştırır. for loop bu bug’ı sakladı; tek satırlık olan ortaya çıkarıyor.
Voting, aynı resmi giyen başka bir canlıdır. Aynı soruyu k kez çalıştırıp çoğunluğu almak self-consistency’dir; Wang ve diğerleri tarafından Mart 2022’de bir decoding stratejisi olarak yayımlandı, kimse ona orchestration pattern demeden neredeyse üç yıl önce. Özeti mekanizma konusunda nettir — “yalnızca greedy olanı almak yerine önce çeşitli reasoning path’lerden oluşan bir küme sample eder, sonra sampled reasoning path’leri marginalize ederek en tutarlı yanıtı seçer” — ve kazanç konusunda da nettir: GSM8K’da +17,9 puan.2
Resmin sakladığı iki sonuç çıkar. Birincisi, voting Bölüm 17’nin sampling’ini gerektirir: temperature sıfırda tüm k samples aynı sample’dır ve çoğunluk, k kez parası ödenmiş tek bir cevaptır. İkincisi, yalnızca çoğunluğun anlamlı olduğu yerde çalışır — yukarıdaki fatura yanıtında sayılacak bir şey yoktur, çünkü beş draft beş farklı cümledir. Voting, kısa ve karşılaştırılabilir cevabı olan görevler içindir; Wang’ın benchmark’ları tam olarak budur, customer-facing bir agent’ın yaptığı neredeyse hiçbir şey değil.
Burada, cevapları yargılanmak yerine hesaplanan 20 üç adımlı word problem üzerinde, Bölüm 23’ün yerel modeli adım adım reasoning yaparken ölçüldü:
| model calls | input | output | cost for the 20 | correct | 95 % interval | |
|---|---|---|---|---|---|---|
| one greedy chain | 20 | 1,330 | 2,649 | $0.034448 | 9/20 | 26–66 % |
| majority of 5, temperature 0.8 | 100 | 6,650 | 13,245 | $0.172240 | 9/20 | 26–66 % |
Beş kat call, beş kat token, tam beş kat fatura ve bir tane bile ek doğru cevap yok. Voting bir bahistir, iyileştirme değil; bu run bahsi kaybetti.
Bunu Wang’ın çürütmesi diye alıntılamadan önce iki not. Yirmi trial, %45 ile %60’ı ayırt edemez — interval iddianın genişliği kadar, bu da Bölüm 4’ün disiplininin kendi sonucuma uygulanmış hâli. Yayımlanmış kazançlar da orders of magnitude daha büyük modellerden geliyor; voting’in marginalize ettiği diverse reasoning path’ler orada gerçekten diverse. Aktarılan şey sayı değil: multiplier kesin ve önceden bilinirken kazancın böyle olmaması.
Orchestrator-workers ve bir özetin olmadığı şey
Bölüme bağlantı: Orchestrator-workers ve bir özetin olmadığı şeyOrchestrator-workers workflow’da “merkezi bir LLM görevleri dinamik olarak parçalara ayırır, worker LLM’lere delegate eder ve sonuçlarını synthesize eder”; sectioning’den farkı da “subtasks’ın önceden tanımlı olmaması, orchestrator tarafından belirlenmesidir”.1 Buradaki köken dil modellerinden gelmiyor: bu master-worker’dır; worker’ların bulguları bir controller’ın okuduğu shared space’e yazdığı sürüm de 1970’lerdeki speech understanding araştırmalarından blackboard architecture’dır. 2026’da yeni olan, controller’ın bir model olması ve bu yüzden decomposition’ın input başına kararlaştırılabilmesidir — esneklik ve maliyet, tek cümlede.
Tek agent’ın 5 call’una karşı 12 model call tuttu ve aynı karara vardı. Sonra yakından bakmaya değer bir şey yaptı:
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-4471İkisi de doğru. Yalnızca biri nedenini biliyor. Tax worker kendi window’unda faturaya, siparişe ve vergi tablosuna sahipti, sonuca vardı ve ayrıca — kimse sormamışken — faturadaki purchase order numarasının sipariştekiyle eşleşmediğini fark etti. Sonra bir summary döndürdü. Orchestrator iki ifadeyi de tekrarlayabilir ve ikisini de kontrol edemez; çünkü evidence hiç görmediği bir window’da kaldı. Bölüm 24’ün kapanış sorusu böyle yanıtlanır: parent, child’ın yazmayı seçtiği her şeye bakabilir.
Düzeltme bir flag’dir ve bir fiyatı vardır:
| what the worker returns | orchestrator input tokens | cost | what the parent can do |
|---|---|---|---|
| its conclusion | 3,628 | $0.012512 | repeat it |
| its conclusion and its evidence | 4,065 | $0.013554 | derive it again, and disagree |
Yüzde on iki daha fazla input tokens, %8,3 daha fazla para ve source=worker_unverified ifadesi cevaptan kaybolur. Her multi-agent system’daki takas budur ve neredeyse hiç açıkça söylenmez: child’ın temiz window’u değerlidir, parent’ın onu audit etme yeteneği para ödemeye değerdir ve ikisine de ücretsiz sahip olamazsın.
Peki orchestrator-workers ne zaman yanlıştır? Burada, bu görevde. Aynı dört tool’a sahip tek agent’ın da ulaştığı doğru cevabı, 1,66 kat maliyet ve 2,3 kat wall clock karşılığında satın aldı ve o cevabı savunmayı zorlaştırdı. Anthropic’in kendi rehberliği pattern’ler başlamadan önce bunu söyler: “mümkün olan en basit çözümü” bul ve “yalnızca gerektiğinde karmaşıklığı artır”, çünkü “agentic systems çoğu zaman daha iyi task performance için latency ve cost takas eder”.1 Yukarıdaki tablolar o cümlenin altına sayılar konmuş hâlidir.
Evaluator-optimiser ve sınavı yazan yargıç
Bölüme bağlantı: Evaluator-optimiser ve sınavı yazan yargıçBir call üretir, diğeri değerlendirir ve loop değerlendirme geçene kadar tekrarlar.1 Yayımlanmış ataları Self-Refine — “generator, refiner, and feedback provider” olarak aynı model, yedi task üzerinde ortalama yaklaşık 20 puan absolute improvement raporlar3 — ve Reflexion’dır; critique’i attempts boyunca episodic buffer’da saklar ve baseline %80’e ulaşırken HumanEval’de %91 pass@1 raporlar.4
Cost model beşinin en basitidir: round başına iki call ve round count senin değildir. Tek call alan bir task üzerinde üç refinement round altı call demektir; bu yüzden pattern’in tabanı 6×, tavanı ise koyduğun cap neyse odur — bu da Bölüm 23’ün budget exit’ini düzenli değil zorunlu kılar.
Tavan daha inceliklidir ve ölçülebilir. Aynı 20 problemde yerel model 9’unu doğru yanıtladı. Sonra bu cevapların her biri gösterildi ve doğru olup olmadığı soruldu — cevabın kendisine ait olduğu söylenmeden; bu da flattery confound’u kaldırıp capability olanı bırakır:
| the model's own answer | it said “yes” | it said “no” |
|---|---|---|
| doğru olan 9 | 9 | 0 |
| yanlış olan 11 | 3 | 8 |
Bu, section title’ın ima ettiğinden daha iyi bir yargıç ve iddia etmek yerine ölçmenin amacı da bunu söylemek: doğru olan hiçbir şeyi engellemedi ve 11 hatadan 8’ini yakaladı. Bir filter olarak call’larına değer.
Bir stopping rule olarak ise — evaluator-optimiser loop’un onu fiilen kullanma şekli budur — o üç approval bütün hikâyedir: loop’u elde yanlış cevapla bitirirler ve hiçbir extra round onlara ulaşamaz. Bir refinement loop, judge’ından daha doğru olamaz. Daha fazla round satın almak, judge’ın görebildiği hatalara tam fiyatla deneme satın almaktır; göremediklerine karşı ise hiçbir şey satın almaz.
Dolayısıyla kural: bir evaluator yalnızca generator’da olmayan bir şeye sahipse call’larını hak eder. Bir compiler, test suite, schema validator, farklı bir model, bir insan. Self-Refine’ın kendi sonuçları human preference ve task metrics’e göre ölçülür; asla modelin kendisi hakkındaki görüşüne göre değil. Evaluator’ının tek avantajı farklı bir prompt ise agreement için iki kat ödüyorsun. Bölüm 29, gerçek avantaja sahip sürümü kurar: cevapları önceden yazılmış bir golden set.
Loop’lar pattern değildir
Bölüme bağlantı: Loop’lar pattern değildirYukarıdaki beşli senin code’un için şekillerdir. Altlarında, çoğu zaman onlarla birlikte listelenen ama listelenmemesi gereken ikinci bir aile durur: ReAct, Reflexion, plan-and-execute ve tree of thoughts reasoning loops’tur ve maliyetleri request’lerdedir.
Bölüm 12, modelin içindeki reasoning hakkındaydı; bunun bedelini tek call’da output tokens olarak ödersin. Bu diğer tür. Fatura geldiğinde fark önemlidir: daha uzun chain of thought tek call’u daha pahalı yapar; reasoning loop ise tek task’ı birçok call’a dönüştürür ve her biri kendinden önceki her şeyi yeniden gönderir — Bölüm 23’ün runaway table’ında ölçtüğü quadratic.
| loop | calls, per task | what the extra calls buy |
|---|---|---|
| ReAct | durana kadar step başına bir | model tool’ların döndürdüğüne react eder5 |
| plan-and-execute | plan için bir, sonra step başına bir | plan ilk step çalışmadan önce sabitlenir6 |
| Reflexion | attempts × (act + reflect) | critique bir sonraki attempt’e taşınır4 |
| tree of thoughts | branching factor × depth, artı node başına bir evaluation | backtracking ile search7 |
Tree-of-thoughts paper kendi cost table’ını yayımlar; bu olması gerekenden daha nadirdir. GPT-4 ile Game of 24 üzerinde: input/output prompting best-of-100, vaka başına $0.13 ile %33 çözdü; chain of thought best-of-100 $0.47 ile %49 çözdü; tree of thoughts $0.74 ile %74 çözdü ve yazarlar bunun “CoT’tan 5-100 kat daha fazla generated tokens gerektirebileceğini” not etti.7
Ucuz yöntemin fiyatının neredeyse altı katı, başarı oranının biraz fazla iki katı için. Bunun iyi bir alışveriş olup olmadığı, başarısız bir vakanın sana neye mal olduğuna bağlıdır — bu dördünden herhangi birini benimsemeden önce sorulacak soru.
Bu kurs onları yeniden implement etmez. Dördünün de kendi yazarları tarafından, Python’da reference implementation’ları var; değerleri bir çeviri değil kaynak olmalarında: ysymyth/ReAct, noahshinn/reflexion, princeton-nlp/tree-of-thought-llm ve AGI-Edgerunners/Plan-and-Solve-Prompting. O repositories’deki prompts’u oku; prompts paper’ların kendisidir.
İki topology ve biri geri dönmez
Bölüme bağlantı: İki topology ve biri geri dönmezŞimdi karışıklığın çoğunun yaşadığı gerçek multi-agent kısmına. Bir agent’ın başka bir agent’ı dahil etmesinin iki yolu vardır; bunlar variant değildir ve fark sonrasında kontrolün kimde olduğudur.
Tool olarak agent. Parent onu çağırır, bir cevap alır ve devam eder. Arkasında bütün bir agent bulunan Bölüm 18 tool interface’idir ve parent kontrolü asla kaybetmez. Yukarıdaki orchestrator’ın yaptığı budur.
Handoff. Parent konuşmayı devreder ve geri almaz. OpenAI’ın guide’ı yayımlanmış en net ifadedir: handoff’lar “bir agent’ın başka bir agent’a delegate etmesini sağlayan tek yönlü bir transferdir... Bir agent bir handoff function çağırırsa, en son conversation state’i de transfer ederken handoff edilen yeni agent üzerinde yürütmeyi hemen başlatırız.”8
Bir vocabulary uyarısı, çünkü insanlar sürekli burada takılıyor: “handoff” bir SDK’nın kelimesidir, standart değildir. OpenAI Agents SDK ve o guide’ın terminolojisidir; aynı guide iki arrangement’ı “manager” ve “decentralized” diye adlandırır ve manager pattern’de “edge’ler tool calls’ı, decentralized pattern’de ise edge’ler handoffs’u temsil eder” der.8 Bu alanda bir açık standart var — Linux Foundation telif hakkı altında, versioned release history ve documented breaking changes listesiyle 1.0.0 sürümündeki A2A; ifade edilen ilkesi opaque execution: agents “internal thoughts, plans veya tool implementations paylaşmaya ihtiyaç duymadan declared capabilities ve exchanged information’a dayanarak collaborate eder”.9 Bu bir handoff değildir ve karşılaştırma Bölüm 26’ya aittir. Burada önemli olan, iki kelimeden birinin bir library’nin API’si, diğerinin ise governance’a sahip bir specification olmasıdır.
Ayrım bir diyagram değil, data structure’dır:
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;
}Yirmi satır, aksi hâlde production’da bulacağın iki bug. reachable kimsenin ulaşamadığı agent’ı bulur — configured, paid for, never called. conflicts aynı anda iki tür olan edge’i reddeder; kulağa pedantik gelir, ta ki yüksek sesle okuyana kadar: parent hem kontrolü korur hem de onu verir. Bir orphan ve bir double edge’e sahip beş agent’lı bir system üzerinde çalıştır:
reachable: lead@0 billing@1 tax@1 dunning@1
orphans: ghost
conflicts: lead->taxSınırı gerçekten ne geçer
Bölüme bağlantı: Sınırı gerçekten ne geçerŞimdi bu section’ın var olma nedeni olan ölçüm ve bölümde scripted değil gerçek modele karşı alınmış tek ölçüm.
Bir müşteri ilk mesajında bir constraint belirtir — hesabımız İspanya’da değil Portekiz’de kayıtlı; vergiyle ilgili her şey Portekiz’i kullanmalı — başka bir şey hakkında sohbet eder, sonra billing’in yanıtlaması gereken bir soru sorar. Vaka transfer edilir. Yirmi dört trial, her seferinde farklı ülke ve şirket, dört transfer payload’u; receiving agent’a sonra tek soru sorulur: bu müşterinin hesabı hangi ülkede kayıtlı?
| what was transferred | mean payload | the constraint was in it | the specialist recalled it | 95 % interval |
|---|---|---|---|---|
| tüm conversation | 173 tokens | 24/24 | 20/24 — 83 % | 64–93 % |
| sending agent’ın yazdığı summary | 62 tokens | 1/24 | 0/24 — 0 % | 0–14 % |
| yalnızca son user message | 61 tokens | 0/24 | 0/24 — 0 % | 0–14 % |
| typed record | 69 tokens | 24/24 | 24/24 — 100 % | 86–100 % |
Üçüncü satır bir control ve control gibi davranır: bilgi orada yoktur, dolayısıyla hatırlanamaz. Diğer üçü bulgudur.
Full transcript 173 tokens ve zamanın %83’ünde çalışır; dört başarısızlığı bu bölümün değil Bölüm 24’ün konusudur. Typed record 69 tokens — summary’den yedi fazla — ve her seferinde çalışır, çünkü constraint bir cümlenin içinde değil named field’dadır.
Ve bakılması gereken satır summary’dir. 24’te 24 kez başarısız oldu ve nedeni reader’ın kaçırması değil. Constraint, 24 summary’nin yalnızca 1’inde hiç yer aldı. Receiving agent dikkatsiz değildi; cevabı içermeyen bir metin verildi. Summary, senin yazmadığın bir compaction’dır; göremediğin bir window’a sahip model tarafından üretilir, summary gibi okunmak için optimize edilir — ve “müşteri kayıtlarımızda yanlış ülke olduğunu söylüyor” tam da summariser’ın procedural noise diye düşürdüğü türden bir clause’dur.
Bu sayı için dürüst bir sınır: summariser yarım milyar parametreli bir model ve daha büyüğü daha fazlasını tutardı. Boyutla iyileşmeyen şey riskin şeklidir — sending agent, her handoff’ta, her phrasing’de, gözlemlenemez biçimde hangi bilgilerin hayatta kalacağına karar verir. Typed record bu yargıya hiç bağlı değildir; bu yüzden intelligence ile değil construction ile kazanır. Transferden sağ çıkması gereken her şey cümle değil field olmalı.
Aynı reasoning diğer yönde, agent-as-tool topology için de geçerlidir ve önceki tablo bunu zaten fiyatladı: bir worker’dan geri gelen de summary’dir ve yanında evidence almak için %8,3 daha fazla ödemek, parent tarafından görülen aynı düzeltmedir.
Tek agent ne zaman kazanır
Bölüme bağlantı: Tek agent ne zaman kazanırÜç kapanış gerçeği, hepsi yukarıdaki tablolardan.
Bir multi-agent system call’ları çoğaltır ve call’lar context içinde quadratic’tir. Orchestrator, tek agent’ın 5 model call yaptığı yerde 12 model call yaptı ve her biri kendi büyüyen transcript’ini taşır — 2.697’ye karşı 3.628 input tokens; task uzadıkça genişleyen bir fark.
Her boundary lossy channel’dır. İki agent bir summary demektir. Chain’de dört agent üç summary demektir; composed, her biri senin kararından başka bir şey için optimize eden bir model tarafından yazılmış.
Tek agent, kimsenin istemediği bir şeyi buldu. Purchase-order mismatch ortaya çıktı çünkü tek window fatura ve siparişi aynı anda tuttu. İşi uzmanlara bölmek, iki bilginin uyuşmadığını fark etme yeteneğini de böler.
Bunların hiçbiri published multi-agent frameworks’e karşı argüman değildir; tutorial’lar üzerinden değil primary sources olarak okumaya değerdirler.10 İkinci agent’ın yerini hak etmesi gerektiğini savunur.
Öyleyse tercih değil test. Şunlardan en az biri doğruysa ikinci bir agent ekle: sub-task, parent’ın inherit etmemesi gereken clean window gerektiriyorsa (Bölüm 24); sub-tasks gerçekten independent ise ve wall clock önemliyse, yukarıdaki 1,8× budur; sub-task different permissions veya farklı bir model gerektiriyorsa, Bölüm 30 bunu security argument’a dönüştürür; ya da sub-task başka biri tarafından owned ise, gerçek bir protocol burada önem kazanmaya başlar. Cevap “her agent’ın daha net prompt’u olsun diye” ise, tek agent’a daha net prompt ver. Ücretsizdir.
Sırada ne var
Bölüme bağlantı: Sırada ne varArtık beş pattern’i adlandırabilir, tek bir task üzerinde birbirlerine karşı fiyatlayabilir, orchestrator’ı sectioner’dan ve tool call’u handoff’tan ayırabilir, tek agent’ı bir tercih yerine tabloyla savunabilirsin.
Buradaki her arrangement, gerçek herhangi bir şeyle temas ettiğinde hayatta kalmayacak tek bir kolaylığı paylaştı: tüm tool’lar bize aitti. Fatura, sipariş, vergi tablosu, orchestrator’ın arkasındaki worker’lar — aynı repository, aynı deploy, aynı types, aynı insanlar.
Şimdi bunlardan birini şirket sınırının öbür tarafına koy. Vergi tablosu bir muhasebe vendor’ına, sipariş kaydı bir warehouse system’a ait; ikisi de senin Tool interface’ini okumadı. Yazmadığın bir modelin, başka birinin işlettiği bir capability’yi discover, describe ve call etmesi için bir yola ihtiyacın var — authentication (bu Bölüm 27’nin yarısı), versioning ve bir server’ın conversation’ının geri kalanını okuyamayacağı guarantee ile. Bu bir protocol problemidir, normative schema’ya sahip bir specification’ı vardır ve hakkında indexed olan neredeyse her şey artık var olmayan bir revision’ı anlatır.
Bölüm 26 bu specification’ı özetlemek yerine okur ve terminale elle JSON-RPC yazarak başlar.
Kaynaklar ve yöntem
Bölüme bağlantı: Kaynaklar ve yöntemYukarıdaki her cost ve token count, ikinci section’da açıklanan scripted provider’dan geldi; Node 22 üzerinde loopback interface ile, o200k_base encoding kullanılarak sayıldı ve Bölüm 16’nın 6 Eylül 2026’da okuduğu rate’lerle fiyatlandı — milyon input tokens başına $2.00 ve milyon output başına $12.00. Wall-clock figures aynı run’lardan; provider latency call başına 400 ms ve tools 50 ms olarak ayarlandı, bu yüzden herhangi bir provider’ı değil arrangement’ı ölçerler. İki real-model measurement — handoff table ve voting-and-judging table — aynı şekle sahip bir endpoint arkasında CPU üzerinde float32’de Qwen/Qwen2.5-0.5B-Instruct kullandı; temperature belirtilen yerler dışında greedy, intervals Bölüm 4’ün Wilson method’u ile hesaplandı. Bu bölümde hiçbir request paid endpoint’e gitmedi ve içindeki hiçbir sayı estimate edilmedi.
Referanslar
Bölüme bağlantı: Referanslar-
Anthropic, Building effective agents, 19 Aralık 2024,
anthropic.com/engineering/building-effective-agents, 7 Eylül 2026’da okundu. Yukarıda kullanılan beş workflow adının ve onlardan alıntılanan her ifadenin kaynağı — prompt chaining, routing, sectioning ve voting variant’larıyla parallelisation, orchestrator-workers, evaluator-optimiser — ayrıca “mümkün olan en basit çözümü bulma ve yalnızca gerektiğinde karmaşıklığı artırma” önerisi ile “agentic systems çoğu zaman daha iyi task performance için latency ve cost takas eder” gözlemi. Bölüm 22 ve 23, onun agent tanımını alıntılar. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 -
Wang, X., Wei, J., Schuurmans, D., Le, Q., Chi, E., Narang, S., Chowdhery, A. and Zhou, D. Self-Consistency Improves Chain of Thought Reasoning in Language Models. arXiv:2203.11171 (Mart 2022). Voting pattern’in kökeni; orada architecture yerine decoding strategy olarak anlatılır: diverse reasoning paths sample et, sonra “sampled reasoning paths’i marginalize ederek en tutarlı answer’ı seç”; GSM8K’da +17,9, SVAMP’ta +11,0, AQuA’da +12,2, StrategyQA’de +6,4 ve ARC-challenge’da +3,9 kazanç raporlanır. ↩
-
Madaan, A. et al. Self-Refine: Iterative Refinement with Self-Feedback. arXiv:2303.17651 (2023). Tek modelin üç rolde olduğu evaluator-optimiser loop — “generator, refiner, and feedback provider” — yedi task üzerinde task performance’da “ortalama ~%20 absolute” iyileşme; modelin kendi verdict’ı yerine human preference ve automatic metrics ile ölçülür. ↩
-
Shinn, N., Cassano, F., Berman, E., Gopinath, A., Narasimhan, K. and Yao, S. Reflexion: Language Agents with Verbal Reinforcement Learning. arXiv:2303.11366 (2023). Attempts boyunca self-critiques için episodic memory ekler — “language agents’ı weights’i update ederek değil, linguistic feedback yoluyla reinforce eder” — GPT-4 baseline’ın %80’ine karşı HumanEval’de %91 pass@1 raporlar. Sonuçlarının dayandığı gereksinime dikkat et: modelin kendi opinion’ı yerine failing test gibi environment’tan gelen gerçek bir signal. ↩ ↩2
-
Yao, S., Zhao, J., Yu, D., Du, N., Shafran, I., Narasimhan, K. and Cao, Y. ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629 (2022). Interleaved reasoning traces ve actions; Bölüm 23 bu loop’u kurdu. Burada results yerine cost shape’i için alıntılanır: step başına bir model call, whole transcript her seferinde yeniden gönderilir. ↩
-
Wang, L., Xu, W., Lan, Y., Hu, Z., Lan, Y., Lee, R. K.-W. and Lim, E.-P. Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning by Large Language Models. arXiv:2305.04091 (2023). “Önce tüm task’ı daha küçük subtasks’a bölmek için bir plan geliştirmek, sonra subtasks’ı plana göre yürütmek” — plan-then-execute şekli ve bu bölümün önemsediği takasın kaynağı: plan ilk observation gelmeden önce sabitlenir; bu da decomposition’ı senin yerine bir modelin yazdığı prompt chaining’dir. ↩
-
Yao, S., Yu, D., Zhao, J., Shafran, I., Griffiths, T. L., Cao, Y. and Narasimhan, K. Tree of Thoughts: Deliberate Problem Solving with Large Language Models. arXiv:2305.10601 (2023). Self-evaluation ve backtracking ile intermediate “thoughts” üzerinde search; chain-of-thought prompting için %4’e karşı Game of 24’te %74. Yukarıda alıntılanan cost figures paper’ın kendi Appendix B.3, Table 7’sinden: vaka başına, input/output prompting best-of-100 $0.13 ile %33, chain of thought best-of-100 $0.47 ile %49 ve tree of thoughts $0.74 ile %74; yazarların ToT’un “CoT’tan 5-100 kat daha fazla generated tokens gerektirebileceği” notuyla. ↩ ↩2
-
OpenAI, A practical guide to building agents (PDF), 7 Eylül 2026’da okundu. Manager-versus-decentralised ayrımı, yukarıda alıntılanan graph framing (“manager pattern’de edge’ler tool calls’ı, decentralized pattern’de edge’ler handoffs’u temsil eder”) ve handoff’un “tek yönlü transfer... en son conversation state’i de transfer ederken handoff edilen yeni agent üzerinde yürütmeyi hemen başlatırız” şeklindeki tanımı. Son clause’un neyi kesinleştirdiğine dikkat et: bu SDK’da conversation state taşınır; bu o library’nin design decision’ıdır, genel olarak handoff’ların property’si değil. ↩ ↩2
-
Agent2Agent (A2A) Protocol Specification, son yayımlanmış sürüm 1.0.0,
a2a-protocol.org/latest/specification/, 7 Eylül 2026’da okundu; telif hakkı Linux Foundation, Apache-2.0. Yukarıda alıntılandı: “independent, potentially opaque AI agent systems arasında communication ve interoperability’yi kolaylaştırmak için tasarlanmış open standard” ve opaque execution ilkesi — agents “internal thoughts, plans veya tool implementations paylaşmaya ihtiyaç duymadan declared capabilities ve exchanged information’a dayanarak collaborate eder”. Sayfada release history (0.1.0, 0.2.6, 0.3.0, 1.0.0), breaking changes appendix’i ve MCP ile ilişkisi hakkında bir appendix vardır. Bölüm 26 bu karşılaştırmayı yapar. ↩ -
Bu bölümün öğretmediği multi-agent frameworks; tutorial yerine primary sources isteyen reader için: Wu, Q. et al., AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation, arXiv:2308.08155 (2023), burada agents “customizable, conversable”dır ve conversation’ın kendisi programming model’dir; Hong, S. et al., MetaGPT: Meta Programming for a Multi-Agent Collaborative Framework, arXiv:2308.00352 (2023), standard operating procedures’ı role prompts’a encode eder ve “daha karmaşık task’lara çözümlerin, LLM’leri naive biçimde chain etmekten kaynaklanan cascading hallucinations nedeniyle logic inconsistencies yoluyla karmaşıklaştığı” konusunda nettir — bu bölümün başında ölçülen confidently-wrong chain, bir abstract’ta adlandırılmış hâliyle; ve Park, J. S. et al., Generative Agents: Interactive Simulacra of Human Behavior, arXiv:2304.03442 (2023), memory, reflection ve planning’e sahip yirmi beş agents; “agent eklemeye devam edersen ne olur” sorusuna yayımlanmış en büyük yanıt. ↩