langgraph / / 2024. 11. 29. 17:19

[langgraph] 그래프 재귀 한도(recursion limit)를 제한하는 방법

LangGraph 공식문서를 번역한 내용입니다. 필요한 경우 부연 설명을 추가하였고 이해하기 쉽게 예제를 일부 변경하였습니다. 문제가 되면 삭제하겠습니다.

https://langchain-ai.github.io/langgraph/how-tos/recursion-limit/

그래프를 호출하거나 스트리밍할 때 재귀 한도를 설정할 수 있다. 재귀 한도는 그래프가 오류를 발생시키기 전에 실행할 수 있는 슈퍼스텝의 최대 개수를 설정한다. 재귀 한도의 개념에 대해 더 알아보려면 여기를 참고하자. 간단한 병렬 분기가 있는 그래프를 사용하여 재귀 한도가 어떻게 작동하는지 자세히 이해할 수 있는 예제를 살펴보자.

그래프에서 재귀 한도 오류 대신 상태의 마지막 값을 반환하는 방법에 대한 예제를 보고 싶다면, 이 가이드를 참조하라.

준비

우선, 필요한 패키지를 설치하자.

pip install -U langgraph

그래프 정의

import operator
from typing import Annotated

from langgraph.graph import StateGraph, START, END
from typing_extensions import TypedDict


class State(TypedDict):
    aggregate: Annotated[list, operator.add]


def node_a(state):
    print("I'm A")
    return {"aggregate": ["I'm A"]}


def node_b(state):
    print("I'm B")
    return {"aggregate": ["I'm B"]}


def node_c(state):
    print("I'm C")
    return {"aggregate": ["I'm C"]}


def node_d(state):
    print("I'm D")
    return {"aggregate": ["I'm A"]}


builder = StateGraph(State)
builder.add_node("a", node_a)
builder.add_edge(START, "a")
builder.add_node("b", node_b)
builder.add_node("c", node_c)
builder.add_node("d", node_d)
builder.add_edge("a", "b")
builder.add_edge("a", "c")
builder.add_edge("b", "d")
builder.add_edge("c", "d")
builder.add_edge("d", END)
graph = builder.compile()
display(
    Image(
        graph.get_graph().draw_mermaid_png(
            output_file_path="./graph_recursion_limit.png"
        )
    )
)

보시다시피, 그래프는 노드 b와 c를 병렬로 실행한다(즉, 하나의 슈퍼스텝에서 실행). 따라서 이 그래프를 실행하면 정확히 3단계가 소요될 것이다. 먼저 재귀 한도를 3으로 설정하여 예상대로 오류가 발생하는지 확인해 보자(재귀 한도는 포함 범위에 해당하므로, 한도가 3이면 그래프가 3단계에 도달했을 때 오류를 발생시킨다).

그래프 사용

from langgraph.errors import GraphRecursionError

try:
    graph.invoke({"aggregate": []}, {"recursion_limit": 3})
except GraphRecursionError:
    print("Recursion Error")
Recursion Error

그래프가 예상대로 오류를 발생시켰다. 이제 재귀 한도를 4로 설정하여 그래프가 이 경우 성공적으로 실행되는지 확인해 보자.

try:
    graph.invoke({"aggregate": []}, {"recursion_limit": 4})
except GraphRecursionError:
    print("Recursion Error")

예상대로 그래프가 성공적으로 실행되었다.

올바른 그래프 재귀 한도를 설정하는 것은 그래프가 장시간 반복 루프에 빠지는 것을 방지하고, 불필요한 비용을 최소화하는 데 중요하다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유