콘텐츠로 이동
Data Prep
상세

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 에이전트 간 통신 중심 계층적 구조

통신 패턴

동기 통신

# 직접 호출 방식
result = agent_b.execute(agent_a.output)
- 간단한 구현 - 병목 발생 가능 - 디버깅 용이

비동기 메시지 큐

# 메시지 큐 방식
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")
- 유연한 협업 - 동기화 주의 필요 - LangGraph 기본 패턴

구현 시 고려사항

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