본문 바로가기

AI Agent

멀티에이전트 시스템 실전 구축 — CrewAI vs LangGraph vs AutoGen 완전 비교

반응형

AI 에이전트 하나로 복잡한 업무를 처리하는 데 한계가 생겼어요.

"에이전트가 리서치도 하고, 분석도 하고, 글쓰기도 하고, 팩트체크도 해야 하는데 한 명한테 다 시키면 성능이 떨어진다."

해결책은 멀티에이전트 시스템이에요. 각자 전문 역할을 가진 에이전트들이 협력해서 작업을 처리하는 구조예요.

그런데 프레임워크가 너무 많아요. CrewAI, LangGraph, AutoGen — 다 비슷해 보이지만 철학이 완전히 달라요. 잘못 고르면 몇 주치 리팩토링이 기다려요.

이번 글에서는 세 프레임워크를 실전 코드와 함께 완전 비교해 드릴게요.


세 프레임워크의 핵심 철학

한 줄로 정리하면 이래요.

CrewAI  → 팀처럼 일한다 (역할 기반)
LangGraph → 그래프처럼 흐른다 (상태 기계)
AutoGen → 대화로 협력한다 (대화 기반)

같은 멀티에이전트 문제를 세 프레임워크가 완전히 다른 방식으로 접근해요.


CrewAI — 역할 기반 팀 구성

개념

실제 조직처럼 에이전트를 구성해요. 리서처, 분석가, 작가처럼 역할을 주고 팀(Crew)을 만들면 알아서 협력해요.

[Crew]
  ├─ 리서처 에이전트 (웹 검색 전담)
  ├─ 분석가 에이전트 (데이터 분석 전담)
  └─ 작가 에이전트 (보고서 작성 전담)

구현

from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, WebsiteSearchTool

# 툴 정의
search_tool = SerperDevTool()
web_tool = WebsiteSearchTool()

# 에이전트 정의
researcher = Agent(
    role="시니어 리서처",
    goal="주어진 주제에 대한 최신 정보를 수집하고 핵심 내용을 정리한다",
    backstory="""
        당신은 10년 경력의 리서치 전문가입니다.
        복잡한 주제를 빠르게 파악하고 핵심을 추출하는 능력이 뛰어납니다.
    """,
    tools=[search_tool, web_tool],
    verbose=True,
    allow_delegation=False
)

analyst = Agent(
    role="데이터 분석가",
    goal="수집된 정보를 분석해서 인사이트와 패턴을 도출한다",
    backstory="""
        당신은 데이터 분석 전문가입니다.
        원시 데이터에서 의미 있는 패턴을 찾아내는 것을 좋아합니다.
    """,
    verbose=True,
    allow_delegation=False
)

writer = Agent(
    role="테크 라이터",
    goal="분석 결과를 명확하고 읽기 쉬운 보고서로 작성한다",
    backstory="""
        당신은 기술 문서 전문 작가입니다.
        복잡한 내용을 누구나 이해하기 쉽게 표현합니다.
    """,
    verbose=True,
    allow_delegation=False
)

# 태스크 정의
research_task = Task(
    description="2026년 AI 에이전트 프레임워크 트렌드를 조사하세요. 최신 동향과 주요 플레이어를 파악하세요.",
    expected_output="주요 트렌드 5가지와 각 트렌드의 상세 설명",
    agent=researcher
)

analysis_task = Task(
    description="리서처가 수집한 정보를 바탕으로 시장 기회와 위협 요소를 분석하세요.",
    expected_output="SWOT 분석 결과와 핵심 인사이트",
    agent=analyst
)

writing_task = Task(
    description="분석 결과를 개발자를 위한 블로그 포스트 형태로 작성하세요.",
    expected_output="1500자 이상의 블로그 포스트",
    agent=writer
)

# Crew 구성 및 실행
crew = Crew(
    agents=[researcher, analyst, writer],
    tasks=[research_task, analysis_task, writing_task],
    process=Process.sequential,  # 순차 실행
    verbose=True
)

result = crew.kickoff()
print(result)

병렬 실행 (독립 태스크)

from crewai import Crew, Process

# 병렬로 실행 가능한 태스크들
crew = Crew(
    agents=[researcher1, researcher2, researcher3],
    tasks=[task1, task2, task3],
    process=Process.hierarchical,  # 매니저가 조율
    manager_llm="gpt-4o",
    verbose=True
)

장점과 단점

장점 — 진입 장벽이 낮아요. 20줄로 첫 멀티에이전트 시스템을 만들 수 있어요. 역할 기반이라 직관적이에요.

단점 — 프로덕션에서 체크포인팅이 약해요. 복잡한 조건부 흐름 구현이 어려워요. 디버깅 로깅이 불편해요.

언제 써야 하나 — 빠른 프로토타이핑, 역할 분담이 명확한 비즈니스 워크플로우.


LangGraph — 그래프 기반 상태 머신

개념

에이전트 워크플로우를 방향 그래프로 표현해요. 각 노드는 에이전트 또는 함수이고, 엣지는 흐름을 결정해요. 명시적인 상태 관리로 정확히 무슨 일이 일어나는지 추적 가능해요.

[시작]
  │
  ▼
[리서치 노드]
  │
  ├─ 충분한 정보? → [분석 노드] → [작성 노드] → [종료]
  └─ 부족? → [추가 리서치] → 다시 [리서치 노드]

구현

from langgraph.graph import StateGraph, END
from langgraph.checkpoint.memory import MemorySaver
from typing import TypedDict, Annotated
import operator

# 공유 상태 정의
class ResearchState(TypedDict):
    query: str
    research_results: list[str]
    analysis: str
    final_report: str
    iteration_count: int
    is_sufficient: bool

# 각 노드 함수 정의
def research_node(state: ResearchState) -> dict:
    """웹 리서치 수행"""
    query = state["query"]

    # 실제로는 검색 툴 사용
    results = web_search(query)

    return {
        "research_results": state.get("research_results", []) + results,
        "iteration_count": state.get("iteration_count", 0) + 1
    }

def evaluate_node(state: ResearchState) -> dict:
    """리서치 결과 충분한지 평가"""
    results = state["research_results"]
    iteration = state.get("iteration_count", 0)

    # 3번 이상 수집하거나 충분한 데이터면 충분
    is_sufficient = len(results) >= 5 or iteration >= 3

    return {"is_sufficient": is_sufficient}

def analysis_node(state: ResearchState) -> dict:
    """수집된 정보 분석"""
    results = state["research_results"]
    analysis = llm.invoke(f"다음 정보를 분석해줘:\n{results}")
    return {"analysis": analysis.content}

def writing_node(state: ResearchState) -> dict:
    """최종 보고서 작성"""
    analysis = state["analysis"]
    report = llm.invoke(f"다음 분석을 바탕으로 보고서 작성:\n{analysis}")
    return {"final_report": report.content}

# 조건부 엣지 함수
def should_continue_research(state: ResearchState) -> str:
    if state.get("is_sufficient", False):
        return "analyze"
    return "research"  # 루프백

# 그래프 구성
workflow = StateGraph(ResearchState)

# 노드 추가
workflow.add_node("research", research_node)
workflow.add_node("evaluate", evaluate_node)
workflow.add_node("analysis", analysis_node)
workflow.add_node("writing", writing_node)

# 엣지 연결
workflow.set_entry_point("research")
workflow.add_edge("research", "evaluate")
workflow.add_conditional_edges(
    "evaluate",
    should_continue_research,
    {
        "research": "research",  # 부족하면 다시 리서치
        "analyze": "analysis"    # 충분하면 분석으로
    }
)
workflow.add_edge("analysis", "writing")
workflow.add_edge("writing", END)

# 체크포인터 설정 (중단 후 재개 가능)
checkpointer = MemorySaver()
app = workflow.compile(checkpointer=checkpointer)

# 실행
config = {"configurable": {"thread_id": "research_001"}}
result = app.invoke(
    {"query": "2026년 AI 에이전트 프레임워크 비교", "iteration_count": 0},
    config=config
)

print(result["final_report"])

Human-in-the-Loop (사람 승인 게이트)

# 특정 노드에서 사람 확인 요청
workflow.add_node("human_review", interrupt_before_action)
workflow.compile(
    checkpointer=checkpointer,
    interrupt_before=["writing"]  # 작성 전 사람이 확인
)

# 재개
app.invoke(None, config=config)  # 사람이 승인하면 재개

장점과 단점

장점 — 프로덕션 준비도 최고예요. 체크포인팅, 타임트래블 디버깅, LangSmith 연동이 강력해요. 실행 흐름이 완전히 명시적이에요.

단점 — 배우기 어려워요. 그래프 이론 개념이 필요하고 코드가 길어요. 단순한 워크플로우에는 오버엔지니어링이에요.

언제 써야 하나 — 프로덕션 시스템, 복잡한 조건부 분기, 장시간 실행 워크플로우, Human-in-the-Loop 필요한 경우.

2026년 초 LangGraph가 GitHub 스타 수에서 CrewAI를 추월했어요. 기업 채택이 늘어났기 때문이에요.


AutoGen — 대화 기반 협력

개념

에이전트들이 채팅으로 협력해요. 여러 에이전트가 그룹채팅에 참여해서 서로 토론하고 검증하면서 결과를 만들어요.

[그룹챗]
  사용자 → 어시스턴트1 → 어시스턴트2 → 크리틱 → ...
          (작성)       (검증)       (반박)

구현

import autogen

# LLM 설정
llm_config = {
    "config_list": [{"model": "gpt-4o", "api_key": "YOUR_KEY"}],
    "temperature": 0.7
}

# 에이전트 정의
user_proxy = autogen.UserProxyAgent(
    name="사용자",
    human_input_mode="NEVER",  # 자동 실행
    max_consecutive_auto_reply=10,
    code_execution_config={"work_dir": "workspace", "use_docker": False}
)

researcher = autogen.AssistantAgent(
    name="리서처",
    llm_config=llm_config,
    system_message="""
        당신은 AI 기술 리서처입니다.
        최신 트렌드와 기술 동향을 조사하는 전문가입니다.
        항상 구체적인 데이터와 출처를 제시하세요.
    """
)

critic = autogen.AssistantAgent(
    name="크리틱",
    llm_config=llm_config,
    system_message="""
        당신은 비판적 사고 전문가입니다.
        다른 에이전트의 주장에서 논리적 오류, 편향, 빠진 부분을 찾아내세요.
        건설적인 피드백을 제공하세요.
    """
)

summarizer = autogen.AssistantAgent(
    name="요약가",
    llm_config=llm_config,
    system_message="""
        당신은 정보 통합 전문가입니다.
        토론 결과를 종합해서 핵심 인사이트를 정리하세요.
        "TERMINATE"를 출력하면 대화가 종료됩니다.
    """
)

# 그룹챗 구성
groupchat = autogen.GroupChat(
    agents=[user_proxy, researcher, critic, summarizer],
    messages=[],
    max_round=12,
    speaker_selection_method="auto"  # 자동으로 다음 발언자 선택
)

manager = autogen.GroupChatManager(
    groupchat=groupchat,
    llm_config=llm_config
)

# 실행
user_proxy.initiate_chat(
    manager,
    message="2026년 AI 에이전트 프레임워크 중 프로덕션에 가장 적합한 것은 무엇인지 분석해줘."
)

비용 주의 사항

# AutoGen은 LLM 호출이 많아요
# 4개 에이전트 × 5라운드 = 최소 20번 LLM 호출
# 토큰 비용 추정:
# - GPT-4o 기준: 20 calls × ~2000 tokens = 40,000 tokens
# - 비용: 약 $0.8~1.2 per conversation
# 고빈도 프로덕션에는 비용 부담이 커요

장점과 단점

장점 — 에이전트 간 자연스러운 토론이 가능해요. 검증과 반박 과정에서 품질이 높아져요. 코드 실행을 기본 지원해요.

단점 — LLM 호출이 많아서 비용이 커요. 대화가 예측 불가능하게 길어질 수 있어요. 프로덕션 관측성이 LangGraph보다 약해요.

참고로 Microsoft는 AutoGen을 유지보수 모드로 전환하고 더 광범위한 Microsoft Agent Framework에 집중하고 있어요. 신규 기능 개발은 느려졌어요.

언제 써야 하나 — 토론과 검증이 중요한 오프라인 분석, 코드 생성 및 실행, 품질이 속도보다 중요한 경우.


세 프레임워크 완전 비교

항목 CrewAI LangGraph AutoGen

학습 난이도 낮음 높음 중간
구조 역할 기반 팀 방향 그래프 대화 기반
프로덕션 준비도 중간 최고 중간
체크포인팅 제한적 완전 지원 미지원
LLM 호출 수 중간 중간 많음
디버깅 용이성 중간 높음 낮음
모델 독립성 완전 완전 완전
활발한 개발 활발 활발 유지보수 모드
적합한 케이스 프로토타입 프로덕션 오프라인 분석

실전 선택 가이드

빠르게 프로토타입 만들고 싶다 → CrewAI. 20줄로 첫 번째 멀티에이전트 시스템 완성.

프로덕션에 올려야 한다 → LangGraph. 체크포인팅, 타임트래블 디버깅, LangSmith 연동이 필수.

에이전트들이 토론하면서 품질 높이고 싶다 → AutoGen. 단 비용과 예측 불가능성 감안해야.

결국 프로덕션 가야 하는 프로젝트 → CrewAI로 프로토타입 → LangGraph로 마이그레이션. 많은 팀이 이 경로를 따라요.


같은 워크플로우, 세 가지 방식 비교

동일한 "리서치 → 분석 → 보고서 작성" 파이프라인을 세 프레임워크로 구현할 때 코드량 차이예요.

CrewAI:    ~60줄 (가장 간결)
AutoGen:   ~80줄 (중간)
LangGraph: ~120줄 (가장 많음, 대신 제어권 높음)

코드가 짧다고 좋은 게 아니에요. LangGraph의 120줄은 명시적 상태 관리와 조건부 흐름 덕분에 프로덕션에서 훨씬 안정적으로 동작해요.


마무리

세 프레임워크 선택의 핵심 원칙은 하나예요.

"프로토타입은 CrewAI, 프로덕션은 LangGraph."

AutoGen은 에이전트 토론이 꼭 필요한 특수한 케이스에 써요. 일반적인 업무 자동화에는 비용 대비 효율이 낮아요.

멀티에이전트 시스템의 핵심 도전은 프레임워크 선택이 아니라 에이전트 역할 설계와 오류 처리예요. 어떤 프레임워크를 쓰든 에이전트가 실패했을 때 어떻게 복구하는지를 먼저 설계하세요. 😄

 

반응형