RAG2026-5일20차시 · Edge 이해6 / 18← 이전목차다음 →MetaContents

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"라는 키가 없습니다
← 이전 절20차시 · 2. Edge의 세 가지 형태다음 절 →20차시 · 4. 실습 ① — 19차시 if문을 Edge로 옮기기