이벤트(Event): Agent가 '외치기'를 배우게 하기 | FROST 5차원 원형 모델 시리즈
요약
FROST-SOP V2.0에서 도입된 이벤트 버스(Event Bus)를 통해 에이전트 간의 통신 방식을 설명합니다. 발행/구독(Pub/Sub) 패턴을 활용하여 에이전트 간 결합도를 낮추고, 에이전트의 생명주기와 작업 단계를 실시간으로 모니터링하는 구조를 다룹니다.
핵심 포인트
- 이벤트 버스를 통한 에이전트 간 디커플링 구현
- 발행/구독(Pub/Sub) 패턴을 이용한 비동기 통신
- 에이전트 생명주기 및 SOP 단계별 이벤트 자동 발행
- 실시간 모니터링 및 협업 가능한 에이전트 환경 구축
이벤트(Event): Agent가 "외치기"를 배우게 하기
FROST 5차원 원형 모델 시리즈 · 제 2편
"벙어리 Agent"에서 "외치는 Agent"로
지난 글에서는 무기(Weapon) — Agent의 기술 군수품 창고에 대해 다루었습니다.
하지만 기술만으로는 부족합니다. 모든 사람이 일을 할 줄 알지만, 아무도 말을 하지 않는 팀을 상상해 보세요:
- A가 일을 끝냈지만, B에게 알릴 방법을 모름
- B는 A가 일을 끝냈는지 몰라서 자기 할 일을 계속함
- C가 문제를 발견했지만, 사람을 불러 확인할 방법이 없음
- D가 임무를 완료했지만, 아무도 결과를 모름
이것은 팀이 아니라, 고립된 개체들의 집합입니다.
현재 대부분의 Agent 프레임워크가 이와 같습니다: 각 Agent는 그저 묵묵히 일만 할 뿐, 일이 끝나면 그것으로 끝입니다. 통보도, 방송도, 협업도 없습니다.
FROST의 해답은 바로 **이벤트(Event)**입니다.
이벤트 버스(Event Bus): Agent의 신경망
FROST-SOP V2.0에서는 **EventBus(이벤트 버스)**를 도입했습니다.
이벤트 버스는 Agent 가문의 신경망입니다. Agent는 서로를 직접 호출하는 대신, 이벤트를 발행/구독(Publish/Subscribe)함으로써 통신합니다.
from core.event_bus import get_event_bus, Event, EventType
# 글로벌 이벤트 버스 가져오기
...
이것이 바로 Agent가 "외치는" 방식입니다 — 누가 듣고 있는지 알 필요 없이, 그냥 외치기만 하면 됩니다.
이벤트 타입: Agent는 무엇을 외칠 수 있는가?
FROST는 명확한 이벤트 타입 체계를 정의합니다:
| 계층 | 이벤트 타입 | 의미 |
|---|---|---|
| 태스크(Task) | TASK_CREATED | 새로운 태스크가 생성됨 |
| ... |
명명 규칙은 <계층>_<동사>로 되어 있어 한눈에 이해할 수 있습니다.
발행/구독(Publish/Subscribe) 패턴: 듣고 싶은 사람은 손을 드세요
이벤트 버스의 핵심은 발행/구독(Publish/Subscribe) 패턴입니다:
- 발행자(Publisher): Agent가 어떤 일을 완료하고 외칩니다.
- 이벤트 버스(EventBus): 중간 매개자로서 전달을 담당합니다.
bus = get_event_bus()
# 리스너(Listener) 정의
...
디커플링(Decoupling, 결합도 낮추기)이 핵심입니다: 발행자는 누가 듣고 있는지 알 필요가 없고, 구독자는 누가 발행했는지 알 필요가 없습니다.
Agent 생명주기 이벤트: 탄생과 죽음
모든 Agent는 생명주기를 가집니다:
생성 (AGENT_CREATED) → 실행 (running) → 소멸 (AGENT_DESTROYED)
FROST-SOP V2.0은 Agent가 이 두 이벤트를 자동으로 발행하도록 합니다:
class Agent:
def __init__(self, name, event_driven=True):
self.name = name
...
이를 통해 Agent의 생명주기를 실시간으로 모니터링하는 것이 가능해집니다.
단계 완료 이벤트: SOP 실행의 이정표
Agent가 SOP를 실행할 때, 각 단계가 완료될 때마다 STEP_COMPLETED 이벤트를 발행합니다.
이를 통해 SOP 실행 진행 상황을 실시간으로 모니터링할 수 있습니다:
# 단계 완료 이벤트를 구독하는 모니터링 시스템
def on_step_completed(event: Event):
data = event.data
...
비동기 이벤트 버스: V3.0의 진화
FROST-SOP V3.0에서는 **AsyncEventBus(비동기 이벤트 버스)**를 도입했습니다:
from core.event_bus import get_async_event_bus, Event
async_bus = get_async_event_bus()
...
왜 비동기 버전이 필요한가요?
- V2.0 EventBus (동기): Streamlit UI 및 단순한 시나리오에 적합
- V3.0 AsyncEventBus: 비동기 작업 오케스트레이션(Orchestration)에 적합
이벤트 영속화(Persistence): 과거를 기록으로 남기기
이벤트는 실시간으로 분배될 뿐만 아니라, **데이터베이스에 영속화(Persistence)**됩니다:
db.insert("event_log", {
"event_id": event.event_id,
"event_type": event.event_type,
...
이는 감사 추적(Audit trail), 문제 해결(Troubleshooting), 성능 분석이 가능해짐을 의미합니다.
왜 "메시지"가 아니라 "이벤트"라고 부르는가?
전통적인 메시지 큐(Message Queue)에서 메시지는 데이터입니다 — 단순히 정보를 전달할 뿐입니다.
FROST의 이벤트는 **사실(Fact)**입니다 — 시스템에서 실제로 발생한 일을 나타냅니다.
AGENT_CREATED= 정말로 하나의 Agent가 탄생했습니다STEP_COMPLETED= 정말로 하나의 단계(Step)가 완료되었습니다TASK_FAILED= 정말로 하나의 작업(Task)이 실패했습니다
이벤트(Event)는 단순한 데이터가 아니라, **시스템의 기억(Memory)**입니다.
다음 단계: 작업 (Task)
무기(Weapon)가 "Agent가 무엇을 할 수 있는가"를 해결했다면, 이벤트(Event)는 "Agent들 사이에서 어떻게 통신하는가"를 해결했습니다.
그렇다면 누가 이 모든 것을 조직할까요?
다음 편 예고: 《작업 (Task): Agent가 협업하는 법을 배우게 하기》
관련 링크
- FROST 교육 프레임워크 (Teaching Framework): https://gitee.com/liao_liang_7514/frost
- FROST-SOP 엔지니어링 플랫폼 (Engineering Platform): https://gitee.com/liao_liang_7514/frost-sop
- 첫 번째 편 《무기 (Weapon)》: Agent가 "내가 무엇을 할 수 있는지" 알게 하기
FROST: Giving agents lineage, memory, and honor.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기