28차시. Conditional Edge 이해
5. 질문 유형 라우팅 개념
출처: 원본 PDF 28차시_ConditionalEdge이해.pdf 13~14쪽 · 쪽 그림 13쪽 14쪽
29차시에서 실제로 구현할 내용입니다. 오늘은 설계만 봅니다.
5-1) 유형 분류 노드
START
↓
classify_node ← 질문 유형을 판단해 State에 기록
↓
[route_by_intent]
├─ greeting ──→ greeting_node ──→ END
├─ calc ──────→ calc_node ─────→ END
├─ out_of_scope → scope_node ──→ END
└─ document ──→ retrieve → ... (기존 RAG 흐름)5-2) 분류 방법 두 가지
| 방법 | 비용 | 정확도 | 적합한 경우 |
|---|---|---|---|
| 규칙 기반 (키워드) | 없음 | 낮음 | 인사말 등 패턴이 명확할 때 |
| LLM 분류 | 있음 | 높음 | 유형이 많고 표현이 다양할 때 |
■ 규칙 기반 예시
──────────────────────────────────────
GREETINGS = ["안녕", "반가", "하이", "고마워", "감사"]
def classify_node(state):
q = state["question"].strip()
# 인사말이 하나라도 포함되어 있고 문장이 짧으면 인사로 판단
is_greeting = False
for g in GREETINGS:
if g in q:
is_greeting = True
break
if is_greeting and len(q) < 20:
return {"intent": "greeting"}
if re.fullmatch(r"[\d\s\+\-\*/\(\)\.]+", q):
return {"intent": "calc"}
return {"intent": "document"} # 기본은 문서 질의💡 2단 분류가 실무적입니다
1차 규칙 — 명확한 것만 빠르게 거름 (비용 0)
2차 LLM — 애매한 것만 분류 (비용 발생)
26차시 2단 검증과 같은 발상입니다.
"코드로 판단할 수 있는 것은 LLM에게 묻지 않는다"
⚠️ 기본 경로는 반드시 document로
분류가 애매하면 RAG로 보내는 것이 안전합니다.
문서 질문을 인사로 잘못 분류하면?
→ "안녕하세요!"라고만 답합니다. 최악입니다
인사를 문서 질문으로 잘못 분류하면?
→ 검색해보고 없으면 안내합니다. 견딜 만합니다
실수했을 때 덜 나쁜 쪽을 기본값으로 두세요.