본문으로 건너뛰기

Multi-Agent Collaboration Patterns

20분 읽기
AI용 문서 안내

1. 왜 멀티 에이전트인가​

단일 LLM 에이전트는 도메인이 넓어지고 툴 사용이 복잡해질수록 빠르게 한계를 드러냅니다. 운영 환경에서 관찰되는 대표적인 한계는 다음과 같습니다.

  • 컨텍스트 윈도우 포화: Claude Opus 4.7의 1M 토큰도 대형 모노레포·장기 세션에서는 빠르게 소진되며, 주요 맥락이 요약 손실로 밀려남.
  • 툴 스프롤 (Tool Sprawl): 하나의 에이전트에 20개 이상의 MCP 툴을 연결하면 tool-choice 정확도가 급격히 떨어짐 (Anthropic 2024 "Building effective agents" 참조).
  • 전문성 범위 제한: 코드 리뷰·SQL 작성·보안 분석은 시스템 프롬프트와 few-shot 구성이 상이. 하나의 프롬프트로 모두 만족시키기 어려움.
  • 비용-정확도 트레이드오프: Opus 급 모델을 모든 하위 작업에 쓰면 비용이 폭증, Haiku 급만 쓰면 복잡 추론에서 실패율 상승.

멀티 에이전트 시스템은 이러한 한계를 역할 분리(role decomposition), 전용 컨텍스트(scoped context), **병렬 실행(parallel execution)**으로 해결합니다. 반면 다음과 같은 역기능도 명시적으로 관리해야 합니다.

역기능원인완화 방법
통신 비용에이전트 간 메시지 직렬화, 서로 재요약구조화된 shared state, 핸드오프 시 필수 필드만 전달
합의 지연Voting/Debate 시 라운드 반복라운드 상한, 타임박스, 조기 종료 조건
토큰 비용 폭증N개 에이전트 × 평균 토큰 × 라운드 수조건부 escalation, 모델 티어링(Haiku → Sonnet → Opus)
실패 전파한 에이전트 실패가 체인 전체 중단Circuit breaker, fallback agent, 부분 결과 허용
관측 복잡도중첩 trace, 원인 추적 난이도 상승Langfuse/OTel hierarchy, agent_name span tag 필수화
결정 기준

하위 작업이 (a) 명확히 분리된 역할 또는 (b) 독립 병렬 실행으로 이득을 볼 때만 멀티 에이전트를 도입합니다. 선형 파이프라인은 단일 에이전트 + tool-use가 거의 항상 더 저렴합니다.


2. 핵심 협업 패턴​

실무에서 반복적으로 관찰되는 6개 패턴을 정리합니다. 대부분의 시스템은 이 중 2-3개를 조합한 하이브리드입니다.

2.1 Orchestrator-Worker (Router 패턴)​

오케스트레이터 에이전트가 사용자 요청을 받아 sub-task로 분해하고, 전문 워커 에이전트에게 할당합니다. 워커의 결과를 수집해 최종 응답을 합성합니다.

글씨가 작으면 확대해서 확인할 수 있습니다.
다이어그램
  • 대표 구현: LangGraph Supervisor, Strands Agents Graph, OpenAI Agents SDK Handoff.
  • 적합: 명확히 분류 가능한 도메인 (SQL / 코드 / 검색), 고정된 워커 풀.
  • 주의: 오케스트레이터가 병목이 되기 쉬움. 병렬 실행 가능한 sub-task는 asyncio.gather 등으로 fan-out.

2.2 Hierarchical Supervisor (Manager-Team)​

Orchestrator-Worker를 다층으로 확장한 형태입니다. 최상위 Supervisor가 여러 Team Lead에게 위임하고, 각 Team Lead가 Specialist들을 관리합니다.

글씨가 작으면 확대해서 확인할 수 있습니다.
다이어그램
  • 대표 구현: LangGraph Multi-Agent Supervisor, CrewAI Crew(process=Process.hierarchical, manager_agent=...).
  • 적합: 3단 이상의 의사결정 깊이가 필요한 대규모 과제 (예: 전체 서비스 리팩터링, 엔터프라이즈 문서 자동 생성).
  • 주의: Supervisor 계층이 깊을수록 지연·비용 증가. 2-3단을 넘기지 않는 것을 권장.

2.3 Voting / Ensemble​

같은 질문을 N개 에이전트(또는 모델)에게 독립적으로 보내고 다수결 또는 가중 평균으로 결론을 냅니다.

  • 기법: Self-consistency, Mixture-of-Agents (MoA), majority voting, weighted ensemble.
  • 적합: 수학 문제, 분류 태스크, hallucination 리스크가 큰 RAG 답변 검증.
  • 비용: 정확히 N배. Haiku × 5 앙상블이 Opus × 1보다 높은 정확도를 보이는 사례가 다수 보고됨.
  • 구현 팁: 각 에이전트의 temperature를 다르게 설정하거나 서로 다른 프롬프트 템플릿을 사용해 다양성 확보.

2.4 Debate / Adversarial​

두 에이전트가 서로의 답을 비판하고 반박하는 라운드를 거쳐, 제3의 judge 에이전트가 결론을 선택합니다.

글씨가 작으면 확대해서 확인할 수 있습니다.
다이어그램
  • 적합: 복잡한 추론, 코드 결함 탐색, 정책·윤리 판단.
  • 효과: Society of Minds, Multi-Agent Debate 논문들에서 단일 에이전트 대비 정확도 상승 보고.
  • 한계: 라운드당 토큰 비용이 누적. 일반적으로 2-3라운드 + Judge 구조로 상한을 둠.

2.5 Plan-and-Execute​

Planner 에이전트가 전체 실행 계획을 먼저 수립하고, Executor 에이전트(들)가 단계별로 실행합니다. 필요시 Re-Planner가 중간 결과를 받아 계획을 수정합니다.

  • 대표 구현: LangChain Plan-and-Execute, OpenAI Deep Research (Planner + Browser + Writer), Claude Code의 TodoWrite + executor 패턴.
  • 적합: 장기 실행 태스크 (연구 보고서, 대규모 리팩터링, 멀티스텝 데이터 파이프라인).
  • 핵심: 계획 수립을 고성능 모델 (Opus, GPT-5 Reasoning)로, 실행은 중저가 모델로 분리해 비용 효율 확보.

2.6 Blackboard / Shared Memory​

중앙 저장소(blackboard)에 모든 에이전트가 관찰과 중간 결과를 기록합니다. 각 에이전트는 자신의 전문성에 부합하는 태스크가 보이면 자율적으로 기여합니다.

  • 저장소: Redis, Postgres (LangGraph checkpointer), DynamoDB, 또는 파일 시스템.
  • 적합: 장기 세션(수시간 이상), 비동기 협업, 에이전트 합류·이탈이 빈번한 환경.
  • 주의: 경쟁 조건(race condition) — 낙관적 잠금, 버전 번호, 또는 이벤트 소싱으로 일관성 보장.

3. 구현 프레임워크 비교 (2026-04 기준)​

프레임워크주요 추상화언어주요 패턴라이선스
LangGraphStateGraph + NodePython/JSSupervisor, Swarm, Conditional routingMIT
CrewAICrew + Agent + TaskPythonSequential / Hierarchical / ConsensusMIT
AutoGen (v0.4+)ConversableAgent + GroupChatPythonConversation + WorkflowApache 2.0
Strands Agents SDKAgent + Graph (Python)PythonOrchestrator, HandoffApache 2.0
OpenAI Agents SDKAgent + HandoffPython/TSOrchestrator-Worker, HandoffApache 2.0
Amazon Bedrock AgentCoreAgent + Action GroupAWS SDKManaged, MCP nativeAWS managed

3.1 LangGraph​

StateGraph 기반으로 노드 간 상태 전이를 그래프로 정의합니다. create_react_agent, create_supervisor, swarm 헬퍼로 대부분의 패턴을 10-50줄에 구현할 수 있습니다. LangGraph Platform (유료) 또는 self-host로 배포하며, Postgres/Redis checkpointer로 장기 실행 복구를 지원합니다.

3.2 CrewAI​

역할 기반 협업을 자연어 선언으로 표현합니다. Process.sequential, Process.hierarchical, Process.consensual 3가지 모드를 제공하며, manager_agent로 계층형 감독 구조를 구성합니다. 실무에서는 "role / goal / backstory"를 명확히 작성하는 것이 품질을 좌우합니다.

3.3 AutoGen (v0.4+)​

Microsoft Research의 프레임워크로, v0.4에서 actor-model 기반으로 재설계되었습니다. GroupChat, SelectorGroupChat, MagenticOne 등으로 대화형 멀티 에이전트를 구성하며, 코드 실행 환경(Docker, Jupyter)과의 통합이 강점입니다.

3.4 Strands Agents SDK​

AWS에서 2025년 공개한 오픈소스 SDK로, Bedrock과 밀접하게 통합되지만 OpenAI·Anthropic 직접 호출도 지원합니다. Agent + Graph 추상화가 LangGraph와 유사하며, MCP 툴을 1-급 시민(first-class)으로 취급합니다. Strands Agents Handoff는 OpenAI Agents SDK의 핸드오프와 설계 의도가 유사합니다.

3.5 OpenAI Agents SDK​

OpenAI가 2025년 3월 Swarm 후속으로 공개한 GA 수준 SDK입니다. Agent, Runner, handoff, guardrail 4가지 프리미티브로 거의 모든 패턴을 조합할 수 있습니다. 트레이싱이 OpenAI Dashboard와 통합되어 있어 관측성 셋업이 빠릅니다.

3.6 Amazon Bedrock AgentCore​

Agents for Bedrock 위에 Action Group, Knowledge Base, Guardrails, Memory를 관리형으로 제공합니다. MCP native 지원으로 외부 툴 통합이 용이하며, IAM·VPC 경계 안에서 멀티 에이전트 실행이 가능해 규제 산업에 적합합니다.

프레임워크 선택 가이드
  • 빠른 프로토타입: CrewAI 또는 OpenAI Agents SDK
  • 복잡한 상태 전이·복구: LangGraph + Postgres checkpointer
  • AWS 생태계 고정: Strands Agents SDK 또는 Bedrock AgentCore
  • 연구·실험: AutoGen v0.4 (다양한 대화 패턴 탐색 용이)

3.7 최소 구현 예시: Supervisor 패턴​

# LangGraph — Supervisor가 Researcher/Coder 중 하나로 라우팅
from langgraph.graph import StateGraph, END
from langgraph.prebuilt import create_react_agent
from langchain_anthropic import ChatAnthropic

llm = ChatAnthropic(model="claude-sonnet-4-5")
researcher = create_react_agent(llm, tools=[web_search], name="researcher")
coder = create_react_agent(llm, tools=[execute_python], name="coder")

def supervisor(state):
decision = llm.invoke([
{"role": "system", "content": "Route to 'researcher' or 'coder'. Reply with one word."},
{"role": "user", "content": state["input"]},
]).content.strip().lower()
return {"next": decision}

graph = StateGraph(dict)
graph.add_node("supervisor", supervisor)
graph.add_node("researcher", researcher)
graph.add_node("coder", coder)
graph.set_entry_point("supervisor")
graph.add_conditional_edges("supervisor", lambda s: s["next"],
{"researcher": "researcher", "coder": "coder"})
graph.add_edge("researcher", END)
graph.add_edge("coder", END)
app = graph.compile()
# CrewAI — Hierarchical Crew
from crewai import Agent, Task, Crew, Process

manager = Agent(role="Engineering Manager",
goal="분배, 검수, 최종 승인",
backstory="10년차 플랫폼 리드")
coder = Agent(role="Coder", goal="기능 구현", backstory="...")
reviewer = Agent(role="Reviewer", goal="코드 리뷰", backstory="...")

crew = Crew(agents=[coder, reviewer],
tasks=[Task(description="인증 엔드포인트 구현", agent=coder),
Task(description="리뷰 및 피드백", agent=reviewer)],
manager_agent=manager,
process=Process.hierarchical)
result = crew.kickoff()
# OpenAI Agents SDK — Handoff
from agents import Agent, Runner, handoff

triage = Agent(
name="Triage",
instructions="질문을 분류해 적절한 에이전트로 넘긴다.",
handoffs=[
handoff(Agent(name="BillingBot", instructions="요금 문의")),
handoff(Agent(name="TechBot", instructions="기술 문의")),
],
)
result = await Runner.run(triage, input="인보이스가 두 번 청구됐어요.")

4. 상태 공유·충돌 해결·실패 복구​

4.1 상태 공유 모델​

모델설명대표 구현
Shared Memory중앙 저장소를 모두가 읽고 씀LangGraph StateGraph, Redis/Postgres
Message Passing에이전트 간 메시지 큐로만 통신AutoGen GroupChat, AWS SQS
Blackboard이벤트 소싱 + 구독Kafka, EventBridge
Handoff Context호출 시점에 컨텍스트 전달, 이후 분리OpenAI Agents SDK, Strands Handoff

실무에서는 Shared Memory + Handoff Context를 조합하는 방식이 가장 흔합니다. 공통 상태(사용자 요청, 누적 결과)는 shared state에, 에이전트별 작업 지시는 handoff payload에 담습니다.

4.2 충돌 해결 전략​

  • Voting: 다수결 또는 가중 평균. 동률 시 tiebreaker 에이전트 지정.
  • Referee Agent: Debate 패턴에서 judge가 최종 결정.
  • Deterministic Winner Rule: "보안 리뷰어가 거부하면 무조건 재작업" 같은 하드 룰.
  • 우선순위 큐: 긴급 작업이 진행 중이면 다른 에이전트 대기.

4.3 실패 복구​

글씨가 작으면 확대해서 확인할 수 있습니다.
다이어그램
  • Retry Budget: 에이전트별 최대 재시도 횟수와 토큰 예산. 초과 시 상위로 escalate.
  • Per-Agent Circuit Breaker: 특정 에이전트의 연속 실패율이 임계치 초과 시 일시 차단.
  • Fallback Agent: 더 단순한 프롬프트 + 저가 모델로 우회. 품질 저하를 감수하고 가용성 확보.
  • Checkpointer 복구: LangGraph/Strands의 checkpoint 기능으로 중간 상태부터 재개 (장기 태스크에서 필수).

5. 관측성 (Langfuse + OpenTelemetry)​

멀티 에이전트 시스템의 trace는 자연스럽게 계층 구조를 가집니다. 이를 Langfuse/OTel에서 올바르게 표현하면 디버깅과 성능 분석이 극적으로 쉬워집니다.

5.1 Trace 계층 설계​

Trace: user-request-<uuid>
└── Span: orchestrator.plan
├── Span: worker.retriever
│ ├── Span: tool.vector_search
│ └── Span: llm.claude-opus-4-7
├── Span: worker.coder
│ └── Span: llm.sonnet-4-5
└── Span: judge.reviewer
└── Span: llm.opus-4-7

5.2 필수 Span 속성​

각 span에 다음 속성을 일관되게 부여합니다. 운영 시 대시보드 필터링·알람의 기반이 됩니다.

  • agent.name: 에이전트 식별자 (예: retriever, coder, judge)
  • agent.role: 역할 (예: worker, supervisor, critic)
  • agent.model: 사용 모델 (예: claude-opus-4-7, gpt-5-reasoning)
  • handoff.reason: 핸드오프 사유 (다른 에이전트로 전환된 경우)
  • handoff.from / handoff.to
  • round.index: Voting/Debate 라운드 번호
  • tokens.input / tokens.output / cost.usd

5.3 Langfuse 대시보드 예시​

  • 에이전트별 지연 시간 p95: agent.name 그룹핑으로 병목 식별
  • 핸드오프 히트맵: handoff.from × handoff.to 매트릭스
  • 라운드별 비용: Debate/Voting 패턴의 비용 수렴성 검증
  • 실패율: status=error span을 agent.name으로 집계
OpenTelemetry 연동

Langfuse v3.x는 OTel native 수집기로 동작합니다. 앱에서 traceparent W3C 표준을 사용하면 AWS X-Ray, Datadog, Grafana Tempo와도 단일 trace로 연결됩니다.


6. 비용·지연 시간 패턴​

6.1 비용 증가 요인​

  • 에이전트 수 N: 비용은 N에 선형. Voting은 정확히 N배.
  • 라운드 수 R: Debate 2-3라운드 기준 비용 × 2~3배.
  • 컨텍스트 누적: 라운드가 지날수록 이전 응답이 컨텍스트에 쌓여 input token 비용 비선형 증가.
  • 툴 호출 체인: tool-use 응답도 다시 LLM에 들어가 비용 발생.

6.2 비용 최적화 체크리스트​

항목기법
모델 티어링Planner=Opus, Worker=Sonnet, Summarizer=Haiku
프롬프트 캐싱Claude prompt caching, OpenAI prompt caching으로 시스템 프롬프트 재사용
조건부 escalation단순 태스크는 Haiku로 시작, confidence 낮으면 상위 모델 호출
병렬 실행독립 sub-task는 asyncio.gather/Promise.all로 지연 시간 단축
중간 결과 요약긴 대화 히스토리를 주기적으로 요약해 컨텍스트 압축
조기 종료Voting에서 과반 확보 시 나머지 취소

6.3 지연 시간 최적화​

  • Streaming 핸드오프: 첫 토큰부터 다음 에이전트가 처리 시작 (speculative execution).
  • Fan-out 후 first-wins: N개 에이전트에 동시 요청, 가장 먼저 도착한 신뢰 가능한 응답 사용.
  • Prewarming: 자주 쓰는 에이전트는 idle 상태로 유지 (세션 캐시).

7. AIDLC 단계별 활용​

AIDLC의 각 단계에서 멀티 에이전트 패턴이 어떻게 적용되는지 정리합니다.

7.1 Inception (구상·기획)​

  • Planner Agent: 모호한 요구사항을 구조화된 백로그로 변환.
  • Critic Agent: 플래너 산출물을 비판적으로 검토해 누락·모순 식별.
  • 조합: Plan-and-Execute + Debate 하이브리드.

7.2 Construction (개발·검증)​

  • Coder Agent: 기능 구현 (Sonnet).
  • Reviewer Agent: 코드 리뷰 (Opus, 보안·품질 분리 가능).
  • Test Writer Agent: 테스트 생성 및 실행.
  • 조합: Orchestrator-Worker, Hierarchical Supervisor.

7.3 Operations (AgenticOps)​

  • Monitor Agent: 관찰성 데이터 상시 분석 (Haiku).
  • Diagnosis Agent: 이상 징후 발견 시 근본 원인 분석 (Sonnet).
  • Responder Agent: 사전 정의 가드레일 내 자동 복구 (Sonnet/Opus).
  • Human Escalation Agent: 위험 변경은 승인 큐로 라우팅.
  • 조합: 자율 대응에서 상세 기술. Blackboard + Orchestrator-Worker.
AIDLC 전반에 걸친 공통 원칙
  • 모든 단계의 에이전트 출력을 온톨로지에 매핑해 일관된 어휘 사용.
  • 단계 간 핸드오프는 artifact(PRD, ADR, RCA 문서)를 매개로 — 에이전트 세션이 종료되어도 컨텍스트 유실되지 않음.

8. 케이스 스터디: AgenticOps 자율 대응 파이프라인​

실제 EKS 인시던트 대응에 멀티 에이전트 패턴을 적용한 예시입니다. 자율 대응 문서의 3단계(감지 → 판단 → 실행)를 에이전트로 구현합니다.

8.1 아키텍처​

글씨가 작으면 확대해서 확인할 수 있습니다.
다이어그램

8.2 역할 및 모델 티어링​

에이전트모델평균 호출/시간월 비용(추정)
Monitorclaude-haiku-4-53,600~$20
Diagnosisclaude-sonnet-4-550~$30
Responderclaude-sonnet-4-5 + Opus escalation30~$40
Judge (위험 행동 승인)claude-opus-4-75~$15

Opus를 Monitor에 썼다면 월 $1,000+ 로 급증. 티어링만으로 95% 비용 절감.

8.3 핸드오프 계약 (Handoff Contract)​

각 에이전트 간 전달되는 payload는 JSON Schema로 엄격히 정의합니다.

{
"incident_id": "inc-20260418-0042",
"from_agent": "diagnosis",
"to_agent": "responder",
"severity": "P2",
"root_cause": "Pod OOMKilled — memory limit 512Mi, actual peak 780Mi",
"evidence": {
"metrics": ["container_memory_working_set_bytes"],
"logs": ["OOMKilled at 2026-04-18T10:32:15Z"],
"affected_resources": ["deploy/api-gateway", "ns/prod"]
},
"proposed_action": {
"type": "patch_deployment",
"changes": {"spec.template.spec.containers[0].resources.limits.memory": "1Gi"}
},
"risk_level": "low",
"requires_human_approval": false
}

이 스키마는 온톨로지의 Incident, Resource, Action 엔티티와 1:1 매핑되어, 에이전트 간 어휘 일관성을 보장합니다.

8.4 결과 (3개월 운영)​

  • MTTR: 112분 → 6분 (95% 감소)
  • 자율 해결 비율: 전체 인시던트 중 68%
  • Human escalation: 32% (위험도 높음 + 신규 패턴)
  • False positive: 3% 이하 (가드레일 + Judge 조합 효과)

9. 안티패턴: 실패 사례에서 배우기​

9.1 God Agent​

모든 툴과 지식을 하나의 에이전트에 몰아넣는 패턴. 초기에는 편해 보이지만 툴이 15개를 넘어가면 tool-choice 정확도가 급락합니다.

  • 징후: 시스템 프롬프트가 2,000 토큰 초과, 툴 20개 이상.
  • 해결: 도메인별로 에이전트 분리 + Orchestrator-Worker 도입.

9.2 무한 핸드오프 루프​

A → B → A → B → ... 핑퐁. 각 에이전트가 자신의 역할이 아니라 판단해 계속 떠넘김.

  • 징후: 동일 trace에서 같은 핸드오프 쌍이 3회 이상 반복.
  • 해결: 핸드오프 홉(hop) 상한 설정, 루프 감지 시 escalation.

9.3 합의 없는 Voting​

짝수 에이전트로 Voting 구성 → 동률 → 처리 불가.

  • 해결: 홀수 에이전트 구성, 또는 tiebreaker 에이전트 별도 지정.

9.4 공유 상태 레이스 컨디션​

두 에이전트가 동시에 같은 blackboard 필드를 갱신해 한쪽 결과 유실.

  • 해결: 낙관적 잠금(version number), CRDT, 또는 이벤트 소싱.

9.5 관측성 공백​

에이전트 내부 LLM 호출은 trace에 찍히지만 에이전트 간 핸드오프는 별도 trace로 분리되어 원인 추적 불가.

  • 해결: traceparent 헤더 전파, 모든 에이전트가 동일 root trace에 span 추가.

9.6 Prompt Injection 전파​

사용자 입력에 포함된 injection이 한 에이전트에서 다음 에이전트로 그대로 전달되며 시스템 명령으로 해석됨.

  • 해결: Gateway 레이어에서 입력 sanitize, 에이전트 간 핸드오프 payload는 system 역할이 아닌 user/tool 역할로만 전달.

10. 운영 모범 사례 체크리스트​

멀티 에이전트 시스템을 프로덕션에 올리기 전 점검 항목입니다.

  • 역할 경계 명확: 각 에이전트의 책임 범위와 "하지 않을 일"을 시스템 프롬프트에 명시.
  • Handoff 조건 문서화: 어떤 상황에서 누구에게 넘기는지 결정 트리로 기록.
  • Guardrails 공통 레이어: PII 마스킹, prompt injection 방어, 출력 스키마 검증을 각 에이전트가 아닌 gateway 레이어에서 수행.
  • 비용·지연 시간 상한: 요청당 최대 토큰, 최대 라운드, 최대 실행 시간 하드 리밋.
  • 관측성 속성 표준화: agent.name, agent.role, handoff.reason을 모든 span에 강제.
  • 실패 경로 정의: 에이전트 실패 시 사용자에게 무엇을 보여줄지 (부분 결과 / 에러 / 재시도 안내).
  • 모델 버전 고정: 모델 업데이트 시 회귀 방지를 위해 pinned version + canary 롤아웃.
  • 테스트 스위트: 각 에이전트를 개별 테스트, 시스템 전체 E2E 테스트 (LangSmith, Langfuse experiments).
  • Human-on-the-Loop 진입점: 자율 실행 중에도 사람이 개입할 수 있는 취소·수정 API.
  • 감사 로그 불변성: 모든 에이전트 결정 근거(prompt + response + tool call)를 write-once 저장소에 보존.

11. 참고 자료​

프레임워크 공식 문서​

논문·블로그​

관련 문서​