27차시. 기본 Modular RAG 구현
2. 루프 설계 — 3가지 요소
출처: 원본 PDF 27차시_기본ModularRAG구현.pdf 5~6쪽 · 쪽 그림 5쪽 6쪽
20차시에서 배운 안전한 루프의 3요소를 실전에 적용합니다.
2-1) ① State에 카운터
class RAGState(TypedDict):
...
retries: int # 이미 18차시에 넣어뒀습니다2-2) ② 카운터를 올리는 노드
def bump_node(state) -> dict:
n = state.get("retries", 0) + 1
return {"retries": n, "log": [f"재시도 {n}회차 진입"]}⚠️ 왜 별도 노드가 필요한가
28차시에서 배울 규칙입니다.
분기 함수(라우팅 함수)는 State를 수정할 수 없습니다.
· 같은 State면 항상 같은 경로여야 재현이 됩니다
· 부수 효과가 있으면 디버깅이 불가능해집니다
그래서 판단은 분기 함수가, 값 변경은 노드가 합니다.
한 줄짜리 노드지만 역할이 명확합니다.
2-3) ③ 상한 검사를 맨 위에
MAX_RETRY = 2
def route_after_verify(state) -> str:
# ★ 안전장치를 가장 먼저
if state.get("retries", 0) >= MAX_RETRY:
return "giveup"
grade = state.get("grade", "retry")
if grade == "pass":
return "done"
if grade == "giveup":
return "giveup"
return "regenerate" # retry와 research 모두 재생성💡 오늘은 research도 재생성으로 보냅니다
26차시에서 grade를 4가지로 나눴지만,
아직 재검색 경로가 없습니다.
rewrite 노드는 30차시에서 만듭니다.
그때 research를 재검색으로 분리합니다.
지금은 재생성 하나만 연결하고,
30차시에서 갈래를 늘리는 방식으로 갑니다.