에이전트 프레임워크 트레이드오프(Agent Framework Tradeoffs) — LangGraph vs CrewAI vs AutoGen vs Agno

모든 프레임워크(framework)는 같은 데모를 팝니다. 리서치 에이전트(research agent)가 보고서를 작성합니다. 그리고 같은 버그를 숨깁니다. 상태 스키마(state schema)가 오케스트레이션 레이어(orchestration layer)와 충돌합니다. 프레임워크는 문제의 형태(shape)와 추상화(abstraction)가 맞는 것을 골라야 합니다. 나머지는 두 번 작성하게 되는 글루 코드(glue code)일 뿐입니다.

유형: Learn 언어: Python 선수 지식: Phase 11 · 09(Function Calling), Phase 11 · 16(LangGraph) 예상 시간: 약 45분

문제

하나 이상의 LLM 호출(call)이 필요한 작업(task)이 있다고 가정합니다. 리서치 워크플로(research workflow)일 수도 있습니다. 계획을 세우고(plan), 검색(search)하고, 요약(summarize)하고, 출처를 인용(cite)하는 일련의 흐름이 필요합니다. 코드 리뷰 파이프라인(code-review pipeline)일 수도 있습니다. 변경 차이(diff)를 파싱하고, 비평(critique)하고, 패치를 적용(patch)하고, 검증(validate)해야 합니다. 항공권을 예약하고 이메일을 작성하며 경비 보고서를 제출하는 다중 턴 어시스턴트(multi-turn assistant)일 수도 있습니다. 이 시점에서 프레임워크를 하나 고르게 됩니다.

3일이 지나면 그 프레임워크의 추상화가 새고 있다(leak)는 사실을 발견하게 됩니다. CrewAI는 역할(role)을 제공하지만, "리서처(researcher)"가 구조화된 계획(structured plan)을 "라이터(writer)"에게 넘겨주려는 순간부터 사용자와 싸우기 시작합니다. AutoGen은 에이전트 사이의 채팅(chat)을 제공하지만 일급(first-class) 상태가 없기 때문에 체크포인트(checkpoint)가 결국 대화 로그(conversation log)의 피클(pickle) 파일이 되어 버립니다. LangGraph는 상태 그래프(state graph)를 제공하지만, 에이전트가 무엇을 할지도 알기 전에 모든 전이(transition)에 이름을 붙이라고 요구합니다. Agno는 단일 에이전트(single agent) 프리미티브(primitive)가 강력하지만, 동시에 세 개의 워커(worker)로 팬아웃(fan out)하려고 하면 곧장 비명을 지릅니다.

해결책은 "가장 좋은 프레임워크 하나를 고르자"가 아닙니다. 프레임워크의 핵심 추상화(core abstraction)를 문제의 형태에 맞추는 것입니다. 이 강의는 그 지도를 그리는 데 목적이 있습니다.

개념

Framework fit by problem shape Branching style: explicit ---- LLM-selected State: ephemeral ---- durable LangGraph StateGraph CrewAI Roles + tasks AutoGen Chat / GroupChat Agno Agent + storage

2026년 현재 네 개의 프레임워크가 환경을 주도하고 있습니다. 하지만 이들의 핵심 추상화는 서로 다릅니다.

FrameworkCore abstractionBest fitWorst fit
LangGraphStateGraph — 타입이 지정된 상태(typed state), 노드(nodes), 조건부 엣지(conditional edges), 체크포인터(checkpointer).명시적 상태와 사람 개입(human-in-the-loop) 인터럽트가 있는 워크플로, 타임 트래블 디버깅(time-travel debugging)이 필요한 운영 환경 에이전트.토폴로지(topology)가 정해지지 않은 느슨하고 역할 중심적인 브레인스토밍.
CrewAICrew — 역할(목표·배경 이야기), 작업(tasks), 프로세스(순차 또는 계층).짧은 선형/계층 계획을 갖는 역할극(role-playing) 또는 페르소나(persona) 기반 워크플로.Crew의 턴 이력(turn history)을 넘어서는 상태 유지 작업, 복잡한 분기.
AutoGenConversableAgent 쌍 — 두 개 이상의 에이전트가 종료 조건(exit condition)이 충족될 때까지 턴을 주고받음.사고가 채팅에서 자연스럽게 떠오르는(emergent) 다중 에이전트 대화 — 교사-학생, 제안자-비평자(proposer-critic), 행위자-리뷰어 등.알려진 DAG(directed acyclic graph; 방향 비순환 그래프)를 가진 결정적 워크플로, 재시작을 견디는 영속 상태가 필요한 경우.
AgnoAgent — 단일 LLM + 도구(tools) + 메모리, 팀으로 합성 가능.빠르게 만드는 단일 에이전트와 가벼운 팀, 강한 멀티모달리티(multi-modality)와 내장 스토리지 드라이버(storage driver).사용자 정의 리듀서(custom reducer)가 필요한 깊고 명시적으로 분기되는 그래프.

"추상화"가 실제로 뜻하는 것

프레임워크의 핵심 추상화는 아키텍처를 설명할 때 화이트보드에 그리게 되는 그림입니다.

  • LangGraph → 그래프를 그립니다. 노드는 단계이고, 엣지는 전이이며, 모든 지점에서 상태 객체(state object)는 타입이 지정되어 있습니다. 머릿속 모델은 상태 기계(state machine)입니다.
  • CrewAI → 조직도(org chart)를 그립니다. 각 역할에는 직무 기술(job description)이 있고, 매니저(manager)가 작업을 라우팅(route)합니다. 머릿속 모델은 소규모 전문가 팀입니다.
  • AutoGen → 슬랙 DM(Slack direct message; 다이렉트 메시지)을 그립니다. 두 에이전트가 서로 메시지를 주고받고, 중재자(moderator)가 필요해지면 세 번째 에이전트가 합류합니다. 머릿속 모델은 채팅입니다.
  • Agno → 도구가 매달린 단일 박스(box)를 그립니다. 팀이 필요하면 박스를 옆에 나란히 둡니다. 머릿속 모델은 "배터리 포함(batteries included) 에이전트"입니다.

상태(state) 관점에서의 질문

상태는 운영 환경에서 프레임워크 선택이 가장 자주 무너지는 지점입니다.

  • LangGraph. 타입이 지정된 상태(TypedDict 또는 Pydantic 모델), 필드별 리듀서(per-field reducer), 일급 체크포인터(SQLite/Postgres/Redis)를 제공합니다. 재개(resume), 인터럽트(interrupt), 타임 트래블(time-travel)이 기본으로 따라옵니다. (Phase 11 · 16 참고.)
  • CrewAI. 상태는 context 필드를 통해 작업 사이에 문자열로 흐르거나, output_pydantic을 통해 구조화된 형태로 흐릅니다. Crew 단위의 영속 저장소(durable per-crew store)는 기본 제공되지 않습니다. Crew가 재시작을 견뎌야 한다면 사용자가 직접 붙여 써야 합니다.
  • AutoGen. 상태는 채팅 이력과 사용자가 정의한 context입니다. 대화 기록(conversation transcript)은 영속화할 수 있지만, 임의의 워크플로 상태는 어댑터(adapter)를 직접 작성하지 않으면 보존되지 않습니다.
  • Agno. storage=를 통해 Agent에 붙는 내장 스토리지 드라이버(SQLite, Postgres, Mongo, Redis, DynamoDB)가 있습니다. 대화 세션과 사용자 메모리는 자동으로 영속화됩니다. 다만 완전한 그래프 체크포인터라기보다는 세션 저장소(session store)에 가깝습니다.

분기(branching) 관점에서의 질문

사소하지 않은 에이전트는 모두 분기합니다. 누가 분기를 결정하는지가 중요합니다.

  • LangGraph — 개발자가 조건부 엣지(conditional edge)로 결정합니다. 라우팅(routing)은 명명된 분기를 가진 Python 함수입니다. 분기는 컴파일된 그래프 안에서 일급 시민이며, 체크포인터는 어떤 분기가 선택됐는지 기록합니다.
  • CrewAI — 계층(hierarchical) 모드에서는 매니저가 결정하고, 순차(sequential) 모드에서는 빌드 시점(build time)에 개발자가 결정합니다. 라우팅은 작업 목록에 암묵적으로 들어 있으며, 매니저 프롬프트 밖에는 일급 if가 없습니다.
  • AutoGen — 에이전트가 채팅을 통해 결정합니다. 분기는 누가 다음에 말하는지에서 자연스럽게 떠오릅니다. GroupChatManager가 다음 화자(next speaker)를 선택하며, speaker_selection_method를 직접 작성할 수도 있지만 기본값은 LLM이 주도합니다.
  • Agno — 에이전트가 다음에 어떤 도구를 호출할지에 따라 결정합니다. 팀에는 coordinator/router/collaborator 모드가 있으며, 그 이상의 분기는 개발자의 책임입니다.

관측성(observability) 관점에서의 질문

  • LangGraph — LangSmith 또는 임의의 OpenTelemetry(OTel) 익스포터(exporter)를 통해 OpenTelemetry를 사용할 수 있습니다. 모든 노드 전이가 트레이스 스팬(trace span)이 되며, 체크포인트는 재생 가능한 트레이스 역할도 함께 합니다. LangSmith가 일급 옵션이며 Langfuse, Phoenix용 어댑터도 있습니다.
  • CrewAI — 2025년 말부터 일급 OpenTelemetry를 제공합니다. Langfuse, Phoenix, Opik, AgentOps와 연동(integration)할 수 있습니다.
  • AutoGenautogen-core를 통해 OpenTelemetry 연동을 제공합니다. AgentOps와 Opik 커넥터(connector)가 있습니다. 추적(tracing) 단위는 노드별이 아니라 에이전트 메시지(per-agent-message) 단위입니다.
  • Agno — 내장 monitoring=True 플래그(flag)와 OpenTelemetry 익스포터를 제공합니다. 세션 트레이스(session trace)에서 Langfuse와의 통합이 특히 강합니다.

비용(cost)과 지연 시간(latency)

네 프레임워크 모두 호출당 오버헤드(per-call overhead)를 더합니다. 프레임워크 로직, 검증(validation), 직렬화(serialization) 비용이 발생합니다. 오버헤드가 커지는 대략적인 순서는 Agno ≈ LangGraph < CrewAI ≈ AutoGen입니다. 차이는 프레임워크가 얼마나 많은 추가 LLM 라우팅을 수행하느냐에 좌우됩니다. CrewAI의 계층 매니저는 다음 에이전트를 고르는 데 토큰을 씁니다. AutoGen의 GroupChatManager도 마찬가지입니다. LangGraph는 개발자가 llm.invoke를 호출한 곳에서만 토큰을 씁니다. Agno의 단일 에이전트 경로는 얇습니다.

실행당 비용이 중요하다면 LLM이 선택하는 라우팅(LLM-selected routing)보다 명시적 라우팅(explicit routing)을 선호합니다. 예를 들어 LangGraph 엣지나 AutoGen의 speaker_selection_method를 사용합니다.

상호 운용성(interoperability)

  • LangGraphLangChain의 도구, 리트리버(retriever), LLM과 직접 연동됩니다. 일급 MCP(Model Context Protocol) 어댑터를 통해 MCP 서버를 도구로 임포트할 수 있습니다.
  • CrewAI ↔ 도구는 BaseTool을 상속합니다. LangChain 도구, LlamaIndex 도구, MCP 도구가 모두 어댑터로 연결됩니다. allow_delegation=True를 사용해 Crew 간 위임(delegation)을 할 수 있습니다.
  • AutoGenFunctionTool이 임의의 Python 콜러블(callable)을 감쌉니다. MCP 어댑터를 사용할 수 있습니다. 에이전트 간 패턴은 AG2 생태계와 결합도가 높습니다.
  • Agno@tool 데코레이터(decorator)나 BaseTool 서브클래스를 사용합니다. MCP 어댑터가 있으며, 도구는 에이전트와 팀 사이에서 공유할 수 있습니다.

스킬(The Skill)

주어진 에이전트 문제에 특정 프레임워크가 맞는 이유를 한 문장으로 설명할 수 있어야 합니다.

빌드 전에 확인할 체크리스트입니다.

  1. 형태를 그립니다. 이것은 그래프(타입 상태, 명명된 전이)인가요? 역할극(전문가가 작업을 넘기는 형태)인가요? 채팅(에이전트들이 끝날 때까지 대화하는 형태)인가요? 도구를 가진 단일 에이전트인가요?
  2. 누가 분기를 결정하는지 정합니다. 개발자가 결정하는 분기라면 LangGraph입니다. 매니저 에이전트가 결정한다면 CrewAI의 계층 모드입니다. 채팅에서 자연스럽게 떠오르는 분기라면 AutoGen입니다. 도구 호출로 결정되는 분기라면 Agno입니다.
  3. 상태 예산을 확인합니다. 체크포인트에서 재개, 타임 트래블, 실행 중 사람 개입 인터럽트가 필요한가요? 그렇다면 기본 선택은 LangGraph이며, Agno 세션은 대화 범위(conversation-scoped) 상태를 다루는 데 적합합니다.
  4. 비용 예산을 확인합니다. LLM이 선택하는 라우팅은 매 턴마다 추가 토큰을 씁니다. 에이전트가 하루에 수천 번 실행된다면 명시적 라우팅을 선호합니다.
  5. 프레임워크 오버헤드를 예산에 포함합니다. 모든 프레임워크는 또 하나의 의존성입니다. 작업이 LLM 호출 두 개와 도구 하나 정도라면 평범한 Python 코드 30줄로 충분하며, 프레임워크 없는 것보다 더 가벼운 프레임워크는 없습니다.

그래프, 조직도, 채팅, 에이전트 박스 중 어떤 그림인지 그릴 수 있기 전에는 프레임워크를 잡지 않습니다. 그리고 정작 필요한 상태 모델과 싸우게 만드는 프레임워크라면 선택하지 않습니다.

의사 결정 표(The Decision Matrix)

Problem shapePreferred frameworkWhy
타입 상태, 사람 승인, 장시간 실행이 필요한 워크플로 DAGLangGraph일급 상태, 체크포인터, 인터럽트, 타임 트래블 모두 기본 제공.
뚜렷한 역할이 있는 리서치 / 작성 파이프라인CrewAI(sequential) 또는 LangGraph subgraphs작업당 역할 구조는 CrewAI에서 가장 싸게 표현됩니다. 분기가 복잡해지면 LangGraph로 확장합니다.
제안자-비평자(proposer-critic) 또는 교사-학생 대화AutoGen2인 에이전트 채팅이 본래의 형태입니다.
도구·세션·메모리를 가진 단일 에이전트Agno가장 얇은 설정에 내장 스토리지와 메모리를 제공합니다.
리듀서(reducer)와 함께 수천 개의 병렬 팬아웃LangGraph + Send병렬 디스패치 프리미티브를 일급으로 제공하는 유일한 선택지입니다.
빠른 프로토타입, 프레임워크 약정 없음Plain Python + provider SDK프레임워크 없는 것이 가장 빠른 프레임워크입니다.

연습문제

  1. 쉬움. 같은 작업, 즉 "Anthropic 본사를 조사하고, 200단어 분량의 브리프(brief)를 쓰고, 출처를 인용하라"를 LangGraph(네 개의 노드: plan, search, write, cite)와 CrewAI(세 개의 역할: researcher, writer, editor)로 각각 구현합니다. 실행당 토큰 비용(token cost)과 코드 줄 수(lines of code)를 보고합니다.
  2. 중간. 같은 작업을 AutoGen(researcher ↔ writer 채팅, editor가 GroupChat을 통해 합류)과 Agno(search_tools, write_tools, 세션 저장소를 가진 단일 에이전트)로 구현합니다. 네 가지 구현을 (a) 실행당 비용, (b) 크래시(crash) 후 재개 가능 여부, (c) 작성 단계 전 사람 승인 주입 가능 여부 기준으로 순위를 매깁니다.
  3. 어려움. 짧은 문제 기술(JSON: {has_typed_state, has_roles, has_dialogue, has_parallel_fanout, needs_resume})을 입력으로 받아 추천 프레임워크와 한 문장 정당화(justification)를 반환하는 결정 트리(decision-tree) 스크립트 pick_framework.py를 만듭니다. 직접 설계한 여섯 가지 사례로 검증합니다.

핵심 용어

용어흔한 설명실제 의미
Orchestration"에이전트들이 어떻게 협력하는가"어떤 노드·역할·에이전트가 다음에 실행될지 결정하는 계층이다.
Durable state"재시작 후 재개"프로세스 종료를 견디는 상태로, 체크포인트나 세션 저장소에 묶여 있다.
LLM-selected routing"모델이 결정하게 하기"플래너(planner) LLM이 매 턴 다음 단계를 고르는 방식이다. 유연하지만 매 결정마다 토큰을 소모한다.
Explicit routing"개발자가 결정하기"Python 함수나 정적 엣지가 다음 단계를 고른다. 비용이 싸고 감사(audit)가 쉽다.
Crew"CrewAI의 팀"역할 + 작업 + 프로세스(순차 또는 계층)를 하나의 실행 가능 단위로 묶은 것이다.
GroupChat"AutoGen의 다중 에이전트 채팅"화자 선택기(speaker selector)를 가진 N개 에이전트 사이의 관리된 대화다.
Team(Agno)"Agno의 다중 에이전트"에이전트 집합 위에 route / coordinate / collaborate 모드를 제공하는 구조다.
StateGraph"LangGraph의 그래프"타입 상태, 노드, 조건부 엣지, 체크포인터를 결합한 프리미티브다.

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

확인 문제

5문제 · 모두 맞추면 완료 표시가 가능합니다

1.

2.

3.

4.

5.

0/5 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다