RAG2026-5일29차시 · Conditional Edge 실습5 / 19← 이전목차다음 →MetaContents

29차시. Conditional Edge 실습

2. 실습 ① — 분류 노드 (1차 규칙)

출처: 원본 PDF 29차시_ConditionalEdge실습.pdf 5쪽 · 쪽 그림 5쪽

비용 없이 명확한 것부터 걸러냅니다.

📝 src/nodes/classifier.py

Python
import re
GREETING_WORDS = ["안녕", "반가", "하이", "헬로",
                  "고마", "감사", "수고", "잘 부탁"]
CALC_PATTERN   = re.compile(r"^[\d\s\+\-\*/\(\)\.,]+[=?]?$")
# 명백히 문서와 무관한 주제
OUT_OF_SCOPE = ["날씨", "주가", "환율", "로또", "뉴스",
                "맛집", "영화", "축구"]
def _has_any(text, words):
    # 목록의 단어 중 하나라도 포함되어 있으면 True
    for w in words:
        if w in text:
            return True
    return False
def _rule_classify(q: str) -> str:
    text = q.strip()
    if not text:
        return "scope"
    # 짧은 인사말
    if len(text) <= 20 and _has_any(text, GREETING_WORDS):
        return "greeting"
    # 순수 계산식
    has_op = False
    for op in "+-*/":
        if op in text:
            has_op = True
            break
    if CALC_PATTERN.match(text) and has_op:
        return "calc"
    # 명백한 범위 밖 주제
    if _has_any(text, OUT_OF_SCOPE):
        return "scope"
    return ""      # 판단 못 함 -> 2차로

💡 규칙 설계 요령
확실한 것만 규칙으로 잡습니다.
· "안녕하세요" → 확실히 인사
· "안녕하세요, 환불 규정 알려주세요" → 애매
→ 길이 20자 제한으로 걸러냅니다
애매하면 빈 문자열을 반환해 2차로 넘깁니다.
규칙이 무리하게 판단하면 오분류가 늘어납니다.

← 이전 절29차시 · 1. 오늘 만들 구조다음 절 →29차시 · 3. 실습 ② — 분류 노드 (2차 LLM)