토픽·구독 브로드캐스팅 시나리오

토픽·구독 브로드캐스팅 시나리오 (Topic and Subscription Example Scenarios)

AutoGen에서 에이전트 간 통신은 토픽(topic)이라는 방송 채널을 통해 이뤄져요. 그런데 "토픽을 어떻게 설계하느냐"에 따라 같은 메시지가 모든 에이전트에게 갈 수도, 일부에게만 갈 수도 있어요. 이 쿡북은 브로드캐스팅이 네 가지 시나리오에서 어떻게 달라지는지 보여줘요. 공통 예시로 세무 관리 회사가 고객 요청을 처리하는 상황을 사용할게요.

출처: Topic and Subscription Example Scenarios — AutoGen 공식 문서

시나리오 개요

세무 관리 회사는 세금 계획(planning), 분쟁 해결(dispute resolution), 컴플라이언스(compliance), 신고 준비(preparation) 등 다양한 서비스를 제공해요. 회사에는 각 분야 전문가인 세무 전문가들(TaxSpecialist)과, 운영을 총괄하는 세무 시스템 매니저가 있어요. 고객의 요청은 적절한 전문가가 처리하는데, 이 과정에서 고객-매니저-전문가 간 통신이 브로드캐스팅으로 이뤄져요.

다룰 브로드캐스팅 시나리오는 네 가지예요.

  1. 단일 테넌트, 단일 퍼블리싱 범위 (Single-Tenant, Single Scope of Publishing)
  2. 멀티 테넌트, 단일 퍼블리싱 범위 (Multi-Tenant, Single Scope of Publishing)
  3. 단일 테넌트, 다중 퍼블리싱 범위 (Single-Tenant, Multiple Scopes of Publishing)
  4. 멀티 테넌트, 다중 퍼블리싱 범위 (Multi-Tenant, Multiple Scopes of Publishing)

각 시나리오는 메시지 분배와 에이전트 상호작용에 서로 다른 접근을 취해요. 이를 이해하면 애플리케이션 요구사항에 가장 잘 맞는 통신 전략을 설계할 수 있어요.

1. 단일 테넌트 · 단일 퍼블리싱 범위

  • 모든 에이전트가 단일 테넌트(예: 한 고객·사용자 세션) 안에서 동작해요.
  • 메시지는 단일 토픽에 게시되고, 모든 에이전트가 그 토픽을 구독해요.
  • 모든 에이전트가 토픽에 게시된 모든 메시지를 받아요.

세무 회사에서는 모든 세무 전문가가 모든 고객 요청과 내부 메시지를 받는 상황이에요. 모든 에이전트가 모든 메시지를 알아야 할 때 적합하죠.

  • 구독: 모든 에이전트가 기본 구독(default subscription, 예: "default")을 사용
  • 퍼블리싱: 메시지를 기본 토픽으로 게시
  • 메시지 처리: 각 에이전트가 내용과 핸들러에 따라 처리 여부를 결정

장점은 단순하고 투명하다는 점, 고려사항은 에이전트·메시지가 많아지면 확장이 어렵고 불필요한 메시지를 많이 받을 수 있다는 점이에요.

# 런타임 생성
runtime = SingleThreadedAgentRuntime()
# ... 전문가 에이전트 등록 및 기본 구독 추가 ...
runtime.start()
await runtime.publish_message(ClientRequest("I need to have my tax for 2024 prepared."), topic_id=DefaultTopicId())
await runtime.stop_when_idle()

default 토픽에 게시한 세금 준비 요청 하나가 등록된 모든 전문가(TaxSpecialist_1, TaxSpecialist_2)에게 전달·출력되는 걸 볼 수 있어요.

2. 멀티 테넌트 · 단일 퍼블리싱 범위

  • 여러 테넌트(여러 고객·사용자 세션)가 존재해요.
  • 각 테넌트는 토픽 소스(topic source)를 통해 고유한 격리된 토픽을 가져요.
  • 테넌트 내 모든 에이전트가 그 테넌트의 토픽을 구독하고, 필요하면 테넌트마다 새 에이전트 인스턴스를 만들어요.
  • 메시지는 같은 테넌트 안의 에이전트에게만 보여요.

회사가 여러 고객(테넌트)을 동시에 서빙하는 상황이에요. 고객별로 전용 에이전트 인스턴스 집합을 만들고, 각 고객의 통신은 서로 격리돼요.

장점은 테넌트 격리(데이터 프라이버시·분리)와 테넌트 내 협업이 가능하다는 점, 고려사항은 여러 에이전트·토픽 세트를 관리해야 해 복잡해지고 리소스가 더 든다는 점이에요.

tenants = ["ClientABC", "ClientXYZ"]
# ... 
for tenant in tenants:
    topic_source = tenant  # 토픽 소스는 고객 이름
    topic_id = DefaultTopicId(source=topic_source)
    await runtime.publish_message(ClientRequest(f"{tenant} requires tax services."), topic_id=topic_id)

ClientABC와 ClientXYZ 각각의 고유 토픽으로 요청이 게시되고, 각 테넌트의 전용 전문가들만 자기 요청을 처리하는 걸 볼 수 있어요.

3. 단일 테넌트 · 다중 퍼블리싱 범위

  • 모든 에이전트가 단일 테넌트 안에서 동작해요.
  • 메시지는 서로 다른 토픽들에 게시돼요.
  • 에이전트는 자신의 역할·전문 분야에 해당하는 특정 토픽만 구독해요.
  • 메시지는 토픽에 기반해 일부 에이전트에게만 전달돼요.

세무 회사에서는 세무 시스템 매니저가 전문 분야에 따라 특정 전문가들과 통신해요. 예를 들어 "planning", "compliance" 같은 토픽이 각 전문 분야를 나타내고, 전문가는 자신의 분야 토픽만 구독해요.

장점은 메시지가 관련 에이전트에게만 도달해 처리 효율이 높아진다는 점, 고려사항은 토픽·구독 관리가 필요해 설정이 복잡해지고 시나리오 변경 시 구독을 갱신해야 한다는 점이에요.

4. 멀티 테넌트 · 다중 퍼블리싱 범위

  • 여러 테넌트가 있고, 각 테넌트는 자신만의 에이전트 집합을 가져요.
  • 각 테넌트 내에서 메시지가 여러 토픽에 게시돼요.
  • 에이전트는 자신의 역할에 해당하는 테넌트 특정 토픽을 구독해요.
  • 테넌트 격리와 대상 지정 통신을 결합해요.

예를 들어 Client A의 planning 전문가는 소스가 "ClientA"인 "planning" 토픽을 구독하죠. 각 고객의 세무 매니저는 테넌트 특정 토픽으로 자기 전문가들과 통신해요.

장점은 완전한 격리와 정밀한 메시지 라우팅이라는 점, 고려사항은 토픽·테넌트·구독을 꼼꼼히 관리해야 해 복잡하고 에이전트 인스턴스·토픽 증가로 리소스 영향이 있다는 점이에요.

for tenant in tenants:
    for specialty in TaxSpecialty:
        topic_id = TopicId(type=f"{tenant}_{specialty.value}", source=tenant)
        await runtime.publish_message(ClientRequest(f"{tenant} needs assistance with {specialty.value} taxes."), topic_id=topic_id)

정리

네 시나리오는 결국 누가 메시지를 받아야 하는가를 테넌트(격리 수준)와 토픽(대상 지정 수준) 두 축으로 조절하는 방법이에요. 단순한 전역 브로드캐스트부터, 테넌트+전문 분야까지 촘촘히 라우팅하는 정밀 제어까지, 요구사항에 맞춰 토픽 구조를 선택하면 돼요.

더 알아보기 (Learn more)