Skip to main content
역할 기반 멀티에이전트(CrewAI), 핸드오프 패턴(OpenAI Agents SDK), 대화 기반 협업(AutoGen) 세 가지 프레임워크를 비교합니다. 각각의 설계 철학, 코드 예시, 장단점을 다룹니다.

CrewAI — 역할 기반 멀티에이전트

CrewAI는 “사람 팀처럼 동작하는 AI 에이전트 팀”이라는 직관적인 메타포를 기반으로 설계된 프레임워크입니다. 비개발자도 이해할 수 있는 선언적 API가 특징입니다.

설계 철학: 팀 메타포

성공 비유: 회사 프로젝트를 수행할 때 팀장이 각 팀원에게 역할(리서처, 분석가, 작성자)을 부여하고 업무를 배분하듯이, CrewAI는 Agent에게 역할(role)을 부여하고 Task를 할당합니다.
CrewAI 개념팀 비유설명
Agent팀원역할, 목표, 배경 스토리를 가진 AI 작업자
Task업무구체적인 작업 지시 + 기대 결과물
CrewAgent들을 모아 프로세스에 따라 실행
Process업무 방식Sequential(순차) 또는 Hierarchical(계층)

코드 예제: 리서치 + 보고서 작성 팀

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

# 도구 정의
search_tool = SerperDevTool()

# Agent 1: 리서처
researcher = Agent(
    role="시니어 데이터 리서처",
    goal="Databricks의 최신 기술 동향을 조사하여 핵심 인사이트를 도출한다",
    backstory=(
        "당신은 10년 경력의 데이터 플랫폼 분석가입니다. "
        "기술 트렌드를 빠르게 파악하고 비즈니스 임팩트를 연결하는 데 탁월합니다."
    ),
    tools=[search_tool],
    verbose=True,
)

# Agent 2: 보고서 작성자
writer = Agent(
    role="테크 라이터",
    goal="리서처의 조사 결과를 기반으로 경영진용 보고서를 작성한다",
    backstory=(
        "당신은 기술 콘텐츠를 비기술 임원이 이해할 수 있도록 "
        "변환하는 전문 테크 라이터입니다."
    ),
    verbose=True,
)

# Task 1: 조사
research_task = Task(
    description="2025년 Databricks의 주요 제품 업데이트와 시장 동향을 조사하세요.",
    expected_output="핵심 업데이트 5개와 각각의 비즈니스 임팩트 분석",
    agent=researcher,
)

# Task 2: 보고서 작성
writing_task = Task(
    description="리서치 결과를 기반으로 경영진용 1페이지 브리핑을 작성하세요.",
    expected_output="제목, 핵심 요약 3줄, 상세 분석 5개 항목의 구조화된 보고서",
    agent=writer,
)

# Crew 구성 및 실행
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task],
    process=Process.sequential,  # 순차 실행: 리서치 -> 작성
    verbose=True,
)

result = crew.kickoff()
print(result)

Process 타입

Process동작 방식적합한 시나리오
SequentialTask를 순서대로 실행. 이전 Task 결과가 다음 Task의 입력파이프라인형 작업 (조사 -> 분석 -> 보고서)
HierarchicalManager Agent가 하위 Agent에게 작업 위임 및 조율복잡한 프로젝트 관리, 여러 전문가 협업

CrewAI의 장점과 한계

장점:
  • 직관적: 역할/팀 메타포가 명확하여 비개발자도 구조를 이해 가능
  • 빠른 프로토타이핑: 10분 내에 멀티에이전트 시스템 구축 가능
  • 선언적 API: 코드보다는 “설정”에 가까운 구성 방식
한계:
  • 세밀한 제어 어려움: 에이전트 간 통신의 세부 흐름을 커스텀하기 어려움
  • 조건 분기 제한: LangGraph 대비 복잡한 분기/루프 표현 능력 부족
  • 프로덕션 미성숙: 에러 처리, 모니터링, 거버넌스 기능이 약함
  • 비결정적 동작: Agent의 “대화”가 매번 다르게 전개될 수 있음

OpenAI Agents SDK — Handoff 패턴의 정석

2025년 1월 출시된 OpenAI Agents SDK는 OpenAI가 직접 제공하는 공식 Agent 프레임워크입니다. Handoff(대화 인계), Guardrail(안전장치), Tracing(추적) 을 핵심 기능으로 내세웁니다.

핵심 개념

개념설명비유
Agent시스템 프롬프트 + 도구 + 모델로 구성된 실행 단위전문 상담원
HandoffAgent A가 대화 전체를 Agent B에게 넘기기콜센터 상담 전환
Guardrail입력/출력을 프레임워크 레벨에서 검증보안 검색대
Tracing전체 실행 과정을 자동으로 기록CCTV 녹화

Handoff 패턴

Handoff는 OpenAI Agents SDK의 가장 독특한 기능입니다. Agent A가 자신의 전문 영역이 아닌 질문을 받으면, 대화 히스토리 전체를 포함하여 Agent B에게 인계합니다.
참고 Handoff vs Tool Call: Tool Call은 “특정 함수를 호출하고 결과를 받아오는 것”이고, Handoff는 “대화의 주도권 자체를 다른 Agent에게 넘기는 것”입니다. 콜센터에서 “잠시만요, 기술팀으로 연결해드리겠습니다”라고 하는 것이 Handoff입니다.

코드 예제: 고객 서비스 Agent (Handoff 포함)

from openai import agents

# 전문 Agent 정의
billing_agent = agents.Agent(
    name="billing_agent",
    instructions=(
        "당신은 청구/결제 전문 상담원입니다. "
        "청구 관련 질문에만 답변하세요. "
        "기술 지원 질문은 tech_agent로 핸드오프하세요."
    ),
    model="gpt-4o",
)

tech_agent = agents.Agent(
    name="tech_agent",
    instructions=(
        "당신은 기술 지원 전문 상담원입니다. "
        "기술적인 문제에 대해 답변하세요. "
        "청구 관련 질문은 billing_agent로 핸드오프하세요."
    ),
    model="gpt-4o",
)

# Triage Agent -- 첫 진입점
triage_agent = agents.Agent(
    name="triage_agent",
    instructions=(
        "당신은 고객 문의를 분류하는 접수 담당입니다. "
        "고객의 질문을 파악하여 적절한 전문 상담원에게 연결하세요."
    ),
    model="gpt-4o",
    handoffs=[billing_agent, tech_agent],  # 핸드오프 대상 지정
)

# 실행
result = agents.run(
    triage_agent,
    messages=[{"role": "user", "content": "지난달 청구서가 이상합니다"}],
)

# triage_agent -> billing_agent로 자동 핸드오프됨
print(result.final_output)

Guardrail (입력/출력 검증)

from openai.agents import guardrail, GuardrailFunctionOutput

@guardrail
def no_pii_guardrail(text: str) -> GuardrailFunctionOutput:
    """개인정보(PII)가 포함된 입력을 차단"""
    import re
    # 주민등록번호 패턴 체크
    if re.search(r'\d{6}-\d{7}', text):
        return GuardrailFunctionOutput(
            output_info="주민등록번호가 감지되었습니다.",
            tripwire_triggered=True,  # 실행 중단
        )
    return GuardrailFunctionOutput(
        output_info="안전한 입력입니다.",
        tripwire_triggered=False,
    )

agent = agents.Agent(
    name="safe_agent",
    instructions="고객 문의에 답변하세요.",
    model="gpt-4o",
    input_guardrails=[no_pii_guardrail],  # 입력 가드레일 적용
)

OpenAI Agents SDK의 장점과 한계

장점:
  • 간결한 API: 최소한의 코드로 Agent 구축 가능
  • Handoff 패턴 내장: 멀티에이전트 라우팅이 매우 깔끔
  • Guardrail 내장: 별도 라이브러리 없이 입출력 검증
  • 자동 Tracing: OpenAI 대시보드에서 실행 과정 시각화
  • 프로덕션 지향: OpenAI 인프라와 긴밀하게 통합
한계:
  • OpenAI 종속: 기본적으로 OpenAI 모델만 지원 (커스텀 확장 필요)
  • 복잡한 그래프 표현 제한: LangGraph 수준의 복잡한 워크플로는 어려움
  • 상태 관리 제한: LangGraph Checkpoint 같은 장기 상태 관리 기능 부족
  • 자체 호스팅 어려움: OpenAI API 의존도가 높음

AutoGen (Microsoft) — 멀티에이전트 대화

AutoGen은 Microsoft Research에서 개발한 프레임워크로, Agent들이 자유롭게 “대화”하며 문제를 해결하는 패러다임을 제안합니다.

설계 철학

성공 비유: 다른 프레임워크가 “조직도에 따른 업무 배분”이라면, AutoGen은 “회의실에서 자유 토론”에 가깝습니다. 참가자들이 돌아가며 발언하고, 서로의 의견에 반응하며, 합의에 도달합니다.

핵심 컴포넌트

컴포넌트역할
ConversableAgent대화 가능한 Agent의 기본 클래스
AssistantAgentLLM 기반 Agent (추론 담당)
UserProxyAgent사용자를 대리하는 Agent (코드 실행, 승인 등)
GroupChat여러 Agent가 참여하는 그룹 대화
GroupChatManager그룹 대화의 발언 순서와 종료 조건 관리

코드 예제: 코드 생성 + 리뷰 Agent

from autogen import AssistantAgent, UserProxyAgent, config_list_from_json

# LLM 설정
config_list = [{"model": "gpt-4o", "api_key": "YOUR_API_KEY"}]

# Agent 1: 코드 작성자
coder = AssistantAgent(
    name="coder",
    system_message=(
        "당신은 시니어 Python 개발자입니다. "
        "요청받은 기능을 깔끔한 Python 코드로 구현하세요. "
        "코드 블록으로 감싸서 응답하세요."
    ),
    llm_config={"config_list": config_list},
)

# Agent 2: 코드 리뷰어
reviewer = AssistantAgent(
    name="reviewer",
    system_message=(
        "당신은 코드 리뷰 전문가입니다. "
        "coder가 작성한 코드를 리뷰하고 개선점을 제안하세요. "
        "보안, 성능, 가독성 관점에서 평가하세요."
    ),
    llm_config={"config_list": config_list},
)

# Agent 3: 사용자 대리 (코드 실행 가능)
user_proxy = UserProxyAgent(
    name="user_proxy",
    human_input_mode="NEVER",  # 자동 실행 (사람 개입 없음)
    code_execution_config={"work_dir": "coding_output"},
    max_consecutive_auto_reply=3,
)

# 대화 시작: user_proxy가 coder에게 요청
user_proxy.initiate_chat(
    coder,
    message="Delta Lake 테이블의 변경 이력을 조회하는 Python 함수를 작성해주세요.",
)

AutoGen의 장점과 한계

장점:
  • 코드 실행 내장: Agent가 직접 Python/Shell 코드를 실행하고 결과 확인 가능
  • 자유도 높은 대화: 정해진 워크플로 없이 Agent들이 자율적으로 협업
  • 연구/실험에 최적: 다양한 에이전트 구성을 빠르게 실험 가능
  • GroupChat: 3개 이상의 Agent가 동시에 참여하는 토론 가능
한계:
  • 비결정적 흐름: 매번 다른 대화 흐름이 전개될 수 있어 프로덕션에서 예측 가능성 낮음
  • 프로덕션 배포 복잡: 모니터링, 에러 처리, 스케일링이 쉽지 않음
  • 대화 비용: 불필요한 왕복 대화로 토큰 비용 증가 가능
  • 종료 조건 설정 어려움: “언제 대화를 끝낼 것인가”의 판단이 까다로움
주의 AutoGen v0.4 주의사항: AutoGen은 v0.2에서 v0.4로 대규모 리팩토링을 거쳤습니다. 이전 버전의 블로그/튜토리얼 코드는 v0.4에서 동작하지 않을 수 있습니다. 반드시 최신 공식 문서를 참고하세요.

README로 돌아가기 | 다음: Databricks Agent Framework