실무 Multi-Agent 오케스트레이션 19장 · 조건 분기와 라우팅 2 / 7 ← 이전목차다음 → TechLead Cro

19장. 조건 분기와 라우팅

조건부 엣지 — 갈림길을 만드는 문법

한 줄 요약

조건부 엣지(conditional edge) 는 "이 노드가 끝나면 함수에게 물어보고 다음 노드를 정한다"는 선언입니다. 그 함수는 상태를 받아 다음 노드의 이름을 돌려줍니다. LangGraph에서는 add_conditional_edges로 만듭니다.


1. 무조건 가는 길과 골라서 가는 길

18장에서 쓴 엣지는 한 종류였습니다.

builder.add_edge("classify", "answer")   # classify 가 끝나면 무조건 answer 로

조건부 엣지는 두 노드 사이에 함수 하나를 끼웁니다.

builder.add_conditional_edges("classify", route,
                              ["order", "policy", "human", "general"])
인자 뜻 이번 장에서는
첫째 출발 노드. 이 노드가 끝난 뒤에 갈림길이 나온다 "classify"
둘째 분기 함수. 상태를 받아 다음 노드 이름을 돌려준다 route
셋째 갈 수 있는 노드 목록 네 갈래의 이름

셋째 인자는 생략할 수도 있습니다. 다만 적어 두면 그래프 그림에 갈래가 빠짐없이 그려지고, 코드를 읽는 사람도 "여기서 갈 수 있는 곳은 이 넷뿐"임을 한눈에 압니다.


2. 분기 함수는 노드와 무엇이 다른가

분기 함수도 노드처럼 상태를 받습니다. 다른 것은 돌려주는 값입니다.

노드 함수 분기 함수
받는 것 상태 상태
돌려주는 것 바뀐 상태의 일부 (딕셔너리) 다음 노드의 이름 (문자열)
하는 일 일을 한다 (분류, 조회, 답변) 길만 고른다
상태를 바꾸는가 바꾼다 바꾸지 않는다

이번 장의 분기 함수입니다.

def route(state: CSState) -> str:
    """분기 기준 함수 — 상태를 보고 '다음 노드 이름'을 돌려준다."""
    return {
        "주문배송조회": "order",
        "환불교환": "policy",
        "멤버십적립금": "policy",  # 멤버십 규정도 정책 문서(RAG)에 답이 있다
        "상담원연결": "human",
        "계정결제": "human",       # 계정·결제도 사람 처리로 (수업 단순화)
    }.get(state["intent"], "general")

딕셔너리에서 state["intent"]에 해당하는 노드 이름을 찾고, 없으면 "general"을 돌려줍니다. 파이썬의 딕셔너리.get(키, 기본값) 그대로입니다. 이 함수 안에는 LLM 호출이 없습니다.

분기 함수는 네거리에 서 있는 안내원과 같습니다. 짐을 들어 주지도 문제를 풀어 주지도 않고, 손에 든 표를 보고 "3번 창구로 가세요"라고만 말합니다.


3. 그림에서는 점선으로 보인다

이번 장의 그래프를 그림으로 그리면 화살표 모양이 두 가지입니다.

19장의 네 갈래 그래프

화살표 뜻
실선 반드시 가는 길. add_edge로 만든 엣지
점선 갈 수도 있는 길. add_conditional_edges로 만든 엣지

classify에서 나가는 화살표 넷이 모두 점선입니다. 한 번 실행할 때 이 가운데 하나만 지나갑니다.


4. 갈라진 길은 다시 모인다

네 갈래는 각자 일을 마치고 모두 끝(END)으로 갑니다. 엣지 네 개를 반복문으로 만들었습니다.

for node in ("order", "policy", "human", "general"):
    builder.add_edge(node, END)

여기서 END는 18장에서 본 그 END입니다. 갈래 뒤에 공통으로 할 일(예: 상담 기록 저장)이 있다면 END 대신 그 노드 이름을 적으면 네 갈래가 그 노드에서 다시 모입니다.


5. 엣지는 뒤로도 갈 수 있다

엣지가 꼭 앞으로만 가야 하는 것은 아닙니다. 뒤의 노드에서 앞의 노드로 돌아가는 엣지를 루프백(loop-back) 이라고 합니다. 분기 함수가 "결과가 부족하면 검색 노드로 되돌아가고, 충분하면 END로 간다"처럼 돌려주면 됩니다.

9장에서 while로 만들었던 반복이 그래프에서는 뒤로 가는 엣지로 표현됩니다. 이번 장의 그래프는 루프백 없이 한 방향으로만 갑니다. 이름만 알아 둡니다.


핵심 정리

  • 조건부 엣지는 add_conditional_edges(출발 노드, 분기 함수, 갈 수 있는 노드 목록)으로 만듭니다.
  • 분기 함수는 상태를 받아 다음 노드의 이름(문자열) 을 돌려줍니다. 상태를 바꾸지 않습니다.
  • 그래프 그림에서 조건부 엣지는 점선으로 그립니다.
  • 갈라진 길은 add_edge로 다시 모을 수 있습니다.
  • 뒤로 가는 엣지를 루프백이라고 하며, 반복을 그래프로 표현하는 방법입니다.
← 이전 절왜 조건 분기가 필요한가 — 문의마다 가야 할 길이 다르다다음 절 →판단은 모델, 길 안내는 코드 — 라우터를 둘로 나눈다
오명운 · macro@prag-ai.com