Wzorzec orkiestrator–subagent
Zaimplementuj wzorzec orkiestrator–subagent, w którym agent planujący dzieli zadania na podzadania, deleguje je wyspecjalizowanym agentom i łączy ich wyniki w końcowy rezultat.
Wzorzec orkiestrator–subagent to bezpłatna lekcja AI Engineering Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Engineering Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.
Model mentalny orkiestratora i podagenta
Wzorzec orkiestrator–podagent jest najczęściej stosowaną architekturą wieloagentową. Agent orkiestrujący otrzymuje cel wysokiego poziomu, rozkłada go na podzadania, deleguje każde podzadanie wyspecjalizowanemu podagentowi, zbiera wyniki i tworzy z nich końcowy wynik. Orkiestratora można traktować jak kierownika projektu, a podagentów jak ekspertów dziedzinowych w zespole.
Obowiązki orkiestratora
Orkiestrator ma trzy podstawowe obowiązki: dekompozycję (rozbicie celu na konkretne podzadania możliwe do wykonania), delegowanie (przypisanie każdego podzadania właściwemu specjaliście) oraz syntezę (połączenie wyników podagentów w spójny rezultat). Sam orkiestrator wykonuje minimalną ilość pracy specyficznej dla domeny — jego wartość polega na koordynacji.
from openai import OpenAI
client = OpenAI()
def orchestrator(goal: str) -> dict:
# Step 1: Decompose
plan = client.chat.completions.create(
model='gpt-4o',
messages=[
{'role': 'system', 'content': 'You are a task planner. Decompose the goal into subtasks. Return JSON with keys: researcher_task, writer_task, coder_task.'},
{'role': 'user', 'content': goal}
],
response_format={'type': 'json_object'}
)
return plan.choices[0].message.contentProjektowanie wyspecjalizowanych podagentów
Każdy podagent jest zoptymalizowany pod kątem jednej odpowiedzialności. Specjalizacja oznacza: skoncentrowany prompt systemowy definiujący rolę, niewielki zestaw narzędzi (3–5) istotnych wyłącznie dla tej roli oraz okno kontekstu zawierające tylko informacje potrzebne do wykonania danego podzadania. Skoncentrowane agenty podejmują lepsze decyzje i łatwiej je oceniać oraz debugować.
def create_researcher_agent():
return {
'model': 'gpt-4o',
'system': '''You are a research specialist. Your only job is to find accurate,
cited information. Return structured findings with sources.
Do NOT write prose or code - only research findings.''',
'tools': ['search_web', 'fetch_url', 'query_arxiv'], # 3 tools only
'max_iterations': 10
}
def create_writer_agent():
return {
'model': 'gpt-4o',
'system': '''You are a technical writer. Transform research findings into clear,
engaging prose. You receive structured data and return polished text.''',
'tools': ['format_markdown', 'check_readability'], # 2 tools only
'max_iterations': 5
}Protokół delegowania
Aby delegowanie działało, orkiestrator musi przekazywać każdemu podagentowi poprawnie sformułowane pakiety zadań. Pakiet zadania zawiera: konkretny cel danego podagenta, potrzebny mu kontekst (a nie pełną historię rozmowy), oczekiwany format danych wyjściowych oraz wszelkie ograniczenia. Niepoprawnie sformułowane pakiety zadań są najczęstszą przyczyną niepowodzeń we współpracy orkiestratora z podagentami.
from dataclasses import dataclass
from typing import Optional
@dataclass
class TaskPacket:
task_id: str
assignee: str # which subagent receives this
goal: str # specific, actionable goal
context: str # only relevant background
output_format: str # JSON schema or description
constraints: list[str] # e.g. ['max 500 words', 'cite sources']
deadline_steps: int # max iterations allowed
def delegate(packet: TaskPacket, subagent_fn) -> str:
prompt = f'Goal: {packet.goal}\nContext: {packet.context}\nOutput format: {packet.output_format}\nConstraints: {packet.constraints}'
return subagent_fn(prompt)Zbieranie i synteza wyników
Po zakończeniu pracy przez podagentów orkiestrator musi zsyntetyzować wyniki. Nie chodzi tu tylko o ich połączenie. Orkiestrator musi rozstrzygnąć sprzeczności między wynikami podagentów, uzupełnić braki, zachować spójny styl lub format oraz przygotować końcowy rezultat, który jako całość będzie spójny. To właśnie na etapie syntezy najbardziej potrzebne są zdolności rozumowania orkiestratora.
def synthesize_results(research: str, draft: str, code: str, goal: str) -> str:
synthesis_prompt = f'''You are given outputs from three specialist agents.
Your job is to synthesize them into one coherent final answer for this goal: {goal}
RESEARCH FINDINGS:
{research}
WRITTEN DRAFT:
{draft}
CODE EXAMPLES:
{code}
Resolve any conflicts, fill gaps, and produce a unified final response.
'''
response = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': synthesis_prompt}]
)
return response.choices[0].message.contentDelegowanie sekwencyjne a równoległe
Orkiestratory mogą delegować zadania sekwencyjnie (wynik jednego podagenta jest przekazywany kolejnemu) lub równolegle (wiele podagentów pracuje jednocześnie). Delegowanie sekwencyjne jest prostsze i sprawdza się, gdy późniejsze kroki zależą od wcześniejszych wyników. Delegowanie równoległe jest szybsze, gdy podzadania są niezależne i mogą być wykonywane współbieżnie, często skracając czas rzeczywisty 3–5-krotnie.
import asyncio
# Sequential: writer needs research first
async def sequential_pipeline(goal):
research = await researcher_agent(goal)
draft = await writer_agent(research) # depends on research
return draft
# Parallel: all three tasks are independent
async def parallel_pipeline(topics):
tasks = [
researcher_agent(topics[0]),
researcher_agent(topics[1]),
researcher_agent(topics[2])
]
results = await asyncio.gather(*tasks) # runs simultaneously
return orchestrator_synthesize(results)Obsługa awarii podagentów
Podagenty od czasu do czasu zawodzą — mogą zwrócić niepoprawnie sformatowane dane, przekroczyć limit iteracji lub napotkać błąd. Orkiestrator musi obsługiwać takie awarie w kontrolowany sposób. Typowe strategie obejmują: ponowienie próby ze sprecyzowanym pakietem zadania, użycie prostszego rozwiązania zastępczego, pominięcie nieudanego podzadania i odnotowanie tego w końcowym wyniku lub przekazanie sprawy do weryfikacji przez człowieka.
def delegate_with_retry(packet: TaskPacket, subagent_fn, max_retries=2):
for attempt in range(max_retries + 1):
try:
result = subagent_fn(packet)
validate_output(result, packet.output_format)
return result
except ValidationError as e:
if attempt < max_retries:
# Clarify the task for retry
packet.goal += f'\n\nPrevious attempt failed: {str(e)}. Please fix.'
print(f'Retry {attempt + 1} for task {packet.task_id}')
else:
return {'error': str(e), 'task_id': packet.task_id, 'status': 'failed'}Dobre formułowanie promptu dla orkiestratora
Prompt systemowy orkiestratora ma kluczowe znaczenie dla jakości całego potoku. Powinien jasno określać: jakie podagenty są dostępne i w czym specjalizuje się każdy z nich, jak formatować pakiety zadań, kiedy uruchamiać podzadania równolegle, a kiedy sekwencyjnie, jak obsługiwać niekompletne lub sprzeczne wyniki oraz co oznacza pomyślny wynik końcowy.
ORCHESTRATOR_SYSTEM_PROMPT = '''
You coordinate a team of specialist agents to complete complex tasks.
Available agents:
- researcher: Finds and cites factual information. Input: question string. Output: JSON with findings and sources.
- writer: Writes polished prose from structured data. Input: JSON findings. Output: markdown text.
- coder: Writes Python code. Input: natural language spec. Output: Python code string.
Workflow:
1. Analyze the goal and decide which agents are needed.
2. Identify dependencies: can any tasks run in parallel?
3. Delegate tasks with clear, specific goals.
4. Validate each result before proceeding.
5. Synthesize all results into a unified final answer.
'''Izolacja kontekstu to zaleta
Jedną z głównych zalet wzorca orkiestrator–podagent jest izolacja kontekstu. Każdy podagent widzi tylko informacje istotne dla swojego podzadania, a nie pełną historię całego projektu. Dzięki temu okno kontekstu każdego podagenta pozostaje niewielkie, co zapobiega wyczerpaniu kontekstu, będącemu częstym problemem pojedynczych agentów. Orkiestrator zachowuje globalny ogląd sytuacji, a podagenty — skoncentrowany ogląd lokalny.
Śledzenie działania i obserwowalność
Systemy wieloagentowe są trudniejsze do debugowania niż pojedynczy agenci, ponieważ awarie mogą wystąpić na dowolnym etapie delegowania. Zawsze należy dodać logowanie strukturalne, aby śledzić: które zadania zostały przekazane, któremu podagentowi, jakie były dane wejściowe i wyjściowe, ile czasu zajęło każde zadanie oraz czy konieczne były ponowienia prób. Narzędzia takie jak LangSmith i Langfuse obsługują wizualizację śladów systemów wieloagentowych.
import time
def logged_delegate(packet: TaskPacket, subagent_fn):
start = time.time()
print(f'[DELEGATE] task_id={packet.task_id} assignee={packet.assignee}')
print(f'[INPUT] {packet.goal[:100]}...')
result = subagent_fn(packet)
elapsed = time.time() - start
print(f'[RESULT] task_id={packet.task_id} elapsed={elapsed:.2f}s')
print(f'[OUTPUT] {str(result)[:100]}...')
return resultWzorzec z praktyki: generator raportów
Konkretnym przykładem wzorca orkiestrator–podagent jest generator raportów z analizy konkurencji. Orkiestrator otrzymuje polecenie „Napisz analizę konkurencji dla firmy X”. Deleguje: zadanie badawcze do agenta badawczego (wyszukuje informacje o cenach, funkcjach i opiniach), zadanie analityczne do agenta analitycznego (wskazuje mocne i słabe strony) oraz zadanie związane z formatowaniem do agenta redakcyjnego (przygotowuje końcowy raport). Każdy specjalista wykonuje to, w czym jest najlepszy.
Szybki sprawdzian
Sprawdź, czy rozumieją Państwo wzorzec orkiestrator–podagent omówiony w tej lekcji.
Podsumowanie lekcji
W tej lekcji nauczyli się Państwo, że wzorzec orkiestrator–podagent wykorzystuje agenta koordynującego do rozkładania pracy na części i delegowania jej specjalistom, że pakiety zadań muszą jasno określać cel, kontekst i oczekiwany format danych wyjściowych, aby delegowanie działało, oraz że izolacja kontekstu utrzymuje niewielkie okno każdego podagenta, podczas gdy orkiestrator zachowuje globalny ogląd sytuacji. W następnej części zbudujemy potoki wieloagentowe za pomocą LangGraph.
Często zadawane pytania
Czy lekcja „Wzorzec orkiestrator–subagent” jest bezpłatna?
Tak — pełny tekst „Wzorzec orkiestrator–subagent” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Engineering Academy, przejdź na CoddyKit PRO. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wzorzec orkiestrator–subagent”?
Zaimplementuj wzorzec orkiestrator–subagent, w którym agent planujący dzieli zadania na podzadania, deleguje je wyspecjalizowanym agentom i łączy ich wyniki w końcowy rezultat. Ćwiczysz AI Engineering Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Engineering Academy?
Nie wymagamy żadnego doświadczenia. AI Engineering Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Wzorzec orkiestrator–subagent”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Engineering Academy?
Tak. Każda lekcja AI Engineering Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Dlaczego pojedyncze agenty napotykają ograniczenia
- Wzorzec orkiestrator–subagent
- Budowanie potoków wieloagentowych za pomocą LangGraph
- Współdzielona pamięć i komunikacja między agentami