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")
예상대로 그래프가 성공적으로 실행되었다.
올바른 그래프 재귀 한도를 설정하는 것은 그래프가 장시간 반복 루프에 빠지는 것을 방지하고, 불필요한 비용을 최소화하는 데 중요하다.