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

20차시. Edge 이해

7. 실습 ③ — 무한루프 체험하기

출처: 원본 PDF 20차시_Edge이해.pdf 14쪽 · 쪽 그림 14쪽

한 번 겪어봐야 무서운 줄 압니다. 안전하게 실험해봅시다.

📝 일부러 무한루프 만들기

출력
from langgraph.graph import StateGraph, START, END
from typing import TypedDict

class S(TypedDict):
    count: int

def step(state):
    n = state["count"] + 1
    print(f"  실행 {n}회차")
    return {"count": n}

g = StateGraph(S)
g.add_node("step", step)
g.add_edge(START, "step")
g.add_edge("step", "step")        # ★ 자기 자신으로! 무한루프
app = g.compile()

# ⚠ recursion_limit로 안전장치를 걸고 실행
try:
    app.invoke({"count": 0}, {"recursion_limit": 10})
except Exception as e:
    print("중단됨:", type(e).__name__)

실행 결과
──────────────────────────────────
  실행 1회차
  실행 2회차
  ...
  실행 10회차
중단됨: GraphRecursionError

💡 recursion_limit이라는 최후의 안전장치
LangGraph에는 기본 재귀 한도(25)가 있습니다.
그걸 넘으면 GraphRecursionError로 중단됩니다.
하지만 이건 최후의 방어선일 뿐입니다.
25번을 도는 동안 LLM을 25번 부르면
이미 비용이 발생한 뒤입니다.
MAX_RETRY로 우리가 직접 막는 것이 정석입니다.

실습 코드 · 20/loop.py

실습 코드: 실습/src/20/loop.py · 위의 원본 PDF 20차시 14쪽 「7️⃣ 실습 ③ — 무한루프 체험하기」과 이어집니다.

Python
# ============================================================
# 20차시 | Edge 이해
# 교안: 20차시_Edge이해.pptx
# 역할: step 에서 다시 step 으로 가는 엣지가 끝없이 돌고, 상한에서 멈추는 예.
# 입력: count = 0
# 출력: "실행 N회차" 와 중단 예외 이름
#
#   State  = LoopState. 칸은 count 하나.
#   Node   = step. count 를 1 올리고 그 칸만 return 한다.
#   Edge   = START → step, 그리고 step → step. END 로 가는 엣지가 없다.
#   compile / invoke = 앱으로 확정한 뒤 실행한다.
#   recursion_limit = 스텝이 이 횟수를 넘으면 GraphRecursionError.
#            조건부 엣지가 없어도, 자기 자신으로 가는 엣지면 반복된다.
#
# 흐름
#   START → step → step → step → ... (END 없음)
# ============================================================

from typing import TypedDict
from langgraph.graph import StateGraph, START

# ============================================================
# 1. State 정의
# ============================================================

class LoopState(TypedDict):
    # step 노드가 실행된 횟수를 저장합니다.
    count: int

# ============================================================
# 2. Node 정의
# ============================================================

# 노드 step
#   읽기: count
#   쓰기: count
def step(state: LoopState):
    """실행 횟수를 1 증가시키는 노드입니다."""

    # 현재 실행 횟수를 1 증가시킵니다.
    count = state["count"] + 1

    # 현재 몇 번째 실행인지 출력합니다.
    print(f"실행 {count}회차")

    # 변경된 count를 State에 저장합니다.
    return {"count": count}

# ============================================================
# 3. 그래프 생성
# ============================================================

# LoopState를 사용하는 그래프를 만듭니다.
graph = StateGraph(LoopState)

# step 노드를 그래프에 등록합니다.
graph.add_node("step", step)

# ============================================================
# 4. Edge 연결
# ============================================================

# 그래프가 시작되면 step 노드를 실행합니다.
graph.add_edge(START, "step")

# step 실행 후 다시 step으로 이동하여 무한 반복합니다.
graph.add_edge("step", "step")

# ============================================================
# 5. 그래프 컴파일
# ============================================================

# compile: END 가 없는 연결도 앱으로 확정할 수 있다.
app = graph.compile()

# ============================================================
# 6. 그래프 실행
# ============================================================

try:
    # invoke 설정 recursion_limit=10. 이 횟수를 넘으면 예외가 난다.
    app.invoke(
        {"count": 0},
        {"recursion_limit": 10}
    )

except Exception as error:
    # 실행 한도를 넘으면 발생한 오류 종류를 출력합니다.
    print("중단됨:", type(error).__name__)

실행 결과 샘플 (교안 기록. API 키가 필요한 코드는 키 없이 맞춘 예시이고, 모델의 답은 실행할 때마다 달라집니다)

출력
===== 실행 결과 샘플 =====
실행: cd 실습/src/20
      python loop.py
(실제 실행 출력)
실행 1회차
실행 2회차
실행 3회차
실행 4회차
실행 5회차
실행 6회차
실행 7회차
실행 8회차
실행 9회차
실행 10회차
중단됨: GraphRecursionError
경로: step → step → … (END 없음)

코드 해설

step 에서 다시 step 으로 가는 엣지가 끝없이 돌고, 상한에서 멈추는 예.입니다. 입력은 count = 0이고, 출력은 "실행 N회차" 와 중단 예외 이름입니다.

주석에 적힌 흐름입니다.

출력
흐름
START → step → step → step → ... (END 없음)

코드 앞에서 고정해 두는 말입니다.

  • 20차시 | Edge 이해
  • 교안: 20차시_Edge이해.pptx
  • State = LoopState. 칸은 count 하나.
  • Node = step. count 를 1 올리고 그 칸만 return 한다.
  • Edge = START → step, 그리고 step → step. END 로 가는 엣지가 없다.
  • compile / invoke = 앱으로 확정한 뒤 실행한다.
  • recursion_limit = 스텝이 이 횟수를 넘으면 GraphRecursionError.
  • 조건부 엣지가 없어도, 자기 자신으로 가는 엣지면 반복된다.

함수와 클래스로 나누어 읽습니다.

  • LoopState: 이름 그대로 한 가지 일만 합니다. 본문 주석을 같이 읽습니다.
  • step: 노드 step 읽기: count 쓰기: count

파일 맨 아래 실행 결과 샘플 주석은 실행되지 않습니다. 화면 출력은 다음 절에 다시 적어 두었습니다.

← 이전 절20차시 · 6. 루프 — 되돌아가는 Edge다음 절 →20차시 · 8. Edge 문법 정리