AutoGen v0.4: 액터 모델(Actor Model)과 에이전트 프레임워크
AutoGen v0.4(Microsoft Research, 2025년 1월)는 에이전트 오케스트레이션을 액터 모델(actor model) 중심으로 재설계했습니다. 비동기 메시지 교환, 이벤트 기반 에이전트, 장애 격리(fault isolation), 자연스러운 동시성(concurrency)이 핵심입니다. 현재 이 프레임워크는 유지보수 모드이며, Microsoft Agent Framework(2025년 10월 public preview)가 후속 자리로 들어서고 있습니다.
유형: Learn + Build
언어: Python (stdlib)
선수 학습: Phase 14 · 01 (에이전트 루프), Phase 14 · 12 (워크플로 패턴(Workflow Patterns))
소요 시간: 약 75분
학습 목표
- 액터 모델을 설명할 수 있습니다. 에이전트는 액터이고, 메시지는 유일한 프로세스 간 통신(Inter-Process Communication; IPC)이며, 장애는 액터 단위로 격리됩니다.
- AutoGen v0.4의 세 API 계층인 Core, AgentChat, Extensions와 각각의 용도를 말할 수 있습니다.
- 메시지 전달(delivery)과 처리(handling)를 분리하면 왜 장애 격리와 자연스러운 동시성이 생기는지 설명할 수 있습니다.
- 파이썬 표준 라이브러리만으로 액터 런타임(actor runtime)을 구현하고, 두 에이전트 기반 코드 리뷰 흐름을 그 위로 옮길 수 있습니다.
문제
대부분의 에이전트 프레임워크는 동기적입니다. 한 에이전트가 결과를 만들고, 다른 에이전트가 같은 호출 스택 안에서 그 결과를 소비합니다. 어디선가 실패하면 스택 전체가 무너집니다. 동시성은 나중에 덧붙이는 식이고, 분산 실행을 하려면 처음부터 다시 작성해야 합니다.
AutoGen v0.4가 내놓은 답은 액터 모델입니다. 각 에이전트는 자기만의 비공개 받은편지함(inbox)을 가진 액터입니다. 메시지가 유일한 상호작용 수단입니다. 런타임은 전달과 처리를 분리합니다. 실패는 하나의 액터 안에 갇히고, 동시성은 처음부터 기본으로 제공되며, 분산 실행은 그저 다른 전송 계층(transport)을 갈아 끼우는 일일 뿐입니다.
개념
액터
액터는 다음을 가집니다.
- 비공개 상태(private state). 외부에서 직접 건드릴 수 없습니다.
- 받은편지함(inbox). 메시지 큐입니다.
- 처리기(handler).
receive(message) -> effects 형태이며, 효과(effect)는 "응답하기", "다른 액터에게 메시지 보내기", "새 액터 생성하기", "상태 갱신하기", "자기 자신 중지하기"가 될 수 있습니다.
두 액터는 메모리를 공유할 수 없습니다. 오직 메시지만 주고받을 수 있습니다.
AutoGen v0.4의 세 API 계층
- Core. 저수준 액터 프레임워크입니다.
AgentRuntime, Agent, Message, Topic을 포함합니다. 비동기 메시지 교환과 이벤트 기반 실행을 담당합니다.
- AgentChat. 작업 중심의 고수준 API입니다. v0.2의 ConversableAgent를 대체합니다.
AssistantAgent, UserProxyAgent, RoundRobinGroupChat, SelectorGroupChat이 여기에 속합니다.
- Extensions. 통합 계층입니다. OpenAI, Anthropic, Azure 같은 모델 제공자와 도구, 메모리를 연결합니다.
분리가 중요한 이유
v0.2 모델에서는 agent_a.chat(agent_b)를 동기적으로 호출하면 agent_b가 반환할 때까지 agent_a가 블로킹(blocking)됩니다. v0.4에서 send(agent_b, msg)는 메시지를 agent_b의 받은편지함에 넣고 곧바로 반환하며, 런타임이 나중에 전달을 책임집니다. 여기서 세 가지 효과가 따라옵니다.
- 장애 격리(Fault isolation). Agent B가 크래시(crash)해도 Agent A는 영향을 받지 않습니다. 런타임이 B의 처리기 실패를 잡아내고, 로그를 남길지, 재시도할지, 사후 보관 큐(dead-letter queue)로 보낼지 결정합니다.
- 자연스러운 동시성(Natural concurrency). 여러 메시지가 동시에 떠다닐 수 있으며, 액터들은 각자의 받은편지함을 병렬로 처리합니다.
- 분산 준비(Distribution-ready). 액터가 같은 프로세스에 있든 다른 호스트에 있든, 받은편지함과 전송 계층(transport)이라는 추상화는 똑같이 유지됩니다.
토폴로지(topology)
- RoundRobinGroupChat. 에이전트가 고정된 순서로 차례를 가져갑니다.
- SelectorGroupChat. 선택자(selector) 역할의 에이전트가 대화 맥락을 보고 다음 발화자를 고릅니다.
- Magentic-One. 웹 브라우징, 코드 실행, 파일 처리를 위한 참조용 멀티 에이전트 팀입니다. AgentChat 위에 구축되어 있습니다.
관찰성(Observability)
OpenTelemetry 지원이 기본으로 내장되어 있습니다. 모든 메시지는 스팬(span)을 내보내며, 도구 호출은 2026년 OTel GenAI 시맨틱 컨벤션(semantic conventions; 23강)에 따라 gen_ai.* 속성을 함께 실어 보냅니다.
상태: 유지보수 모드
2026년 초 기준 AutoGen v0.7.x는 연구와 프로토타이핑에 안정적으로 사용할 수 있습니다. Microsoft는 활발한 개발의 무게중심을 Microsoft Agent Framework로 옮겼습니다. 이 프레임워크는 2025년 10월 1일 public preview가 공개되었고, 2026년 1분기 말 1.0 GA(General Availability; 정식 출시)를 목표로 하고 있습니다. AutoGen의 패턴은 앞으로도 매끄럽게 이식되며, 오래 남는 핵심 아이디어는 결국 액터 모델 그 자체입니다.
만들어보기
code/main.py는 표준 라이브러리만으로 액터 런타임을 구현합니다.
Message — sender, recipient, topic, body를 담은 타입이 정해진 페이로드(typed payload)입니다.
Actor — receive(message, runtime)을 가진 추상 기반 클래스입니다.
Runtime — 공유 큐, 전달, 장애 격리를 갖춘 이벤트 루프(event loop)입니다.
- 두 액터로 구성된 데모 —
ReviewerAgent가 코드를 리뷰하고, ChecklistAgent가 체크리스트를 진행합니다. 두 액터는 합의(consensus)에 도달할 때까지 메시지를 주고받습니다.
다음과 같이 실행합니다.
python3 code/main.py
실행 추적은 메시지 전달 과정, 한 액터의 시뮬레이션된 실패가 다른 액터를 크래시시키지 않는 모습, 그리고 두 액터가 공유 판정에 수렴하는 과정을 보여줍니다.
사용해보기
- AutoGen v0.4/v0.7(maintenance) — 연구, 프로토타이핑, 멀티 에이전트 패턴 실험에 여전히 안정적으로 쓸 수 있습니다.
- Microsoft Agent Framework(public preview) — 앞으로 이어질 경로입니다. 같은 액터 모델 아이디어를 새 API로 제공합니다.
- LangGraph 스웜 토폴로지(swarm topology)(13강) — 공유 도구 핸드오프(handoff)를 통해 비슷한 패턴을 구현합니다.
- 사용자 정의 액터 런타임 — 특정 전송 계층(NATS, RabbitMQ, gRPC)이 필요할 때 직접 만들어 사용합니다.
산출물 만들기
outputs/skill-actor-runtime.md는 주어진 멀티 에이전트 작업에 대해 최소한의 액터 런타임과 팀 템플릿(RoundRobin 또는 Selector)을 함께 생성합니다.
연습문제
- (쉬움) 사후 보관 큐(dead-letter queue; DLQ)를 추가하세요. 처리기가 예외를 내면 실패한 메시지를 사람 검사용으로 보관합니다. 예제 코드에서 DLQ는 얼마나 자주 채워지나요?
- (중간)
SelectorGroupChat을 구현하세요. 선택자(selector) 액터가 대화 상태를 바탕으로 다음 메시지를 누가 처리할지 고릅니다.
- (중간) 분산 전송 계층을 추가하세요. 같은 프로세스 안의 큐를 JSON-over-HTTP 서버로 바꿔서 액터가 별도 프로세스에서 실행되도록 합니다.
- (어려움) 메시지마다 OTel 스팬을 연결하거나, 없으면 동작만 하는 빈 구현(no-op)으로 대체하세요. 23강에 맞춰
gen_ai.agent.name, gen_ai.operation.name을 내보냅니다.
- (어려움) AutoGen v0.4의 아키텍처 글(architecture post)을 읽어보세요. 이 예제를 실제
autogen_core API로 이식해 보고, 프로덕션에서 중요한데 빠뜨린 것은 무엇이었는지 정리합니다.
핵심 용어
| 용어 | 흔한 설명 | 실제 의미 |
|---|
| 액터(Actor) | "에이전트" | 비공개 상태 + 받은편지함(inbox) + 처리기(handler). 공유 메모리는 없습니다. |
| 메시지(Message) | "이벤트(Event)" | 타입이 정해진 페이로드(typed payload). 액터가 상호작용하는 유일한 방법입니다. |
| 받은편지함(Inbox) | "메일박스(Mailbox)" | 액터별로 대기 중인 메시지를 담아 두는 큐입니다. |
| 런타임(Runtime) | "에이전트 호스트(agent host)" | 메시지를 라우팅하고 실패를 격리하는 이벤트 루프(event loop)입니다. |
| 토픽(Topic) | "채널(Channel)" | 액터 사이를 잇는 이름이 붙은 발행-구독(publish-subscribe) 경로입니다. |
| 장애 격리(Fault isolation) | "Let it crash" | 한 액터의 실패가 다른 액터를 함께 무너뜨리지 않습니다. |
| RoundRobinGroupChat | "고정 회전 팀" | 에이전트가 정해진 순서대로 차례를 가져갑니다. |
| SelectorGroupChat | "맥락 라우팅 팀" | 선택자(selector)가 다음 발화자를 고릅니다. |
| Magentic-One | "참조 팀(reference team)" | 웹 + 코드 + 파일을 다루는 멀티 에이전트 팀입니다. |
더 읽을거리