29차시. Conditional Edge 실습
실습 1 — Conditional Edge 실습 실습 따라 하기
관련 수업 자료: 29차시 「3. 실습 ② — 분류 노드 (2차 LLM)」(7~8쪽), 29차시 「4. 실습 ③ — 유형별 처리 노드」(9쪽), 29차시 「5. 실습 ④ — 다중 분기 구현」(11쪽), 29차시 「7. 실습 ⑥ — 경로별 동작 확인」(15~16쪽) · 실습 코드 29/classifier.py, 29/intents.py, 29/graph29.py, 29/test_routing.py
이 실습은 교안 해설(29_ConditionalEdge실습.md)의 실습 순서를 옮긴 것입니다. OpenAI 임베딩이나 채팅 모델을 부르는 파일은 .env 에 API 키가 있어야 돌아갑니다. 키가 없으면 실행 결과 샘플로 출력 모양을 확인합니다.
수업 자료와 이어지는 곳
| 실습 코드 | 원본 PDF | 이어지는 내용 |
|---|---|---|
29/classifier.py | 7~8쪽 | 29차시 「3. 실습 ② — 분류 노드 (2차 LLM)」 아래에 실었습니다 |
29/intents.py | 9쪽 | 29차시 「4. 실습 ③ — 유형별 처리 노드」 아래에 실었습니다 |
29/graph29.py | 11쪽 | 29차시 「5. 실습 ④ — 다중 분기 구현」 아래에 실었습니다 |
29/test_routing.py | 15~16쪽 | 29차시 「7. 실습 ⑥ — 경로별 동작 확인」 아래에 실었습니다 |
실행 흐름
START → classify
classify → greeting (greeting)
classify → calc (calc)
classify → scope (scope)
classify → retrieve (document)
greeting → END
calc → END
scope → END실습 순서
python intents.py를 실행해 계산 샘플을 확인합니다. 규칙이 '안녕'만으로 긴 문서 질문을 인사로 오인하지 않는지, 길이 제한이 있는지를 classifier.py에서 읽습니다.
스스로 확인
- 규칙을 확실한 말에만 쓰는 이유를 아는가?
- 분류 실패 시 document인 이유를 말하는가?
- 인사 경로에서 임베딩을 부르지 않는 이유를 비용으로 말하는가?
코드 설명
rule_classify는 판단하지 못하면None을 돌려줍니다(수업 자료 2절 코드는 빈 문자열). 그래서classifier_node는if intent is not None:으로 규칙 결과가 있는지 봅니다. 규칙이 억지로 답을 고르지 않는 것이 핵심입니다.CALC_PATTERN.match(question) and has_operator는 두 조건을 함께 봅니다. "2024" 처럼 숫자만 있는 문장은 패턴에는 맞지만 연산자가 없어 calc 가 되지 않습니다. 한글이 섞인 "7일 이내 환불이 맞나요?" 는 패턴부터 맞지 않아 calc 로 가지 않습니다.getattr(config, "USE_LLM_CLASSIFY", False)는 config 에 그 값이 없으면 False 를 씁니다. 그러면 규칙이 못 가른 질문은 LLM 없이 곧바로 document 가 됩니다. 키 없이 실습할 때도 분류 노드가 멈추지 않는 이유입니다.calc_node는expression.replace(",", "")로 천 단위 쉼표를 뺀 뒤eval(clean_expression, {"__builtins__": {}}, {})로 계산합니다. 화면에는 쉼표가 있는 원래 식을 보여 주므로 결과가1,000 + 2,000 * 3 = 7000으로 찍힙니다. 실패하면 이 파일은 grade 를 giveup 으로 둡니다(수업 자료 코드는 pass).graph29.py의route_intent는 greeting, calc, scope 가 아니면 모두 "document" 를 돌려줍니다. 분류 노드가 이상한 값을 써도 검색 쪽으로 가니, 문서 질문을 놓치는 최악의 경우를 막습니다.test_routing.py는app.invoke로 마지막 State 의 intent 만 기대값과 견줍니다. 수업 자료 7절처럼 지나간 노드와 걸린 시간을 보려면app.stream으로 step 의 키를 모아야 합니다.