在 [1]
已复制!
%%capture --no-stderr
%pip install -U langgraph
%%capture --no-stderr %pip install -U langgraph
定义图¶
在 [2]
已复制!
import operator
from typing import Annotated, Any
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
class State(TypedDict):
# The operator.add reducer fn makes this append-only
aggregate: Annotated[list, operator.add]
def node_a(state):
return {"aggregate": ["I'm A"]}
def node_b(state):
return {"aggregate": ["I'm B"]}
def node_c(state):
return {"aggregate": ["I'm C"]}
def node_d(state):
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()
import operator from typing import Annotated, Any from typing_extensions import TypedDict from langgraph.graph import StateGraph, START, END class State(TypedDict): # The operator.add reducer fn makes this append-only aggregate: Annotated[list, operator.add] def node_a(state): return {"aggregate": ["I'm A"]} def node_b(state): return {"aggregate": ["I'm B"]} def node_c(state): return {"aggregate": ["I'm C"]} def node_d(state): 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()
在 [3]
已复制!
from IPython.display import Image, display
display(Image(graph.get_graph().draw_mermaid_png()))
from IPython.display import Image, display display(Image(graph.get_graph().draw_mermaid_png()))
正如我们所见,我们的图将并行执行节点b
和c
(即在单个超级步骤中),这意味着如果我们运行此图,它应该恰好需要 3 步。我们可以首先将递归限制设置为 3 来检查它是否按预期引发错误(递归限制是包含性的,因此如果限制为 3,则图将在达到步骤 3 时引发错误)
使用图¶
在 [4]
已复制!
from langgraph.errors import GraphRecursionError
try:
graph.invoke({"aggregate": []}, {"recursion_limit": 3})
except GraphRecursionError:
print("Recursion Error")
from langgraph.errors import GraphRecursionError try: graph.invoke({"aggregate": []}, {"recursion_limit": 3}) except GraphRecursionError: print("Recursion Error")
Recursion Error
成功!该图按预期引发了错误 - 现在让我们测试将递归限制设置为 4,并确保该图在这种情况下成功
在 [5]
已复制!
try:
graph.invoke({"aggregate": []}, {"recursion_limit": 4})
except GraphRecursionError:
print("Recursion Error")
try: graph.invoke({"aggregate": []}, {"recursion_limit": 4}) except GraphRecursionError: print("Recursion Error")
完美,正如我们所预期的那样,该图在这种情况下成功运行。
设置正确的图递归限制对于避免图运行陷入长时间运行的循环很重要,因此有助于最大限度地减少不必要的成本