도구 8개를 한 에이전트에 몰아줄 때의 혼동에서 출발해, 누구에게 보낼지만 떼어 본 라우터를 거쳐, create_supervisor 가 그 결정을 handoff 도구 호출로 바꾸는 과정까지 따라갑니다. 질문 "클라우드운영팀 임직원 명단 알려줘" 하나가 Supervisor → data_agent → Supervisor 로 오가는 동안 messages 가 어떻게 쌓이는지 단계별로 넘겨 보세요.
설명글이 닮은 조회 도구 4개가 한 목록에 섞여 있습니다. 같은 질문을 5번 던져 도구 선택이 흔들리는지 잽니다.
답이 정해진 이름 가운데 하나여야 하므로 Literal 로 묶은 구조화 출력으로 받습니다. 에이전트는 아직 없습니다.
Supervisor 는 transfer_to_data_agent 같은 도구를 '호출'하는 것으로 일을 넘기고, 서브 에이전트는 마지막 답과 복귀 메시지 한 쌍을 들고 돌아옵니다.
| 견줄 점 | handoff (create_supervisor) | 에이전트를 도구로 (ask_research) |
|---|---|---|
| 넘기는 쪽이 보내는 것 | 인자 없는 도구 호출 하나. 무엇을 하라는 지시문은 없습니다 | 모델이 question 인자에 직접 쓴 질문 한 문장 |
| 받는 쪽이 읽는 것 | 그때까지의 대화 전체(사용자 질문, Supervisor 의 도구 호출, 이동 완료 메시지) | HumanMessage(question) 하나 |
| 실행 주도권 | 서브 에이전트 노드로 옮겨 가고, 끝나면 고정 간선으로 Supervisor 에 돌아옴 | 부르는 쪽 에이전트가 계속 쥐고 있음. 도구 하나가 끝나기를 기다릴 뿐 |
| 돌아오는 것 | 마지막 메시지 + 복귀 메시지 한 쌍 (output_mode="last_message" 기본값) | 마지막 메시지의 글만 담은 문자열 (get_text(r["messages"][-1])) |
| 이 파일에서 | 61줄에서 컴파일해 80~81줄에서 실제로 실행 | 83~88줄에 정의만 있고 어디에도 연결돼 있지 않음 |
create_supervisor 가 만드는 도구의 설명은 기본값 Ask agent 'data_agent' for help 꼴입니다. Supervisor 의 모델이 누가 무엇을 맡는지 알 수 있는 곳은 에이전트 이름과 54~59줄의 프롬프트뿐입니다. 배분 기준을 질문에 나올 명사로 적는 이유입니다.create_supervisor 는 모델의 bind_tools 가 parallel_tool_calls 인자를 받을 때만 그 값을 False 로 넘깁니다. 설치된 ChatBedrockConverse.bind_tools 에는 그 인자가 없으므로, Supervisor 가 두 에이전트의 handoff 도구를 한꺼번에 부를 수 있습니다. 복합 질문에서 드러나는 문제이며 6일차 원고의 검증 절에서 다룹니다.output_mode="last_message" 때문에 list_team_members 호출과 결과는 바깥 대화에 남지 않습니다. 보고가 틀려도 대조할 근거가 없으므로, 필요하면 output_mode="full_history" 를 주되 Supervisor 입력 토큰이 늘어나는 것을 감수해야 합니다.system_prompt 만 붙습니다. 담당 밖 요구가 섞인 질문을 받았을 때 어떻게 할지가 서브 에이전트 프롬프트에 있어야 하는 이유입니다(이 파일의 두 프롬프트에는 아직 그 문장이 없습니다).GraphRecursionError 를 잡지 않습니다. 68줄의 recursion_limit=25 는 넘기고 돌아오는 고리가 끝나지 않을 때를 위한 상한입니다. 한도에 걸리면 오류가 그대로 올라와 프로그램이 멈춥니다.temperature 를 지정하지 않았고, 다섯 번 모두 같은 도구가 나올 수도 있습니다. 같은 입력을 여러 번 넣어 선택이 일정한지 세어 보는 방법 자체가 이 파일의 요점입니다.day6_practice/single_agent_problem.py도구 8개를 든 에이전트에 같은 질문을 5번 던져 고른 도구 이름을 찍습니다. 도구는 모두 고정 문자열을 돌려주는 더미입니다.day6_practice/router_only.py질문 3개를 Route 구조화 출력으로 분류해 라우팅 결정만 관찰합니다. 에이전트도 그래프도 없습니다.day6_practice/two_agent_supervisor.py서브 에이전트 2개와 create_supervisor 로 만든 최소 Supervisor. 질문 2개를 stream_mode="updates" 로 실행하고, 끝에 연결되지 않은 ask_research 도구가 있습니다.