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

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.py7~8쪽29차시 「3. 실습 ② — 분류 노드 (2차 LLM)」 아래에 실었습니다
29/intents.py9쪽29차시 「4. 실습 ③ — 유형별 처리 노드」 아래에 실었습니다
29/graph29.py11쪽29차시 「5. 실습 ④ — 다중 분기 구현」 아래에 실었습니다
29/test_routing.py15~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 의 키를 모아야 합니다.
← 이전 절29차시 · 체크리스트와 과제다음 절 →29차시 · 퀴즈 1 — 연산 순서대로 1,000 + 2,000 * 3 계산