29차시. Conditional Edge 실습
6. 실습 ⑤ — 검색 실패 사유별 세부 라우팅
출처: 원본 PDF 29차시_ConditionalEdge실습.pdf 13쪽 · 쪽 그림 13쪽
24차시에서 남긴 fail_reason을 드디어 활용합니다.
6-1) 조건표
| 순서 | 조건 | 반환값 | 다음 노드 |
|---|---|---|---|
| 1 | retrieval_ok == True | "ok" | generate |
| 2 | fail_reason == / "low_score" | "research" | (30차시 rewrite) |
| 3 | fail_reason == / "search_error" | "error" | fallback |
| 4 | 그 외 전부 | "empty" | fallback |
def route_after_retrieve(state) -> str:
if state.get("retrieval_ok"):
return "ok"
reason = state.get("fail_reason", "")
if reason == "low_score":
return "research" # 표현 차이 -> 30차시 재검색 대상
if reason == "search_error":
return "error" # 시스템 오류 -> 즉시 종료
return "empty" # no_result, empty_query 등
# 30차시 전까지는 research도 fallback으로 연결
g.add_conditional_edges("retrieve", route_after_retrieve, {
"ok": "generate",
"research": "fallback", # ★ 30차시에 rewrite로 변경
"error": "fallback",
"empty": "fallback",
})💡 지금은 다 fallback으로 가지만
경로 이름을 미리 나눠두는 것이 중요합니다.
30차시에서 rewrite 노드를 만들면
경로맵의 값 한 줄만 바꾸면 됩니다.
"research": "fallback" → "research": "rewrite"
분기 함수는 손대지 않습니다.
이것이 확장을 고려한 설계입니다.