28차시. Conditional Edge 이해
실습 1 — Conditional Edge 이해 실습 따라 하기
관련 수업 자료: 원본 PDF 28차시_ConditionalEdge이해.pdf · 실습 코드 20/routes.py
이 실습은 교안 해설(28_ConditionalEdge이해.md)의 실습 순서를 옮긴 것입니다. OpenAI 임베딩이나 채팅 모델을 부르는 파일은 .env 에 API 키가 있어야 돌아갑니다. 키가 없으면 실행 결과 샘플로 출력 모양을 확인합니다.
수업 자료와 이어지는 곳
| 실습 코드 | 원본 PDF | 이어지는 내용 |
|---|---|---|
20/routes.py | - | 원본 PDF 에 짝이 되는 쪽이 없어 이 페이지 아래에 실었습니다 |
실행 흐름
classify → 분기 함수
분기 함수 → 인사 노드 (greeting)
분기 함수 → 계산 노드 (calc)
분기 함수 → 범위 밖 (scope)
분기 함수 → 검색 (document)실습 순서
분기 표를 코드 없이 먼저 씁니다. 순서, 조건, 반환 문자열, 도착 노드. 반환 문자열이 경로 맵에 전부 있는지, 마지막이 조건 없는 기본값인지 확인합니다. routes.py가 State를 수정하지 않는지 읽습니다.
스스로 확인
- 결정성이 왜 디버깅에 필요한가?
- 시간이나 난수를 분기 안에 두면 안 되는 이유를 아는가?
- 기본 경로를 document로 두는 이유를 손해로 설명하는가?
이어지는 실습 코드
실습 코드 · 20/routes.py
실습 코드: 실습/src/20/routes.py · 원본 PDF 에 같은 이름의 쪽이 없어 여기에 실었습니다.
이 파일은 20차시 「4. 실습 ① — 19차시 if문을 Edge로 옮기기」에 주석과 함께 전체가 실려 있습니다. 여기서는 이 차시에서 보는 부분의 해설과 실행 결과만 옮깁니다.
코드 해설
검색 노드 다음에 갈 이름을 고르는 조건부 엣지 함수만 둔다. 입력은 State의 retrieval_ok이고, 출력은 "ok" 또는 "empty". 그래프 파일의 add_conditional_edges 가 이 문자열을 노드로 바꾼다.
주석에 적힌 흐름입니다.
흐름
retrieve 가 끝난 직후
retrieval_ok 참 → "ok"
그 외 → "empty"코드 앞에서 고정해 두는 말입니다.
- 20차시 | Edge 이해
- 교안: 20차시_Edge이해.pptx
- State = 이 함수는 노트를 고치지 않는다. 읽기만 한다.
- Node = 이 함수는 노드가 아니다. 엣지를 고르는 함수다.
- 조건부 엣지 = 반환값 "ok" → generate, "empty" → fallback (연결은 graph_v1~v3).
함수와 클래스로 나누어 읽습니다.
route_after_retrieve: 조건부 엣지 함수 route_after_retrieve. 노드가 아니다. 읽기: retrieval_ok 쓰기: 없음
파일 맨 아래 실행 결과 샘플 주석은 실행되지 않습니다. 화면 출력은 다음 절에 다시 적어 두었습니다.
코드 설명
- 20차시
routes.py의route_after_retrieve는 retrieval_ok 하나만 읽고 "ok" 또는 "empty" 문자열만 돌려줍니다. State 를 고치지 않고, 두 갈래 모두 반환값이 있습니다. 오늘 배운 네 규칙을 모두 지키는 가장 짧은 예입니다. state.get("grade", "retry")처럼 기본값을 주는 이유는 이전 노드가 키를 안 채웠을 때 None 으로 엉뚱한 줄에 걸리지 않게 하려는 것입니다. 다만 기본값이 늘 같은 경로로 이어지면 「7. 분기 함수 디버깅」의 "왜 계속 저쪽으로만 가지?" 가 됩니다.OK, EMPTY = "ok", "empty"처럼 경로 이름을 상수로 두면 분기 함수와add_conditional_edges의 경로맵이 같은 이름을 씁니다. "OK" 와 "ok" 처럼 대소문자 하나 틀려서 나는 오류를 막습니다.- 6-3) 의
route_after_verify에서 research 를 따로 반환하는 줄은 30차시에 rewrite 노드와 이어집니다. 마지막return "regenerate"는 조건이 없는 기본 경로라서, grade 에 예상 못 한 값이 와도 None 이 반환되지 않습니다.