BİLGİSAYAR ERİŞİM SİSTEMİ

Çok Ajanlı Desenler: Orkestratörler, İşçiler ve Boru Hatları


Tek ajanlar, iyi kapsamlı görevler için iyidir. Bir görev alanlar arasında uzman bilgisi, büyük girdiler üzerinde paralel çalışma veya yürütmeden önce doğrulanması gereken kararlar gerektirdiği anda, birden fazla ajana ihtiyaç duyarsınız.

Çok ajanlı sistemler doğası gereği daha karmaşık değildir — sadece farklı yapılandırılmıştır. Anahtar, sorun için doğru deseni seçmektir. Üç desen çoğu kullanım durumunu kapsar: orkestratör-işçi, boru hattı ve paralel fan-out.

Neden Birden Fazla Ajan

Çok ajanlı sistemler için argüman üç pratik nedene bağlıdır.

Uzmanlaşma. Bağlamda 50 araçla tek bir ajan kafası karışır. 5 odaklı araçla uzman bir ajan daha iyi performans gösterir. Alana göre bölün — araştırma, yazma, kod, doğrulama — ve her ajan bir şeyi iyi yapar.

Paralellik. Bazı görevler bağımsız alt görevlere ayrılır. 20 belgeyi sıralı olarak analiz etmek yavaştır; bunları paralel ajanlarla eş zamanlı olarak analiz etmek hızlıdır.

Doğrulama. Bir ajanın çıktı üretmesi ve ikinci bir ajanın onu bağımsız olarak eleştirmesi, öz-incelemenin kaçırdığı hataları yakalar. İnceleyenin orijinal yanıtı savunmada çıkarı yoktur.

Desen 1: Orkestratör-İşçi

Bir orkestratör ajan planlar ve delege eder. İşçi ajanlar belirli görevleri yürütür ve sonuçları döndürür. Orkestratör nihai çıktıyı birleştirir.

Bu en esnek desendir. Orkestratör, planını ara sonuçlara göre uyarlayabilir, başarısız görevleri yeniden deneyebilir veya farklı bir işçiye iletebilir.

import anthropic
import json
client = anthropic.Anthropic()
def run_worker(system_prompt: str, task: str) -> str:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
system=system_prompt,
messages=[{"role": "user", "content": task}]
)
return response.content[0].text
def orchestrator(user_request: str) -> str:
# Step 1: plan the work
plan_response = client.messages.create(
model="claude-opus-4-6",
max_tokens=1024,
system="""You are a planning agent. Given a user request, break it into
2-4 specific subtasks. Return a JSON array of task descriptions only.
Example: ["Research X", "Analyze Y", "Synthesize findings"]""",
messages=[{"role": "user", "content": user_request}]
)
tasks = json.loads(plan_response.content[0].text)
# Step 2: run each task with a specialized worker
results = []
for task in tasks:
result = run_worker(
system_prompt="You are a focused execution agent. Complete the assigned task thoroughly.",
task=task
)
results.append({"task": task, "result": result})
# Step 3: synthesize
synthesis_prompt = f"""Original request: {user_request}
Worker results:
{json.dumps(results, indent=2)}
Synthesize these results into a cohesive final response."""
final = client.messages.create(
model="claude-opus-4-6",
max_tokens=2048,
messages=[{"role": "user", "content": synthesis_prompt}]
)
return final.content[0].text

Orkestratör deseni, görev yapısı önceden bilinmediğinde en iyi çalışır. Problemi analiz edene kadar kaç alt göreve ihtiyaç duyacağınızı bilmiyorsanız, bir orkestratör kullanın.

Bir tuzak: orkestratörler mantıklı olmayan alt görevler hayal edebilir. Çıktı biçimini (JSON dizisi, numaralı liste) sınırlayın ve işçileri çalıştırmadan önce doğrulayın. Yedek yeniden planlama adımıyla JSON ayrıştırması etrafında bir try/except bloğu bunu zarif bir şekilde işler.

Desen 2: Boru Hattı

Ajanlar sıralı bir zincir oluşturur. Her ajan girdiyi dönüştürür ve çıktısını bir sonrakine iletir. Hiçbir ajan diğerlerinden haberdar değildir — girdi alırlar ve çıktı üretirler.

Bu, uygulanması ve akıl yürütülmesi en basit desendir. İyi tanımlanmış aşamalarla dönüşüm görevleri için iyi çalışır.

def run_pipeline(input_text: str) -> str:
stages = [
{
"name": "Researcher",
"system": "Extract and organize all key facts from the input. "
"Format as a structured list with sources noted where available.",
},
{
"name": "Writer",
"system": "Transform the research notes into clear, readable prose. "
"Maintain all factual content. Target a technical audience.",
},
{
"name": "Editor",
"system": "Improve clarity and concision. Remove redundancy. "
"Do not change facts. Return only the improved text.",
},
{
"name": "Fact Checker",
"system": "Review for internal consistency. Flag any claims that "
"contradict each other or seem unsupported. "
"If no issues, return 'VERIFIED: ' followed by the original text.",
},
]
current = input_text
for stage in stages:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
system=stage["system"],
messages=[{"role": "user", "content": current}]
)
current = response.content[0].text
print(f"[{stage['name']}] complete ({len(current)} chars)")
return current

Boru hatları hataları biriktirir. Araştırmacı bir şeyi kaçırırsa, yazar onu geri ekleyemez. Aşamalarınızı kayıplı değil ekleyici olacak şekilde tasarlayın — bir sonraki aşamanın ihtiyaç duyabileceği bilgileri silen aşamalardan kaçının.

Pratik bir ayarlama: aşağı akıştaki ajanlar önceki aşamaların sıkıştırmış olabileceği bağlama ihtiyaç duyduğunda her aşamanın çıktısıyla birlikte orijinal girdiyi iletin.

Desen 3: Paralel Fan-Out

Büyük bir girdiyi bağımsız parçalara bölün, her birini ayrı ajanlarla eş zamanlı olarak işleyin, ardından sonuçları birleştirin.

Bu, tek bir bağlam penceresine rahat sığmayan veri miktarını işlediğinizde veya işleme süresi önemli olduğunda doğru desendir.

import asyncio
async def analyze_document(doc: str, index: int) -> dict:
"""Analyze a single document asynchronously."""
system = """Analyze this document and return a JSON object with:
- "sentiment": positive/negative/neutral
- "key_topics": list of 3-5 main topics
- "summary": 2-3 sentence summary
- "flags": list of any concerns (empty list if none)"""
# asyncio.to_thread lets you call synchronous code in a thread pool
result = await asyncio.to_thread(
lambda: client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=512,
system=system,
messages=[{"role": "user", "content": doc}]
).content[0].text
)
return {"index": index, **json.loads(result)}
async def parallel_analysis(documents: list[str]) -> dict:
# Fan out: analyze all documents concurrently
tasks = [analyze_document(doc, i) for i, doc in enumerate(documents)]
analyses = await asyncio.gather(*tasks)
# Aggregate with a dedicated synthesis agent
synthesis_input = json.dumps({
"document_count": len(documents),
"analyses": analyses
})
aggregate_result = await asyncio.to_thread(
lambda: client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system="Synthesize document analyses into: overall sentiment distribution, "
"top themes across all documents, and notable patterns in flags. "
"Return as JSON.",
messages=[{"role": "user", "content": synthesis_input}]
).content[0].text
)
return {
"individual": analyses,
"aggregate": json.loads(aggregate_result)
}

Toplama adımı, çoğu uygulamanın köşeleri kestiği yerdir. Sonuçları birleştirmeyin — bunları toplama görevini anlayan bir ajana iletin. 20 analizin string birleşimi yararlı değildir; sentezlenmiş bir özet yararlıdır.

Model seçimine dikkat edin: yüksek hacimli belge başına analizde hızın önemli olduğu ve görevin basit olduğu durumlar için claude-haiku-4-5-20251001 kullanın, ve verim yerine yargının daha önemli olduğu sentez için claude-sonnet-4-6 kullanın.

Doğru Deseni Seçme

DurumDesen
Görev yapısı analiz edilene kadar bilinmiyorOrkestratör-işçi
İyi tanımlanmış dönüşüm aşamalarıBoru hattı
Büyük girdi, bağımsız parçalarParalel fan-out
Bağımsız doğrulama gerekiyorOrkestratör veya inceleme aşamalı boru hattı
Büyük girdilerde gecikmeyi minimumda tutmaParalel fan-out

Bu desenler bileşimdir. Gerçek bir sistem, bazı görevleri paralel olarak fan-out eden ve diğerlerini bir boru hattından geçiren bir orkestratör kullanabilir. Uygun en basit desenle başlayın ve yalnızca daha basit yaklaşım başarısız olduğunda karmaşıklık ekleyin.

Pratik Hususlar

Maliyet. Çok ajanlı sistemler API çağrılarını çarpar. 4 aşamalı bir boru hattı, sentez ek yüküyle birlikte tek bir çağrının 4 katına mal olabilir. Modelleri stratejik olarak karıştırın: yargının önemli olduğu orkestrasyon ve planlama için Opus kullanın, yüksek hacimli yürütme görevleri için Haiku.

Hata yayılımı. Her ajanın başarısızlıkları nasıl ele alacağını önceden belirleyin. Seçenekler: hatayı yayın (dur), bir hata nesnesi döndürün (orkestratorun karar vermesine izin verin) veya değiştirilmiş bir prompt ile yeniden deneyin (zarif şekilde kurtarır, gecikme ekler). Çoğu üretim sistemi için, yapılandırılmış hata nesneleri döndürmek ve orkestratörün karar vermesine izin vermek doğru varsayılandır.

İzleme. Her ajanın ne yaptığını göremediğiniz çok ajanlı bir sistem hata ayıklama kabusu olur. Her ajan çağrısını şunlarla günlüğe kaydedin: girdi, çıktı, model, gecikme ve token sayısı. Her çağrıyı tam yürütme yolunu yeniden oluşturabilmeniz için bir izleme kimliğiyle etiketleyin.

Bağlam geçişi. Her ajanın aldığı bağlam hakkında bilinçli olun. Tam konuşma geçmişini her ajana iletmek pahalı ve çoğu zaman kafa karıştırıcıdır — ajanlar ilgisiz önceki bağlam tarafından dikkatlerini dağıtır. Her ajana yalnızca kendi belirli işini yapması için ihtiyaç duyduğu şeyi iletin.

Sırada Ne İnşa Edilecek

Buradaki desenler temeli oluşturur. Üzerine ne inşa ettiğiniz probleminize bağlıdır:

  • İşçilere araç kullanımı ekleyin — uzman ajanların API çağırmasına, veritabanlarını sorgulamasına veya kod çalıştırmasına izin verin
  • Orkestratorün yüksek riskli eylemlerden önce duraksadığı insan döngüsü kontrol noktaları ekleyin
  • Gelecekteki ajanların sorgulayabileceği bir vektör deposuna ajan çıktılarını kalıcı hale getirerek bellek ekleyin
  • Çıktıları kullanıcıya döndürmeden önce bir yargıç ajandan geçirerek değerlendirme ekleyin

Çok ajanlı sistemler, yapay zekada ilginç mühendisliğin şu anda gerçekleştiği yerdir. Desenler basittir; yargı, bunları belirli probleminize doğru şekilde uygulamadadır.


İlgili Makaleler