Agentic AI Design Patterns

CH02-입력에 따라 길을 나눠라 — 라우팅(Routing) 패턴 완벽 정리

빌드 피벗(Build Pivot) 2026. 5. 31. 18:10
반응형
AGENTIC AI DESIGN PATTERNS · 02
입력에 따라 길을 나눠라 — 라우팅(Routing) 완벽 정리
조건 분기의 정의부터 규칙·임베딩·LLM 구현, 4개 프레임워크, 하이브리드 3계층, CRM·ERP·Groupware 적용까지
🟢 입문~중급⏱️ 약 15분🧩 RunnableBranch·LangGraph·ADK·Semantic🏢 엔터프라이즈

TL;DR — 라우팅은 입력을 분석해 적절한 처리 경로(에이전트·도구·워크플로우)로 동적 분기시키는 패턴입니다. 모든 입력이 같은 경로를 타는 체이닝과 달리, 하나의 분류 단계가 전문 핸들러로 보냅니다. 실무에선 규칙→임베딩→LLM 하이브리드 3계층이 정석이며, 응답 시간 87%↓·정확도 95%·잘못된 배정 80%↓를 달성합니다.

1. 왜 라우팅인가 — 체이닝만으로는 부족하다

프롬프트 체이닝(1편)은 모든 입력을 같은 순서로 처리합니다. 하지만 현실의 요청은 제각각입니다. “환불해줘”, “사용법 알려줘”, “오류가 나요”를 같은 파이프라인에 넣으면 비효율적이고 정확도가 떨어집니다.

라우팅은 입력을 먼저 분류해서 각기 다른 전문 경로로 보냅니다. 요청 유형이 3가지 이상이면 도입을 고려하고, 5가지 이상이면 사실상 필수입니다.

체이닝 — 모든 입력이 같은 경로
입력
 
ABC
입력 종류와 무관하게 A→B→C 고정 (선형)
라우팅 — 입력에 따라 경로 분기
입력
 
Router
분류
환불 처리
기술 지원
일반 문의
하나의 분류 단계가 적합한 전문 경로로 보냄
그림 1. 선형 체이닝 vs. 조건 라우팅 — 입력에 따라 경로가 갈린다

2. 라우팅이란

라우팅(Routing)은 입력을 분석하여 적절한 처리 경로로 동적으로 분배하는 의사결정 패턴입니다. 체이닝이 선형 흐름(A→B→C)이라면, 라우팅은 분기 흐름(A→B₁ | B₂ | B₃)으로 런타임에 경로를 결정합니다.

라우팅의 4대 핵심 가치

  • 적응성(Adaptability) — 입력 특성에 따라 경로를 동적으로 결정
  • 효율성(Efficiency) — 전문화된 에이전트/핸들러에 분배해 처리 품질↑
  • 확장성(Scalability) — 새 경로 추가 시 기존 경로 영향 최소
  • 견고성(Robustness) — 분류 실패 시 Fallback으로 안전하게 처리

라우팅이 일어나는 4가지 시점

  • Entry Routing — 최초 요청 분류 (가장 흔함)
  • Intermediate Routing — 처리 중 다음 단계 결정
  • Tool Selection — 작업에 맞는 도구 선택
  • Escalation Routing — 상위 레벨/사람으로 에스컬레이션

3. 라우터의 동작 — 분류 · 신뢰도 · Fallback

라우터는 입력을 받아 의도를 분류하고, 각 분류에 신뢰도(confidence)를 매깁니다. 신뢰도가 임계값보다 낮으면 억지로 보내지 않고 Fallback 경로(되묻기·사람 상담·기본 처리)로 넘깁니다.

사용자 입력
자연어
Router
의도 분류 + confidence
결제·환불 핸들러
기술 지원 핸들러
일반 문의 핸들러
↩ 신뢰도 임계값 미만 → Fallback (사람 상담 · 되묻기 · 기본 경로)
그림 2. 라우터의 분류·신뢰도·Fallback 구조
🧠
라우팅 설계 5원칙. ① 경로를 명확히 정의(책임·범위) ② 분류 불가 대비 기본 경로 필수 ③ 신뢰도 임계값 설정 ④ 실패 시 Fallback 메커니즘 ⑤ 정확도·실패 사례 모니터링. 경로는 반드시 상호 배타적(MECE)이어야 분류 혼란이 없습니다.

4. 라우팅을 구현하는 3가지 방식

라우팅 로직은 크게 세 가지로 구현합니다. 속도·비용·정확도의 트레이드오프가 다릅니다.

규칙 기반< 10ms
if/elif · 키워드 · 정규식
저렴·투명 / 유연성↓
임베딩(의미)10~100ms
발화 임베딩 · 코사인 유사도
빠름+의미 / 임베딩 관리
LLM 기반1~3초
프롬프트 의도 분류
문맥 이해 / 비용·지연
그림 3. 규칙 · 임베딩 · LLM 기반 라우팅의 트레이드오프
방식 지연 비용 정확도/특징
규칙 기반(키워드·정규식) <10ms 매우 낮음 결정적·투명 / 유연성↓
임베딩(Semantic Router) 10~100ms 중간 의미 인식·초고속 / 임베딩 관리
LLM 기반(프롬프트 분류) 1~3초 높음 문맥 이해·유연 / 비용·지연
네 번째로 ML 모델 기반(학습된 분류기, 10~100ms)도 있습니다. 실무에선 한 가지만 쓰기보다 여러 방식을 계층으로 결합하는 하이브리드가 정석입니다(9장).

5. 구현 ① LangChain RunnableBranch

RunnableBranch(조건 함수, 실행 체인) 튜플을 순서대로 평가해 첫 True의 체인을 실행하고, 마지막 인자는 기본(default) 체인입니다. 먼저 router_chain이 입력을 카테고리로 분류합니다.

PYTHON
# 조건 함수 (LLM 출력은 .strip().lower()로 정규화 필수) def is_booking(x): return x.get("category","").strip().lower() == "booking" branch = RunnableBranch( (is_booking, booking_chain), (is_information, info_chain), (is_support, support_chain), (is_refund, refund_chain), unclear_chain, # 기본 체인 — 어떤 조건도 안 맞을 때 ) # 분류 → 분기 (원본 요청을 함께 전달) full_pipeline = ( {"category": router_chain, "request": RunnablePassthrough()} | branch )

6. 구현 ② LangGraph add_conditional_edges

LangGraph는 라우팅 함수가 노드 이름을 반환하고, 매핑 딕셔너리로 다음 노드를 정합니다. with_structured_output로 카테고리를 Literal 타입으로 제한하면 라우팅 오류를 사전에 막습니다.

PYTHON
def route_by_category(state) -> Literal["booking","information","support","refund","unclear"]: return state["category"] # 상태 값을 읽어 분기 graph.add_conditional_edges( "router", # 출발 노드 route_by_category, # 조건 함수 { # 반환값 → 노드 매핑 (1:N) "booking": "booking", "information": "information", "support": "support", "refund": "refund", "unclear": "unclear", }, ) router_llm = llm.with_structured_output(RouteDecision) # 카테고리를 Literal로 강제

get_graph().draw_ascii()로 분기 구조를 시각화할 수 있고, 조건 함수가 자기 노드명을 반환하면 재시도 루프(순환)도 구현됩니다.

7. 구현 ③ Google ADK 자동 위임(Auto-Flow)

Google ADK는 명시적 라우팅 로직이 필요 없습니다. sub_agents 리스트만 정의하면 코디네이터 LLM이 각 에이전트의 description을 읽고 자동으로 위임합니다(Auto-Flow). 따라서 description을 구체적으로 쓰는 것이 곧 라우팅 품질입니다.

PYTHON
booking_agent = LlmAgent( name="BookingAgent", model=MODEL_ID, description="항공권·호텔 예약 및 변경 요청 처리", # ← 위임 판단 기준 instruction="예약 요청을 처리하라", tools=[handle_flight_booking], ) refund_agent = LlmAgent( name="RefundAgent", model=MODEL_ID, description="환불·취소·반품 요청 처리", instruction="환불을 처리하라", tools=[process_refund], ) coordinator = LlmAgent( name="Coordinator", model=MODEL_ID, instruction="요청을 분석해 적합한 전문 에이전트에게 위임하라", sub_agents=[booking_agent, refund_agent], # Auto-Flow: description 기반 자동 위임 )

8. 구현 ④ Semantic Router — 임베딩 기반

Semantic Router는 LLM 호출 없이 라우팅합니다. Route별 대표 발화(utterances)를 임베딩으로 미리 벡터화해 두고, 입력 쿼리도 같은 인코더로 임베딩해 코사인 유사도가 가장 높은 Route를 고릅니다. 밀리초 단위로 빠르고 저렴합니다.

PYTHON
from semantic_router import Route from semantic_router.routers import SemanticRouter from semantic_router.encoders import GoogleEncoder booking_route = Route( name="booking", utterances=["항공권 예약해주세요", "호텔 예약하고 싶습니다", "Book a flight to Paris"], score_threshold=0.3, # 유사도 임계값 (recall↔precision 조절) ) router = SemanticRouter(encoder=GoogleEncoder(), routes=[booking_route, information_route, support_route]) result = router("파리행 비행기 예약") print(result.name if result else "fallback") # "booking" 또는 None→폴백

네 가지 구현 한눈에 비교

LangChain RunnableBranch
(cond, chain) 튜플 + default
선언적 분기
LangGraph conditional_edges
route(state)→노드명 매핑
상태그래프 분기
Google ADK auto-delegation
sub_agents + description
에이전트 자동 위임
Semantic Router
utterances 임베딩 유사도
의미 기반 초고속
그림 4. 같은 라우팅, 네 가지 구현 방식
프레임워크 라우팅 메커니즘 특징
LangChain RunnableBranch (조건, 체인) 튜플 + default LCEL 선언적 분기, LLM 분류
LangGraph conditional_edges 라우팅 함수→노드명 매핑 상태그래프, 순환·시각화
Google ADK Auto-Flow sub_agents + description 위임 자동화, 로직 불필요
Semantic Router 임베딩 코사인 유사도 ms 단위 초고속, LLM 불필요

9. 실전 — 하이브리드 3계층 라우팅

한 방식만 쓰면 속도(규칙)나 정확도(LLM) 중 하나를 포기해야 합니다. 실무 정석은 빠르고 싼 것부터 시도하는 폭포수입니다.

Layer 1
규칙 기반
키워드·금액·VIP 즉시 결정
< 10ms→ 결정
↓ 미결정 시 다음 계층
Layer 2
임베딩(Semantic Router)
코사인 유사도 · 신뢰도 > 0.85
10~100ms→ 결정
↓ 미결정 시 다음 계층
Layer 3
LLM 기반
프롬프트 정밀 분류 (최종)
1~3초→ 결정
요청의 90%+를 Layer 1·2에서 처리 → LLM 비용 최대 68%↓ · P95 지연 충족
그림 5. 규칙 → 임베딩 → LLM 3계층 폭포수 (실무 권장)
PYTHON
def hybrid_router(user_input: str) -> str: # 1단계: 규칙 기반 빠른 필터링 (<10ms) if contains_urgent_keywords(user_input): return "urgent_support" # 2단계: 임베딩 기반 시맨틱 라우팅 (신뢰도 > 0.85면 확정) sem = semantic_router(user_input) if sem.confidence > 0.85: return sem.route # 3단계: 확신도 낮으면 LLM 기반 정밀 분류 return llm_router(user_input)

요청의 90% 이상을 Layer 1·2에서 빠르고 저렴하게 처리하고, 애매한 10%만 LLM에 맡겨 LLM 비용을 최대 68% 절감하면서 정확도를 지킵니다.

10. 엔터프라이즈 적용 — CRM · ERP · Groupware

라우팅은 “요청 유형이 많고 전문 처리가 갈리는” 엔터프라이즈 업무에 특히 강력합니다.

CRM고객 관계 관리
문의 라우팅영업·기술·CS·클레임·VIP
효과응답 4시간→30분 (87%↓)
효과오배정 25%→5% (80%↓)
ERP전사 자원 관리
결재 라우팅금액·권한→문서유형→이상거래
효과결재 처리 83%↓
효과이상 탐지 45→92% (104%↑)
Groupware협업 시스템
업무 배정긴급도·카테고리 자동 분류
효과배정 2시간→5분 (96%↓)
효과문서검색 15분→30초 (97%↓)
도입 효과 & ROI
95%
처리 정확도
70%→95%
−87%
응답 시간
4시간→30분
4.5/5
고객 만족도
3.2→4.5
389%
1년차 ROI
2년차 2,445%
그림 6. 시스템별 라우팅 적용과 도입 효과(ROI)

적용 전략 문서 기준 연간 효과 약 5.6억원(분류 인력 1.8억 + 오류 처리 5,000만 + 컴플라이언스 3,000만 + 생산성 2억), 초기 투자 1.1억원 회수 기간 약 3개월, 1년차 ROI 389% / 2년차 2,445%로 추정됩니다.

11. 케이스 스터디

① 고객 문의 라우팅

고객 문의(100%)를 의도 분류기로 분기한 실측 분포입니다. 평균 응답 시간을 선형 처리 120초 → 35초로 줄이고 라우팅 정확도 95%+를 달성했습니다.

경로 비중 처리
제품 정보 35% 제품 카탈로그 검색
주문 상태 조회 25% 주문 DB 조회
기술 지원 25% 문제해결 가이드 실행
에스컬레이션 15% 담당자 연결

② ERP 결재 라우팅 (금액·권한 기반 규칙층)

금액·권한은 규칙층에서 결정적으로 처리하고, 문서 유형은 임베딩층, 이상 거래만 LLM층이 맡는 3계층 구조입니다.

PYTHON
class ERPApprovalRouter: def route_approval(self, req) -> ApprovalPath: # Layer 1: 규칙 기반 (금액·권한) if req.amount > 100_000_000: # 1억 초과 return ApprovalPath("executive", ["부장","이사","대표이사"], audit=True) if req.amount > 10_000_000: # 1천만 초과 return ApprovalPath("manager", ["팀장","부장"], audit=False) # Layer 2: 임베딩 기반 문서 유형 분류 if self.semantic_router(req.description) == "capital_expenditure": return ApprovalPath("capex", ["팀장","재무팀장"], audit=True) # Layer 3: LLM 기반 이상 거래 탐지 if self.is_unusual(req) and self.llm_router.analyze(req).risk > 0.7: return ApprovalPath("audit_review", ["감사팀"], audit=True)

이 방식으로 이상 거래 탐지율 45%→92%(104%↑), 규정 위반 월 15건→2건(87%↓)을 달성했습니다.

12. 베스트 프랙티스 & 트레이드오프

반드시 모니터링할 지표

  • 라우팅 정확도 — 정확히 분류된 비율
  • Fallback 비율 — 15% 초과 시 카테고리 재설계 신호
  • 오분류율 / P95 지연 — P95 5초 초과 시 알림
  • 카테고리별 트래픽 분포 & LLM 비용

에스컬레이션 규칙 (예시)

① 3회 이상 재분류 ② 신뢰도 0.3 미만 ③ VIP 고객 ④ 금액 100만원 초과 → AI Agent → 더 강력한 AI → 인간 상담원 → 관리자 4단계로 자동 상향.

체크리스트

  • ✅ 카테고리는 MECE(상호 배타·완전 포괄), 이상적으로 각 10~30% 분포
  • 기본/Fallback 경로는 필수 — 분류 안 되는 요청은 반드시 생긴다
  • ✅ 빠르고 싼 것부터: 규칙 → 임베딩 → LLM 하이브리드
  • ✅ LLM 분류엔 구조화 출력(Literal/Pydantic)으로 라우팅 오류 차단
  • ✅ 오분류 사례를 모아 피드백 루프(utterance 보강·프롬프트 수정)로 개선
★ 마치며

체이닝(1편)이 “순서대로 쪼개기”였다면, 라우팅은 “입력에 따라 길을 나누기”입니다. 둘을 결합하면 — 라우팅으로 분기한 뒤 각 경로에서 체이닝으로 처리 — 대부분의 실무 에이전트 워크플로우가 완성됩니다. 다음 편에서는 여러 경로를 동시에 실행하는 병렬화(Parallelization)를 다룹니다.

#라우팅#Routing#LangChain#LangGraph#GoogleADK#SemanticRouter#AgenticAI#LLM
반응형