20차시. Edge 이해
3. 분기 함수 작성 규칙 4가지
출처: 원본 PDF 20차시_Edge이해.pdf 6~7쪽 · 쪽 그림 6쪽 7쪽
조건부 Edge에서 에러가 나는 대부분의 원인이 분기 함수입니다.
3-1) 규칙 ① — State만 보고 판단한다
❌ 나쁜 예
─────────────────────────────
import random
def bad_route(state):
if random.random() > 0.5: # 랜덤!
return "a"
return "b"
→ 같은 입력에 다른 결과 → 재현 불가능 → 디버깅 지옥✅ 좋은 예
─────────────────────────────
def good_route(state):
return "ok" if state["retrieval_ok"] else "empty"
→ 같은 State면 항상 같은 경로3-2) 규칙 ② — State를 바꾸지 않는다
❌ 나쁜 예 — 부수 효과
─────────────────────────────
def bad_route(state):
state["retries"] += 1 # 값을 바꿈!
return "retry"
→ 분기 함수는 여러 번 호출될 수 있습니다
→ 카운터가 예상보다 빨리 올라갑니다
→ 값을 바꾸려면 별도 노드를 만드세요3-3) 규칙 ③ — 모든 경우에 갈 곳이 있다
❌ 나쁜 예 — 빠지는 경우가 있음
─────────────────────────────
def bad_route(state):
if state["grade"] == "pass":
return "end"
if state["grade"] == "retry":
return "again"
# grade가 다른 값이면 None 반환 → 런타임 에러!✅ 좋은 예 — 마지막에 기본 경로
─────────────────────────────
def good_route(state):
grade = state.get("grade", "retry") # 기본값
if grade == "pass":
return "end"
if state.get("retries", 0) >= config.MAX_RETRY:
return "giveup"
return "again" # 무조건 반환됨3-4) 규칙 ④ — 반환값과 맵의 키를 일치시킨다
출처: 원본 PDF 7쪽
❌ 자주 나는 실수
─────────────────────────────
def route(state):
return "yes" # "yes" 반환
g.add_conditional_edges("retrieve", route, {
"ok": "generate", # 맵에는 "ok"
"no": "fallback",
})
→ KeyError! "yes"라는 키가 없습니다