Multi-Agent 시스템 아키텍처¶
개요¶
Multi-Agent 시스템은 여러 LLM 에이전트가 협업하여 복잡한 작업을 수행하는 아키텍처다. 단일 에이전트의 한계를 극복하고, 전문화된 역할 분담으로 더 나은 결과를 도출한다.
핵심 패턴¶
1. Orchestrator-Worker 패턴¶
┌─────────────────────────────────────────┐
│ Orchestrator │
│ (Task Decomposition) │
└──────┬──────────┬──────────┬────────────┘
│ │ │
▼ ▼ ▼
┌───────┐ ┌───────┐ ┌───────┐
│Worker │ │Worker │ │Worker │
│ A │ │ B │ │ C │
└───────┘ └───────┘ └───────┘
특징: - 중앙 오케스트레이터가 작업 분해 및 할당 - Worker는 특정 도메인/기능에 특화 - 결과 집계 및 최종 응답 생성
적합한 상황: - 명확한 작업 분해가 가능한 경우 - 병렬 처리가 필요한 대규모 작업 - 각 하위 작업이 독립적인 경우
2. Debate/Critique 패턴¶
┌──────────┐ 피드백 ┌──────────┐
│Generator │◄────────────►│ Critic │
│ Agent │ 개선안 │ Agent │
└──────────┘ └──────────┘
│ │
└────────┬───────────────┘
▼
┌────────────┐
│Final Output│
└────────────┘
특징: - Generator가 초안 생성 - Critic이 검토 및 피드백 제공 - 반복적 개선으로 품질 향상
적합한 상황: - 코드 리뷰, 문서 검토 - 높은 정확도가 요구되는 작업 - 창작물 품질 개선
3. Hierarchical 패턴¶
┌────────────┐
│ Manager │
│ Agent │
└─────┬──────┘
┌─────────┼─────────┐
▼ ▼ ▼
┌───────┐ ┌───────┐ ┌───────┐
│ Team │ │ Team │ │ Team │
│Lead A │ │Lead B │ │Lead C │
└───┬───┘ └───┬───┘ └───┬───┘
│ │ │
┌──┴──┐ ┌──┴──┐ ┌──┴──┐
▼ ▼ ▼ ▼ ▼ ▼
[W1] [W2] [W3] [W4] [W5] [W6]
특징: - 다층 구조로 복잡한 조직 모델링 - 각 레벨이 하위 레벨 관리 - 대규모 프로젝트에 적합
적합한 상황: - 복잡한 소프트웨어 개발 - 대규모 리서치 프로젝트 - 조직 시뮬레이션
4. Mixture of Experts (MoE) 라우팅¶
┌─────────┐
│ Query │
└────┬────┘
▼
┌─────────┐
│ Router │
└────┬────┘
┌────────┼────────┐
▼ ▼ ▼
┌───────┐┌───────┐┌───────┐
│Expert ││Expert ││Expert │
│ Code ││ Math ││ Lang │
└───┬───┘└───┬───┘└───┬───┘
└────────┼────────┘
▼
┌───────────┐
│ Output │
└───────────┘
특징: - 쿼리 특성에 따라 전문 에이전트 선택 - 효율적인 리소스 활용 - 도메인 전문성 극대화
프레임워크 비교¶
| 프레임워크 | 특징 | 적합한 패턴 |
|---|---|---|
| LangGraph | 상태 기반 그래프, 유연한 흐름 제어 | 모든 패턴 |
| CrewAI | 역할 기반 팀 구성, 간편한 설정 | Orchestrator-Worker |
| AutoGen | Microsoft 개발, 대화 기반 협업 | Debate/Critique |
| Swarm | OpenAI 경량 프레임워크, handoff 중심 | 단순 라우팅 |
| Agency Swarm | 에이전트 간 통신 중심 | 계층적 구조 |
통신 패턴¶
동기 통신¶
- 간단한 구현 - 병목 발생 가능 - 디버깅 용이비동기 메시지 큐¶
# 메시지 큐 방식
await queue.publish(topic="agent_b", message=output)
result = await queue.subscribe(topic="response")
공유 상태 (Blackboard)¶
# 공유 메모리 방식
state["agent_a_result"] = output
# 다른 에이전트가 상태 읽기
input_data = state.get("agent_a_result")
구현 시 고려사항¶
1. 에이전트 설계¶
역할 명확화:
agents:
- name: "researcher"
role: "정보 수집 및 분석"
tools: [web_search, document_reader]
- name: "writer"
role: "보고서 작성"
tools: [text_generator, formatter]
- name: "reviewer"
role: "품질 검토"
tools: [grammar_check, fact_check]
2. 상태 관리¶
from langgraph.graph import StateGraph
from typing import TypedDict, Annotated
class AgentState(TypedDict):
messages: list
current_agent: str
task_status: dict
shared_memory: dict
3. 오류 처리¶
class AgentErrorHandler:
def __init__(self, max_retries=3):
self.max_retries = max_retries
async def execute_with_fallback(self, agent, task):
for attempt in range(self.max_retries):
try:
return await agent.execute(task)
except AgentError as e:
if attempt == self.max_retries - 1:
return self.fallback_response(e)
await self.handle_retry(e, attempt)
4. 비용 최적화¶
| 전략 | 설명 | 절감률 |
|---|---|---|
| 모델 티어링 | 작업 복잡도에 따라 모델 선택 | 40-60% |
| 캐싱 | 반복 쿼리 결과 캐싱 | 20-30% |
| 배치 처리 | 독립 작업 일괄 처리 | 15-25% |
| 조기 종료 | 충분한 품질 도달 시 중단 | 10-20% |
실전 아키텍처 예시¶
코드 리뷰 시스템¶
User Request
│
▼
┌─────────────┐
│ Coordinator │
└──────┬──────┘
│
┌────┴────┬────────────┐
▼ ▼ ▼
┌─────┐ ┌─────┐ ┌─────────┐
│Code │ │Style│ │Security │
│Logic│ │Check│ │ Auditor │
└──┬──┘ └──┬──┘ └────┬────┘
│ │ │
└────────┼────────────┘
▼
┌───────────┐
│ Synthesizer│
└─────┬─────┘
▼
┌─────────────┐
│Final Review │
└─────────────┘
RAG + Multi-Agent¶
Query
│
▼
┌─────────┐
│ Router │
└────┬────┘
│
┌────┼────┬──────────┐
▼ ▼ ▼ ▼
DB Web Doc Knowledge
Agent Agent Agent Graph Agent
│ │ │ │
└────┼────┴──────────┘
▼
┌──────────┐
│Aggregator│
└────┬─────┘
▼
┌──────────┐
│ Response │
│ Generator│
└──────────┘
모니터링 및 디버깅¶
추적 메트릭¶
metrics = {
"agent_latency": {}, # 에이전트별 응답 시간
"token_usage": {}, # 토큰 사용량
"error_rate": {}, # 오류율
"handoff_count": 0, # 에이전트 간 전환 횟수
"total_cost": 0.0 # 총 비용
}
LangSmith/Phoenix 연동¶
from langsmith import traceable
@traceable(name="multi_agent_workflow")
async def run_workflow(query: str):
# 워크플로우 실행
pass
안티패턴¶
| 안티패턴 | 문제점 | 해결책 |
|---|---|---|
| 과도한 에이전트 수 | 복잡성, 비용 증가 | 필요한 만큼만 |
| 순환 의존성 | 무한 루프 | DAG 구조 강제 |
| 상태 공유 과용 | 경쟁 조건 | 명확한 소유권 |
| 무분별한 재시도 | 비용 폭증 | 지수 백오프 + 상한 |
참고 자료¶
- LangGraph Documentation
- CrewAI Framework Guide
- AutoGen Multi-Agent Patterns
- "Building Multi-Agent Systems" - Shrivu Shankar
- Elastic Multi-Agent with LangGraph
최종 업데이트: 2026-02-18