Mixture of Agents 패턴
Mixture of Agents 패턴 (성능 최적화)
여러 에이전트에게 같은 문제를 시키면 답이 더 정확해질까요? 이 아이디어를 체계적으로 구현한 패턴이 바로 **Mixture of Agents(MoA)**에요. 이 패턴은 피드포워드 신경망(forward-feed neural network) 구조를 본떠 만들어졌어요. 하나의 태스크를 여러 층(layer)으로 나눈 워커 에이전트들이 순차적으로 처리하면서, 앞 층의 결과를 모아 다음 층에 넘겨 점점 더 정교한 답을 만들어 내는 방식이죠.
패턴의 구조
MoA 패턴은 두 종류의 에이전트로 구성돼요.
- 워커 에이전트(worker agents): 여러 개의 층으로 조직되고, 각 층은 고정된 수의 워커로 이뤄져요.
- 오케스트레이터 에이전트(orchestrator agent): 단 하나 존재하며, 작업을 워커들에게 분배하고 결과를 종합해요.
이전 층의 워커들이 만들어낸 메시지는 모두 이어 붙여져(concatenate) 다음 층의 모든 워커에게 전달돼요. 이 예제는 multi-layer mixture of agents의 원래 구현을 core 라이브러리로 구현한 거예요.
동작 과정 (high-level)
- 오케스트레이터 에이전트가 사용자 태스크를 입력받아 첫 번째 층의 워커 에이전트들에게 분배해요.
- 첫 번째 층의 워커들이 태스크를 처리하고, 결과를 오케스트레이터에게 돌려줘요.
- 오케스트레이터는 첫 번째 층의 결과를 종합해, 이전 결과가 포함된 업데이트된 태스크를 두 번째 층의 워커들에게 분배해요.
- 마지막 층에 도달할 때까지 이 과정을 반복해요.
- 마지막 층에서 오케스트레이터가 이전 층의 결과를 취합해, 사용자에게 단일 최종 결과를 반환해요.
이 패턴은 직접 메시징 API(BaseAgent.send_message)로 구현돼요. 이 방식은 나중에 워커 태스크 취소나 오류 처리 같은 기능을 추가하기에 훨씬 수월해요.
메시지 프로토콜
에이전트들은 몇 가지 정해진 메시지 타입으로 통신해요. 워커는 오케스트레이터로부터 태스크를 받아 독립적으로 처리하고, 끝나면 결과를 돌려주죠.
러닝 예제 (수학 태스크)
3개 층, 각 층마다 3개의 워커 에이전트를 두는 런타임을 구성해 봐요. 모든 워커가 같은 모델 클라이언트 설정(gpt-4o-mini)을 쓰기 때문에, 워커 에이전트 타입은 "worker" 하나만 등록하면 돼요.
from autogen_core import AgentId, ClosureContext, MessageContext, RoutedAgent, SingleThreadedAgentRuntime, default_subscription, message_handler
# ... (오케스트레이터/워커 정의 생략)
만약 워커마다 서로 다른 모델을 쓰고 싶다면, 모델별로 워커 에이전트 타입을 따로 등록하고 오케스트레이터 팩토리의 worker_agent_types 리스트를 갱신하면 돼요. 워커 에이전트의 인스턴스는 오케스트레이터가 태스크를 분배할 때 자동으로 생성돼요. 이 동작은 에이전트 생명주기의 일부예요.
태스크는 수학 문제로 바꿔 더 어렵게 만들 수 있어요. 예를 들어 국제수학올림피아드(IMO)의 문제를 사용해 볼 수 있죠.