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. - 상한에 걸렸을 때 무엇을 할지까지 정해야 설계가 끝납니다.