| [Glossary] 오케스트레이터-워커 패턴 완벽 정리 | Orchestrator-Worker Pattern을 쉽게 이해하는 법 |
한 줄 요약: 오케스트레이터-워커 패턴(Orchestrator-Worker Pattern)이란, 중앙 오케스트레이터 에이전트가 복잡한 작업을 계획·분해하고 여러 전문화된 워커 에이전트에 병렬로 위임해 처리하는 멀티에이전트 아키텍처 패턴이다.
1. 오케스트레이터-워커 패턴이란 무엇인가?
건설 현장을 떠올려 보세요. 현장 감독(오케스트레이터)이 전체 공정 계획을 세우고 목수, 전기공, 배관공(워커)에게 각자의 전문 작업을 지시합니다. 각 작업자는 자신의 영역에서 독립적으로 일하고, 감독이 진척 상황을 확인해 다음 단계로 넘어갑니다.
AI 에이전트 시스템에서도 같은 구조가 적용됩니다. 오케스트레이터는 “무엇을, 어떤 순서로, 누구에게”를 결정하고, 워커 에이전트는 자신의 전문 도메인에서 실제 작업을 수행합니다.
이 패턴은 Anthropic의 에이전트 설계 가이드에서 핵심 패턴 중 하나로 소개됩니다.
2. 핵심 개념 이해하기
패턴 구조
┌─────────────────────────────────────────────────┐
│ 오케스트레이터 (Orchestrator) │
│ • 전체 작업 계획 수립 │
│ • 워커 선택 및 작업 배분 │
│ • 결과 수집 및 통합 │
│ • 다음 단계 결정 │
└──────┬──────────────┬──────────────┬─────────────┘
↓ ↓ ↓
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 워커1 │ │ 워커2 │ │ 워커3 │
│(리서치) │ │(코드작성)│ │(검토) │
└──────────┘ └──────────┘ └──────────┘
↓ ↓ ↓
└──────────────┴──────────────┘
↓
오케스트레이터 (결과 통합)
오케스트레이터의 역할
| 역할 | 설명 |
|---|---|
| 계획 수립 | 전체 목표를 세부 단계로 분해 |
| 워커 선택 | 각 작업에 적합한 전문 워커 배정 |
| 의존성 관리 | 순차/병렬 실행 순서 결정 |
| 에러 처리 | 워커 실패 시 재시도 또는 대안 계획 |
| 결과 통합 | 각 워커 결과를 최종 출력으로 조합 |
워커의 특성
- 전문화: 특정 도메인이나 도구에 특화
- 독립성: 오케스트레이터와 독립된 컨텍스트
- 단순성: 하나의 명확한 작업만 수행
- 재사용성: 여러 오케스트레이터에서 재활용 가능
3. 실무 적용 예시
LangGraph를 활용한 오케스트레이터-워커 패턴 구현입니다.
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from typing import TypedDict, List
llm = ChatOpenAI(model="gpt-4o", temperature=0)
class ReportState(TypedDict):
topic: str
research: str
outline: str
draft: str
final: str
# 오케스트레이터: 계획 수립
def orchestrator_plan(state: ReportState) -> dict:
response = llm.invoke(
f"주제 '{state['topic']}'에 대한 보고서 작성 계획을 수립하세요. "
f"수행할 워커 작업 목록을 JSON으로 출력하세요."
)
return {"outline": response.content}
# 워커1: 리서치 전문
def research_worker(state: ReportState) -> dict:
response = llm.invoke(
f"주제: {state['topic']}\n"
f"계획: {state['outline']}\n\n"
f"위 주제에 대한 핵심 데이터와 사실을 조사하세요."
)
return {"research": response.content}
# 워커2: 초안 작성 전문
def writing_worker(state: ReportState) -> dict:
response = llm.invoke(
f"조사 내용: {state['research']}\n"
f"계획: {state['outline']}\n\n"
f"위 내용을 바탕으로 보고서 초안을 작성하세요."
)
return {"draft": response.content}
# 워커3: 편집/검토 전문
def editing_worker(state: ReportState) -> dict:
response = llm.invoke(
f"초안: {state['draft']}\n\n"
f"위 초안을 교정하고 완성도를 높여 최종 보고서를 작성하세요."
)
return {"final": response.content}
# 그래프 구성
workflow = StateGraph(ReportState)
workflow.add_node("plan", orchestrator_plan)
workflow.add_node("research", research_worker)
workflow.add_node("write", writing_worker)
workflow.add_node("edit", editing_worker)
workflow.set_entry_point("plan")
workflow.add_edge("plan", "research")
workflow.add_edge("research", "write")
workflow.add_edge("write", "edit")
workflow.add_edge("edit", END)
app = workflow.compile()
result = app.invoke({"topic": "2026년 AI 에이전트 시장 전망"})
print(result["final"])
4. 오케스트레이터-워커 패턴 vs 유사 개념 비교
| 구분 | 오케스트레이터-워커 | 에이전트 체인 | 마스터-슬레이브 |
|---|---|---|---|
| 계획 주체 | 오케스트레이터 (동적) | 개발자 (정적) | 마스터 (반정적) |
| 병렬 처리 | ✅ 지원 | ❌ 순차적 | 부분적 |
| 유연성 | ✅ 런타임 결정 | ❌ 고정 흐름 | 보통 |
| 복잡도 | 높음 | 낮음 | 중간 |
| 오류 복구 | ✅ 재계획 가능 | 어려움 | 보통 |
5. 마치며
오케스트레이터-워커 패턴은 복잡한 AI 작업을 확장 가능하게 처리하는 가장 검증된 방법입니다. 핵심은 오케스트레이터에게 지능을, 워커에게 전문성을 분리해 부여하는 것입니다. 워커는 단순하게, 오케스트레이터는 유연하게 설계할수록 시스템의 신뢰성이 높아집니다.
참고 자료
- Anthropic: Building Effective Agents — 오케스트레이터-워커 패턴 공식 가이드
- LangGraph 공식 문서 — 그래프 기반 멀티에이전트 구현
함께 읽으면 좋은 용어
이 개념과 함께 알아두면 이해가 깊어지는 관련 용어들입니다.
댓글 남기기