실무 Multi-Agent 오케스트레이션 22장 · 오케스트레이션 3 / 8 ← 이전목차다음 → TechLead Cro

22장. 오케스트레이션

무한 위임을 막는 두 겹 — 구조와 상한

한 줄 요약

에이전트가 여럿일 때 가장 주의할 문제는 서로 일을 넘기며 끝나지 않는 것입니다. 우리는 이것을 두 겹으로 막습니다. 구조로 전문 에이전트끼리 부를 길을 없애고, Supervisor의 실행 횟수에 상한을 둡니다.


1. 무엇이 문제인가

에이전트 A가 B에게 묻고, B가 다시 A에게 묻는 상황을 떠올려 봅니다. 둘 다 "내 일이 아니다"라고 판단하면 이 왕복은 끝나지 않습니다. 10장에서 본 무한 반복이 에이전트 사이에서 일어나는 것입니다. 왕복 한 번마다 LLM 호출 비용이 나가고, 고객은 답을 받지 못합니다.


2. 첫째 겹 — 구조: 부를 길이 없다

21장의 haru_agents.py에서 전문 에이전트가 가진 도구를 다시 봅니다.

에이전트 도구 목록 다른 에이전트를 부르는 도구
주문조회 get_my_orders, get_order_status, get_my_membership, search_products, check_stock 없음
정책안내 search_policy 없음
요청처리 change_shipping_address, request_exchange, request_refund, get_my_requests, get_my_orders, create_ticket 없음
Supervisor ask_order_agent, ask_policy_agent, ask_action_agent 셋 다

주문조회 에이전트가 정책안내 에이전트에게 묻고 싶어도 그럴 도구가 없습니다. 위임할 수 있는 것은 Supervisor뿐입니다. 거꾸로 Supervisor의 목록에는 조회 도구도 처리 도구도 없습니다. Supervisor는 배송지를 직접 바꿀 수 없고, 요청처리 에이전트에게 맡길 수만 있습니다. 가운데 하나에서 바깥으로만 선이 뻗는 이 모양을 별 모양 구조(star topology) 라고 부릅니다.

여기서 프롬프트로 막는 것과 구조로 막는 것의 차이를 분명히 해 둡니다.

막는 방법 예 성질
프롬프트 "다른 에이전트를 부르지 마시오" 모델이 어길 수 있다. 대부분 지키지만 보장은 아니다
구조 도구 목록에 넣지 않는다 어길 방법이 아예 없다

5장에서 "모델은 목록에 있는 도구만 부를 수 있다"고 했습니다. 이 원칙이 여기서는 에이전트 간의 관계를 정하는 수단이 됩니다.

하면 안 되는 일은 "하지 마라"고 쓰기 전에, 할 수 없게 만들 수 있는지부터 봅니다.


3. 둘째 겹 — 상한: recursion_limit

구조가 막아 주는 것은 전문 에이전트끼리의 순환입니다. Supervisor 자신이 같은 에이전트를 계속 다시 부르는 일은 구조로 막히지 않습니다. 그래서 실행 횟수에 상한을 겁니다.

result = supervisor.invoke(
    {"messages": messages},
    config={"recursion_limit": 12},
)

create_agent가 만든 에이전트는 속이 18장에서 본 그래프입니다. "모델이 판단하는 단계"와 "도구를 실행하는 단계"가 번갈아 돕니다. recursion_limit 은 이 단계를 최대 몇 번까지 밟을지 정하는 숫자입니다. 넘으면 GraphRecursionError라는 오류와 함께 멈춥니다.

설정 뜻
recursion_limit: 12 판단과 도구 실행을 합쳐 12단계까지. 위임으로는 대략 다섯 번 안팎
넘었을 때 GraphRecursionError 발생. 잡지 않으면 프로그램이 멈춘다

10장에서 직접 만든 max_steps와 같은 생각입니다. 이름과 세는 단위만 다릅니다.

세는 단위를 하나 짚어 둡니다. Supervisor 쪽에서 보면 위임 한 번은 도구 실행 한 단계입니다. 그 안에서 전문 에이전트가 자기 도구를 몇 번 쓰든 Supervisor의 단계 수는 하나만 늘어납니다.


4. 두 겹은 서로 다른 것을 막는다

겹 막는 것 어떻게
구조 전문 에이전트 ↔ 전문 에이전트 순환 도구 목록에 동료가 없다
상한 Supervisor가 위임을 지나치게 반복 recursion_limit에 닿으면 멈춘다

상한에 걸려 멈추는 것은 고장이 아니라 설계한 대로의 동작입니다. 다만 고객에게 오류 화면을 보여 줄 수는 없으니, 걸렸을 때 무엇을 할지도 정해야 합니다. 24장의 서버는 이 예외를 포함한 모든 예외를 잡아 "일시적인 오류가 발생했어요. 잠시 후 다시 시도해 주세요."라는 안내를 돌려줍니다. 이 장의 문의들은 위임이 한 번에서 네 번이라 상한 12에 닿지 않습니다.


핵심 정리

  • 여러 에이전트의 가장 큰 위험은 끝나지 않는 위임입니다.
  • 구조: 전문 에이전트의 도구 목록에는 다른 에이전트가 없습니다. 위임은 Supervisor만 합니다(별 모양 구조).
  • 프롬프트의 금지는 어길 수 있고, 도구 목록에 없는 것은 어길 수 없습니다.
  • 상한: recursion_limit이 Supervisor의 실행 단계 수를 제한합니다. 넘으면 GraphRecursionError.
  • 상한에 걸렸을 때 무엇을 할지까지 정해야 설계가 끝납니다.
← 이전 절에이전트를 도구로 — 위임은 도구 호출이다다음 절 →정확한 값은 코드가 보증한다 — 처리번호, 티켓번호, 빈 답변
오명운 · macro@prag-ai.com