포스트

2026년 1월 기준: LangGraph vs AutoGen vs CrewAI로 “멀티 에이전트”를 제대로 만드는 법 (비교 + 구현 패턴)

2026년 1월 기준: LangGraph vs AutoGen vs CrewAI로 “멀티 에이전트”를 제대로 만드는 법 (비교 + 구현 패턴)

들어가며

2024~2025년의 “Agent”는 데모가 많았고, 2026년 1월의 “Agent”는 운영 가능한 오케스트레이션이 핵심입니다. 즉, (1) 에이전트가 여러 개일 때 누가 언제 무엇을 하게 할지, (2) 실패/재시도/검증을 어떻게 제어할지, (3) 추적 가능성(Observability)과 재현성(Replay)을 어떻게 확보할지가 생산성을 갈라요.

이 지점에서 LangGraph / Microsoft AutoGen / CrewAI는 철학이 완전히 다릅니다. 요약하면:

  • LangGraph: 제어 가능한 workflow(state machine/graph) 중심
  • AutoGen: 대화(conversation)로 협업시키는 멀티 에이전트 중심
  • CrewAI: 역할(role) + 작업(task) + 프로세스(process)로 팀처럼 굴리는 중심 (datacamp.com)

🔧 핵심 개념

1) 오케스트레이션 모델이 다르다

  • LangGraph: Node/Edge로 흐름을 명시합니다. “이 단계에서 schema 검증 실패하면 retry edge로”, “승인 필요하면 interrupt” 같은 결정론적 흐름이 강점입니다. 또한 checkpointer 기반으로 persistence / time travel(재실행/분기)가 가능해 디버깅과 운영에 유리합니다. (docs.langchain.com)
  • AutoGen: 멀티 에이전트가 “GroupChat”처럼 메시지를 주고받으며 문제를 풉니다. 코드 실행도 대화 흐름 속에서 “코드 작성 Agent ↔ 실행 Agent” 패턴으로 자연스럽게 엮습니다(보통 Docker 기반 격리 실행 권장). (microsoft.github.io)
  • CrewAI: Agents/Tasks/Crew에 더해 Process가 핵심입니다. 특히 Process.sequential vs Process.hierarchical가 사실상 멀티 에이전트 구현의 뼈대예요. 계층형에서는 manager가 계획/위임/검증까지 담당합니다. (docs.crewai.com)

2) “멀티 에이전트 구현”의 실전 정의

멀티 에이전트를 쓴다는 건 보통 아래 중 하나입니다. 1) Router/Supervisor 패턴: 입력을 분류해 “어떤 전문 Agent에게 보낼지” 결정
2) Plan-and-Execute 패턴: Planner가 단계 계획 → Worker들이 실행 → Validator가 검증
3) Code + Tool 실행 루프: 코드 생성/실행/피드백을 안전하게 반복

  • LangGraph는 1)과 2)를 “그래프”로 강제할 수 있고, checkpoint로 재현/중단/승인이 자연스럽습니다. (docs.langchain.com)
  • AutoGen은 3)에서 특히 강하고, UserProxyAgent로 human-in-the-loop도 대화형으로 쉽게 섞습니다. (microsoft.github.io)
  • CrewAI는 2)를 “조직도”로 모델링(특히 hierarchical)하는 느낌이 강합니다. (docs.crewai.com)

💻 실전 코드

아래는 “Supervisor(분류/통제) + Worker 2명 + 검증”을 각 프레임워크 스타일로 구현할 때의 최소 뼈대입니다. (실행 전: 각 라이브러리 설치/버전은 환경에 맞게 조정하세요.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 예제 1) CrewAI: Hierarchical process로 멀티 에이전트 팀 구성
# 핵심: manager가 Task를 위임/검증하는 구조를 프레임워크가 제공
from crewai import Agent, Task, Crew, Process

researcher = Agent(
    role="Researcher",
    goal="요구사항에 맞는 기술 조사 및 근거 정리",
    backstory="검색 결과를 근거로 핵심만 뽑는다",
    allow_delegation=False,
)

engineer = Agent(
    role="Engineer",
    goal="멀티 에이전트 구현 설계 및 코드 초안 작성",
    backstory="실행 가능한 코드와 함정을 함께 제시한다",
    allow_delegation=False,
)

# hierarchical에서는 manager가 작업을 배분하므로,
# Task는 '무엇을 달성해야 하는지' 위주로 써주는 게 좋습니다.
t1 = Task(description="LangGraph/AutoGen/CrewAI 비교 포인트 5개를 정리하라.")
t2 = Task(description="멀티 에이전트 구현 패턴(라우터/플래너/검증)을 코드 관점으로 제안하라.")
t3 = Task(description="운영 관점(재시도/관측/안전한 코드 실행) 체크리스트를 작성하라.")

crew = Crew(
    agents=[researcher, engineer],
    tasks=[t1, t2, t3],
    process=Process.hierarchical,
    manager_llm="gpt-4o",  # 문서에 명시된 핵심 옵션: hierarchical에 필요 ([docs.crewai.com](https://docs.crewai.com/en/concepts/processes?utm_source=openai))
    memory=True,           # 팀 단위 메모리(상황에 따라 비용/노이즈 증가 주의) ([docs.crewai.com](https://docs.crewai.com/en/learn/sequential-process?utm_source=openai))
)

result = crew.kickoff()
print(result)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 예제 2) AutoGen: Coder Agent + CodeExecutorAgent로 "대화 기반" 실행 루프
# 핵심: 모델이 작성한 코드를 Docker에서 격리 실행하는 패턴이 공식 가이드에 등장 ([microsoft.github.io](https://microsoft.github.io/autogen/stable/user-guide/core-user-guide/design-patterns/code-execution-groupchat.html?utm_source=openai))
import asyncio
from autogen_agentchat.agents import AssistantAgent, CodeExecutorAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import MaxMessageTermination
from autogen_agentchat.ui import Console
from autogen_ext.code_executors.docker import DockerCommandLineCodeExecutor
from autogen_ext.models.openai import OpenAIChatCompletionClient

async def main():
    model_client = OpenAIChatCompletionClient(model="gpt-4o")  # 환경에 맞게

    coder = AssistantAgent("coder", model_client=model_client)

    # Docker 격리 실행(운영에서 안전/재현성에 매우 중요)
    code_executor = DockerCommandLineCodeExecutor(work_dir="coding")
    await code_executor.start()
    runner = CodeExecutorAgent("runner", code_executor=code_executor)

    team = RoundRobinGroupChat(
        participants=[coder, runner],
        termination_condition=MaxMessageTermination(6),
    )

    task = "pandas로 샘플 데이터프레임 만들고, groupby 결과를 출력하는 파이썬 코드를 작성/실행해줘."
    await Console(team.run_stream(task=task))

    await code_executor.stop()

asyncio.run(main())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 예제 3) LangGraph: "상태(state) + 체크포인터(checkpointer)"로 멀티스텝/재개 가능한 흐름 뼈대(개념 코드)
# 핵심: checkpointer는 persistence/memory/time travel/human-in-the-loop의 기반 ([docs.langchain.com](https://docs.langchain.com/oss/javascript/langgraph/persistence?utm_source=openai))
# (아래는 구조를 보여주는 예시이며, 실제 노드 구현/모델 호출은 프로젝트에 맞게 채우세요.)

from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import MemorySaver

class State(TypedDict, total=False):
    query: str
    route: str
    answer: str

def router(state: State) -> State:
    q = state["query"].lower()
    # 라우팅 규칙을 코드로 "고정"하면 멀티 에이전트가 예측 가능해집니다.
    if "코드" in q or "구현" in q:
        return {"route": "engineer"}
    return {"route": "research"}

def research_node(state: State) -> State:
    # TODO: LLM 호출 + 근거 정리
    return {"answer": f"[research] {state['query']}에 대한 조사 요약"}

def engineer_node(state: State) -> State:
    # TODO: LLM 호출 + 코드/설계 제안
    return {"answer": f"[engineer] {state['query']}에 대한 설계/코드 초안"}

builder = StateGraph(State)
builder.add_node("router", router)
builder.add_node("research", research_node)
builder.add_node("engineer", engineer_node)

builder.add_edge(START, "router")
builder.add_conditional_edges(
    "router",
    lambda s: s["route"],
    {"research": "research", "engineer": "engineer"},
)
builder.add_edge("research", END)
builder.add_edge("engineer", END)

checkpointer = MemorySaver()
graph = builder.compile(checkpointer=checkpointer)

# thread_id를 주면 “같은 스레드”에서 상태가 이어져 멀티턴/재개가 가능해집니다.
result = graph.invoke({"query": "멀티 에이전트에서 검증 노드를 어디에 둬야 해?"}, config={"configurable": {"thread_id": "t-1"}})
print(result["answer"])

⚡ 실전 팁

1) 프레임워크 선택 기준을 “대화”가 아니라 “통제 지점”으로 잡기

  • “승인/검증/재시도/분기”가 중요하면 LangGraph가 유리합니다(체크포인터 기반 time travel, human-in-the-loop). (docs.langchain.com)
  • “에이전트끼리 토론하며 해결”이 본질이면 AutoGen이 자연스럽습니다(대화 루프 + 코드 실행 에이전트). (microsoft.github.io)
  • “역할 분담이 명확한 파이프라인”이면 CrewAI가 빠릅니다(특히 hierarchical manager). (docs.crewai.com)

2) 멀티 에이전트의 함정: ‘자율성’이 아니라 ‘디버깅 불가능성’이 비용을 만든다
운영에서 진짜 무서운 건 hallucination 자체보다, “왜 그렇게 됐는지 추적이 안 되는 상태”입니다. 그래서 최소한 아래는 강제하세요.

  • 각 step의 입력/출력 schema 고정
  • 실패 시 retry 정책(횟수/조건) 고정
  • tool 실행은 격리(Docker 등) + 허용 리스트로 제한 (microsoft.github.io)

3) CrewAI Hierarchical은 ‘좋은 매니저 프롬프트’가 성능의 50%
계층형은 manager가 위임/검증을 하므로, manager가 보는 컨텍스트가 과해지면 비용과 혼선이 커집니다. max_iterations, 요청 제한 같은 가드레일을 반드시 켜고(문서에 옵션 존재), Task를 “산출물 중심”으로 짧게 쓰세요. (docs.crewai.com)

4) AutoGen 코드 실행은 “기능”이 아니라 “보안 모델”로 설계
CodeExecutorAgent는 편하지만, 로컬 실행을 섞기 시작하면 사고가 납니다. 공식 문서도 Docker 격리 실행을 전제로 설명합니다. 운영에서는:

  • 네트워크/파일 접근 제한
  • 시간/메모리 제한
  • approval_func(승인 훅)로 실행 전 검사
    같은 장치를 붙이세요. (microsoft.github.io)

🚀 마무리

  • LangGraph는 워크플로우를 그래프로 “고정”해 멀티 에이전트를 운영형으로 만들 때 강합니다(체크포인트/재개/리플레이가 설계에 포함). (docs.langchain.com)
  • AutoGen은 대화 기반 협업 + 코드 실행 루프가 자연스러워 “연구/탐색형 멀티 에이전트”에 강합니다. (microsoft.github.io)
  • CrewAI는 역할/작업/프로세스(특히 hierarchical)로 팀을 빠르게 꾸릴 수 있어 “명확한 파이프라인형 멀티 에이전트”에 좋습니다. (docs.crewai.com)

다음 학습 추천: 1) LangGraph의 checkpointer 기반 persistence/time travel/human-in-the-loop를 실제 장애 대응 시나리오로 연습 (docs.langchain.com)
2) AutoGen의 CodeExecutorAgent + approval로 안전한 실행 파이프라인 만들기 (microsoft.github.io)
3) CrewAI의 hierarchical manager 설계(프롬프트/가드레일)를 “산출물 품질” 기준으로 튜닝 (docs.crewai.com)

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.