29차시. Conditional Edge 실습
2. 실습 ① — 분류 노드 (1차 규칙)
출처: 원본 PDF 29차시_ConditionalEdge실습.pdf 5쪽 · 쪽 그림 5쪽
비용 없이 명확한 것부터 걸러냅니다.
📝 src/nodes/classifier.py
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차로 넘깁니다.
규칙이 무리하게 판단하면 오분류가 늘어납니다.