day6_practice/supervisor_assembled.pyhierarchical_demo.pynetwork_demo.pyapi_server.py

멀티 에이전트 세 구조 플레이어

같은 부품(이름 붙은 에이전트와 handoff 도구)으로 만든 Supervisor, 계층(Hierarchical), Network(Swarm) 세 구조를 나란히 놓고, 각 파일이 실제로 던지는 질문이 어떤 경로로 흐르는지 탭을 바꿔 가며 넘겨 봅니다. 차이는 누가 다음 차례를 정하는가와 일을 마친 에이전트가 어디로 돌아가는가에 있습니다.

한눈에 보는 세 구조

SSupervisor

supervisor data_agent research_agent general_agent 관리자 한 명이 배분하고 종합
다음 차례
관리자 한 명
끝나면
항상 관리자에게 복귀
다음 질문
매번 관리자부터

HHierarchical

top research_team analysis_team research data analyst report 관리자 위에 관리자 (맨 아래 이름은 끝의 _agent 생략)
다음 차례
층마다의 관리자
끝나면
팀 Lead 에게, 다시 그 위로
다음 질문
매번 최상위 관리자부터

NNetwork (Swarm)

reception it_agent hr_agent 관리자 없이 담당끼리 넘김 checkpointer 가 active_agent 를 기억
다음 차례
지금 일하는 에이전트
끝나면
그 자리에서 종료
다음 질문
직전에 일한 에이전트부터

START supervisortransfer_to_* 3개 + 프롬프트 END data_agent조회 도구 4개 research_agentretrieve_docs general_agent도구 없음 직접 답하면 선마다 handoff(아래로)와 고정 간선 복귀(위로)가 오갑니다 START top회사 전체 Supervisor END research_team조회팀 Lead (Supervisor) analysis_team분석팀 Lead (Supervisor) research_agentretrieve_docs data_agentsearch_db analyst_agentanalyze report_agentwrite_report transfer_to_research_team transfer_to_analysis_team 선마다 handoff 와 복귀가 오가고, 층을 오를 때마다 마지막 메시지만 올라갑니다 START START 분기active_agent 확인 active_agent = (없음) receptionto_it, to_hr it_agentreset_vpn, to_hr hr_agent연차·재택 도구 2개, to_it to_it to_hr to_it to_hr 넘기지 않고 답하면 그 자리에서 END

터미널 출력

모델이 쓴 글은 (예시)

세 탭의 경로를 나란히

세 파일은 질문도 에이전트도 다르지만, 모두 '사내 데이터나 인사 정보를 묻는 질문 하나'가 들어와 담당에게 넘어가는 같은 성격의 흐름입니다. 모델의 판단에 따라 실제 경로는 달라질 수 있으므로 아래는 코드와 프롬프트가 의도한 경로입니다.

구조파일의 질문의도한 경로바깥 대화에 남는 것
Supervisor클라우드운영팀 자산 목록 알려줘supervisor → data_agent → supervisor → END서브 에이전트의 마지막 답 + 복귀 메시지 한 쌍. 안쪽 도구 호출은 버려짐
Hierarchical클라우드운영팀 GPU 자산을 조회해서 분석하고 보고서로 만들어줘top → research_team(Lead → data_agent → Lead) → top → analysis_team(Lead → analyst_agent → Lead → report_agent → Lead) → top → END층마다 마지막 메시지만. 최상위에는 팀 Lead 의 요약이 닿음
Network이PC 사원의 네트워크 방화벽신청할때 담당자 연차는 몇개야?(START 분기) → reception → 넘겨받은 담당 → 거기서 END. 이 질문은 두 담당에 걸쳐 있어 갈래가 생김모든 에이전트의 메시지가 그대로. 걸러 내는 단계가 없음

세 구조 비교

견줄 점SupervisorHierarchicalNetwork (Swarm)
만드는 함수create_supervisorcreate_supervisor 를 겹쳐 쓰고 팀은 compile(name=...)create_swarm + create_handoff_tool
다음 차례를 정하는 주체관리자 한 명층마다의 관리자지금 일하고 있는 에이전트
handoff 도구를 가진 쪽관리자만 (자동 생성)각 층의 관리자 (자동 생성)모든 에이전트 (직접 만들어 넣음)
배분 기준이 적힌 곳관리자의 프롬프트 한 곳층별 관리자의 프롬프트handoff 도구의 설명글과 각 에이전트의 프롬프트
에이전트가 일을 마치면항상 관리자에게 복귀자기 팀 Lead에게, 다시 그 위로 복귀넘기지 않으면 그 자리에서 종료. 그 에이전트가 active_agent 로 남음
에이전트끼리 직접 연결없음없음있음
여러 결과의 종합관리자가 마지막에 종합층마다 종합종합하는 주체가 따로 없음
다음 질문의 출발점매번 관리자매번 최상위 관리자직전에 일한 에이전트 (체크포인터 필요)
모델 호출 수배분과 종합만큼 추가층마다 추가. 가장 많음관리자의 배분·종합 호출이 없음. 접수 담당이 처음 넘기는 호출은 듭니다
조심할 점관리자가 빈칸을 지어내거나 동시 handoff 를 시도느리고 비싸며, 층을 오를 때마다 정보가 요약됨복합 요구에 약하고, 누가 무엇을 했는지 추적하기 어려움

언제 어느 구조를 고르나

에이전트 하나로 충분한 경우

도구가 서너 개이고 성격이 같으며, 같은 질문에 도구 선택이 흔들리지 않는다면 나누지 않습니다. 나누는 순간 배분과 종합의 모델 호출이 붙습니다.

Supervisor

한 질문이 여러 담당에 걸치고, 결과를 하나의 답으로 종합해야 할 때의 기본 선택입니다. 흐름이 한곳을 지나므로 기록하고 검증하기 쉽습니다.

Hierarchical

서브 에이전트가 많아져 관리자 한 명의 배분 기준이 길어지고 배분 자체가 흔들릴 때 씁니다. 만능 에이전트를 나눈 것과 같은 이유로 관리자를 나누는 것입니다.

Network (Swarm)

상담 창구처럼 한 번에 한 담당과 길게 대화하고, 주제가 바뀔 때만 다른 담당으로 넘어가는 서비스에 어울립니다. 여러 담당의 결과를 합쳐야 하는 요청에는 맞지 않습니다.

바깥으로 내보내기: api_server.py

  1. 서버가 뜰 때 한 번만 조립 lifespan 의 yield 앞에서 await build_app() 으로 final_scenario 의 그래프를 만들어 전역 graph_app 에 담습니다. 요청마다 MCP 서버에 접속하고 Supervisor 를 조립하지 않기 위해서입니다.
  2. POST /chat 요청 본문을 Query(Pydantic, question 하나)로 검사하고, ainvoke 로 그래프를 끝까지 실행한 뒤 마지막 메시지의 글만 {"answer": ...} 로 돌려줍니다.
실습용 최소 구현
체크포인터와 thread_id 가 없어 요청마다 새 대화입니다.
모든 모델 호출이 끝나야 응답이 나가고, 인증·시간 제한·오류 처리가 없습니다.
from final_scenario import ... 가 그 파일 맨 바깥 코드를 함께 실행하고
경로가 상대 경로라 day6_practice 폴더에서 띄워야 합니다.

함정과 주의

관련 파일