오케스트레이터-하위 에이전트 패턴
계획 에이전트가 작업을 하위 작업으로 나누고 전문 에이전트에 위임한 뒤, 결과를 최종 출력으로 종합하는 오케스트레이터-하위 에이전트 패턴을 구현합니다.
오케스트레이터-하위 에이전트 패턴은(는) CoddyKit의 무료 AI Engineering Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Engineering Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Engineering Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
Orchestrator-하위 에이전트 사고 모델
orchestrator-하위 에이전트 패턴은 가장 널리 사용되는 다중 에이전트 아키텍처입니다. orchestrator 에이전트는 상위 수준의 목표를 받고, 이를 하위 작업으로 세분화하고, 각 하위 작업을 전문화된 하위 에이전트에게 위임하고, 결과를 수집한 뒤 최종 출력을 종합합니다. orchestrator를 프로젝트 관리자로, 하위 에이전트를 팀의 분야별 전문가로 생각하면 됩니다.
Orchestrator의 책임
orchestrator에는 세 가지 핵심 책임이 있습니다. 분해(목표를 구체적이고 실행 가능한 하위 작업으로 나누기), 위임(각 하위 작업을 적절한 전문가에게 할당하기), 종합(하위 에이전트의 출력을 일관된 결과로 결합하기)입니다. orchestrator 자체는 특정 분야의 작업을 거의 수행하지 않습니다. orchestrator의 가치는 조정에 있습니다.
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.content전문화된 하위 에이전트 설계
각 하위 에이전트는 하나의 책임에 맞게 최적화됩니다. 전문화에는 역할을 정의하는 집중된 시스템 프롬프트, 해당 역할에만 관련된 소수의 도구(3~5개), 하위 작업에 필요한 정보만 포함하는 문맥 창이 필요합니다. 집중된 에이전트는 더 나은 결정을 내리고 평가와 디버깅도 더 쉽습니다.
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
}위임 프로토콜
위임이 제대로 작동하려면 오케스트레이터가 각 서브에이전트에 올바르게 구성된 작업 패킷을 전달해야 합니다. 작업 패킷에는 이 서브에이전트의 구체적인 목표, 서브에이전트에 필요한 관련 컨텍스트(전체 대화 기록은 제외), 예상 출력 형식, 그리고 제약 조건이 포함됩니다. 작업 패킷이 제대로 구성되지 않는 것은 오케스트레이터와 서브에이전트 간에 오류가 발생하는 가장 일반적인 원인입니다.
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)결과 수집 및 종합
서브에이전트가 작업을 완료하면 오케스트레이터는 결과를 종합해야 합니다. 이는 단순히 내용을 이어 붙이는 작업이 아닙니다. 오케스트레이터는 서브에이전트의 출력 사이의 충돌을 해결하고, 누락된 부분을 보완하며, 일관된 문체나 형식을 유지하고, 전체적으로 자연스럽게 연결되는 최종 결과를 만들어야 합니다. 종합 단계에서 오케스트레이터의 추론 능력이 가장 많이 필요합니다.
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.content순차 위임과 병렬 위임 비교
오케스트레이터는 작업을 순차적으로(한 서브에이전트의 출력이 다음 서브에이전트로 전달됨) 또는 병렬로(여러 서브에이전트가 동시에 작업함) 위임할 수 있습니다. 순차 위임은 더 단순하며 이후 단계가 이전 결과에 의존할 때 적합합니다. 병렬 위임은 하위 작업이 서로 독립적이고 동시에 실행될 수 있을 때 더 빠르며, 전체 소요 시간을 3~5배 줄이는 경우가 많습니다.
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)서브에이전트 오류 처리
서브에이전트는 때때로 실패합니다. 형식에 맞지 않는 출력을 반환하거나, 반복 한도를 초과하거나, 오류를 만날 수 있습니다. 오케스트레이터는 이러한 실패를 적절하게 처리해야 합니다. 일반적인 방법으로는 작업 패킷을 명확하게 수정하여 다시 시도하기, 더 단순한 방법으로 대체하기, 실패한 하위 작업을 건너뛰고 최종 출력에 그 사실을 기록하기, 또는 사람의 검토로 넘기기가 있습니다.
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'}오케스트레이터를 효과적으로 프롬프트하기
오케스트레이터의 시스템 프롬프트는 전체 파이프라인의 품질에 매우 중요합니다. 시스템 프롬프트에는 다음 내용을 명확히 정의해야 합니다. 사용할 수 있는 서브에이전트와 각 서브에이전트의 전문 분야, 작업 패킷의 형식, 하위 작업을 병렬로 실행할지 순차적으로 실행할지 결정하는 기준, 불완전하거나 충돌하는 결과를 처리하는 방법, 성공적인 최종 출력의 조건입니다.
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.
'''컨텍스트 격리는 기능입니다
오케스트레이터-서브에이전트 패턴의 주요 장점 중 하나는 컨텍스트 격리입니다. 각 서브에이전트는 프로젝트 전체의 기록이 아니라 자신의 하위 작업과 관련된 정보만 확인합니다. 따라서 각 서브에이전트의 컨텍스트 창을 작게 유지할 수 있고, 단일 에이전트를 괴롭히는 컨텍스트 고갈을 방지할 수 있습니다. 오케스트레이터는 전체 관점을 유지하고, 서브에이전트는 집중된 로컬 관점을 유지합니다.
추적 및 관찰 가능성
다중 에이전트 시스템은 위임의 어느 단계에서든 오류가 발생할 수 있으므로 단일 에이전트보다 디버깅하기 어렵습니다. 항상 구조화된 로깅을 추가하여 다음을 추적하세요. 어떤 작업이 위임되었는지, 어느 서브에이전트에 위임되었는지, 입력과 출력이 무엇이었는지, 각 작업에 얼마나 오래 걸렸는지, 다시 시도가 필요했는지 여부를 기록해야 합니다. LangSmith와 랭퓨즈 같은 도구는 다중 에이전트 추적 시각화를 지원합니다.
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 result실제 패턴: 보고서 생성기
오케스트레이터-서브에이전트 패턴의 구체적인 예로 경쟁 분석 보고서 생성기를 들 수 있습니다. 오케스트레이터는 '회사 X의 경쟁사 분석을 작성하세요'라는 요청을 받습니다. 그런 다음 조사 하위 작업을 조사 에이전트에 위임하여 가격, 기능, 리뷰를 찾고, 분석 하위 작업을 분석 에이전트에 위임하여 강점과 약점을 파악하며, 형식 지정 하위 작업을 작성 에이전트에 위임하여 최종 보고서를 작성합니다. 각 전문 에이전트는 자신이 가장 잘하는 일을 수행합니다.
빠른 확인
이 레슨에서 배운 오케스트레이터-서브에이전트 패턴에 대한 이해도를 확인해 보세요.
레슨 요약
이 레슨에서는 다음을 배웠습니다. 오케스트레이터-서브에이전트 패턴은 코디네이터 에이전트를 사용해 작업을 세분화하고 전문 에이전트에 위임합니다. 위임이 제대로 작동하려면 작업 패킷에 목표, 컨텍스트, 예상 출력 형식을 명확히 정의해야 합니다. 또한 컨텍스트 격리를 통해 각 서브에이전트의 창을 작게 유지하면서 오케스트레이터가 전체 관점을 유지할 수 있습니다. 다음에는 LangGraph로 다중 에이전트 파이프라인을 구축합니다.
자주 묻는 질문
“오케스트레이터-하위 에이전트 패턴” 강의는 무료인가요?
네 — “오케스트레이터-하위 에이전트 패턴” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Engineering Academy 강의 전체를 잠금 해제할 수 있습니다. AI Engineering Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“오케스트레이터-하위 에이전트 패턴”에서 뭘 배우나요?
계획 에이전트가 작업을 하위 작업으로 나누고 전문 에이전트에 위임한 뒤, 결과를 최종 출력으로 종합하는 오케스트레이터-하위 에이전트 패턴을 구현합니다. 브라우저에서 직접 실행하는 실습 코드로 AI Engineering Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Engineering Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Engineering Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“오케스트레이터-하위 에이전트 패턴” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Engineering Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Engineering Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 단일 에이전트의 한계
- 오케스트레이터-하위 에이전트 패턴
- LangGraph로 다중 에이전트 파이프라인 구축
- 공유 메모리와 에이전트 간 통신