PART 12 · 강의 2/5

Agent 통신 패턴

Agent 간 효과적인 정보 교환 방법

01

주요 통신 패턴

Agent 간 메시지 교환 방식

멀티에이전트 시스템에서 Agent 간 통신 방식은 시스템의 효율성과 확장성에 큰 영향을 미칩니다.

Direct Messaging
1:1 직접 통신
Agent A <--> Agent B

Agent가 특정 Agent에게 직접 메시지를 전송합니다. 가장 단순한 통신 방식.

+ 단순함, 빠른 응답, 명확한 흐름

- 확장성 제한, 결합도 높음

Broadcast
1:N 전체 전송
Agent A --> [Agent B, C, D, ...]

하나의 Agent가 모든 Agent에게 메시지를 전송합니다. 공지나 상태 변경 알림에 적합.

+ 동시 알림, 간단한 구현

- 네트워크 부하, 불필요한 수신

Publish-Subscribe
토픽 기반 구독
Publisher --> [Topic] --> Subscribers

Agent가 관심 있는 토픽을 구독하고, 해당 토픽의 메시지만 수신합니다.

+ 느슨한 결합, 확장성, 효율적

- 복잡한 설정, 메시지 순서 보장 어려움

Request-Response
요청-응답 패턴
Request --> Agent --> Response

동기적 통신. 요청을 보내고 응답을 기다립니다. RPC 스타일.

+ 직관적, 디버깅 용이

- 블로킹, 병렬 처리 어려움

Blackboard
공유 메모리
Agents <--> [Shared Blackboard] <--> Agents

모든 Agent가 공유 공간(블랙보드)에 정보를 읽고 씁니다.

+ 전역 상태 공유, 느슨한 결합

- 동시성 관리, 병목 가능성

Message Queue
비동기 큐 기반
Producer --> [Queue] --> Consumer

메시지를 큐에 넣고 Consumer가 순차적으로 처리합니다.

+ 비동기, 부하 분산, 신뢰성

- 인프라 복잡성, 지연 가능

02

메시지 형식

표준화된 메시지 구조

Agent 간 교환되는 메시지는 표준화된 형식을 따르는 것이 좋습니다.

Supervisor Agent
"ResearchAgent에게: 'AI 에이전트 최신 트렌드'에 대해 조사해주세요. 결과는 JSON 형식으로 반환해주세요."
Research Agent
"조사 완료. 주요 트렌드 5가지를 정리했습니다: 1. Multi-Agent Systems... 2. Agentic RAG..."
Supervisor Agent
"WriterAgent에게: ResearchAgent의 조사 결과를 바탕으로 블로그 포스트를 작성해주세요."

구조화된 메시지 예시

Python (Message Schema)
from pydantic import BaseModel
from typing import Optional, Any
from datetime import datetime

class AgentMessage(BaseModel):
    # 메시지 식별
    message_id: str
    timestamp: datetime

    # 발신/수신 정보
    sender: str          # 발신 Agent ID
    receiver: str        # 수신 Agent ID (또는 "broadcast")

    # 메시지 유형
    msg_type: str        # "request", "response", "event", "error"

    # 내용
    content: str         # 자연어 메시지
    data: Optional[Any]  # 구조화된 데이터

    # 메타데이터
    correlation_id: Optional[str]  # 관련 메시지 추적용
    priority: int = 0               # 우선순위
03

상태 공유 방법

Agent 간 공통 상태 관리

멀티에이전트 시스템에서 Agent들은 공통 상태를 공유해야 하는 경우가 많습니다.

01
Shared State Object
모든 Agent가 동일한 상태 객체를 참조. LangGraph의 StateGraph 패턴. 단순하지만 동시성 주의 필요.
02
Message Passing
상태를 메시지로 전달. 각 Agent가 필요한 정보만 수신. 느슨한 결합, 하지만 오버헤드 있음.
03
External Database
Redis, PostgreSQL 등 외부 DB에 상태 저장. 영속성, 확장성 확보. 네트워크 지연 고려.
04
Event Sourcing
상태 변경을 이벤트로 기록. 전체 히스토리 추적 가능. 복잡하지만 강력한 감사 기능.

LangGraph State 예시

Python
from langgraph.graph import StateGraph
from typing import TypedDict, Annotated
import operator

# 공유 상태 정의
class TeamState(TypedDict):
    # 메시지 히스토리 (append-only)
    messages: Annotated[list, operator.add]

    # 현재 작업 상태
    current_task: str
    task_status: str

    # 결과물
    research_result: str
    draft: str
    final_output: str

    # 다음 실행할 Agent
    next_agent: str

# 각 Agent는 state를 읽고 업데이트된 부분만 반환
def researcher(state: TeamState) -> TeamState:
    result = do_research(state["current_task"])
    return {
        "research_result": result,
        "messages": [{"agent": "researcher", "content": result}]
    }
04

통신 패턴 비교

상황별 적합한 패턴 선택

패턴 동기/비동기 결합도 확장성 적합한 경우
Direct Messaging 동기 높음 낮음 소규모, 단순 협업
Broadcast 비동기 낮음 중간 상태 변경 알림
Pub-Sub 비동기 낮음 높음 대규모, 이벤트 기반
Request-Response 동기 중간 중간 RPC 스타일 호출
Blackboard 비동기 낮음 중간 협업 문제 해결
Message Queue 비동기 낮음 높음 워크로드 분산, 신뢰성
💡 실전 팁

대부분의 멀티에이전트 프레임워크(AutoGen, CrewAI)는 내부적으로 Direct Messaging이나 Blackboard 패턴을 사용합니다. 시스템이 커지면 Pub-Sub이나 Message Queue로 전환을 고려하세요.

REF

참고 자료

SUMMARY

핵심 요약

  • 통신 패턴: Direct, Broadcast, Pub-Sub, Request-Response, Blackboard, Message Queue
  • 메시지 형식: 표준화된 스키마로 일관된 통신 보장
  • 상태 공유: Shared Object, Message Passing, External DB, Event Sourcing
  • 패턴 선택: 시스템 규모, 결합도, 확장성 요구사항 고려
  • 대부분의 프레임워크는 Direct Messaging이나 Blackboard 패턴 사용