子图¶
子图是一个用作另一个图中的节点的图——这是应用于 LangGraph 的封装概念。子图允许您构建包含多个组件(这些组件本身就是图)的复杂系统。
使用子图的一些原因包括
- 构建多智能体系统
- 当您想在多个图中重用一组节点时
- 当您希望不同团队独立地处理图的不同部分时,您可以将每个部分定义为子图,只要子图接口(输入和输出模式)得到遵守,父图就可以在不了解子图任何细节的情况下构建
添加子图时的主要问题是父图和子图如何通信,即它们在图执行期间如何相互传递状态。有两种情况
-
父图和子图在其状态模式中具有共享状态键。在这种情况下,您可以将子图作为节点包含在父图中
from langgraph.graph import StateGraph, MessagesState, START # Subgraph def call_model(state: MessagesState): response = model.invoke(state["messages"]) return {"messages": response} subgraph_builder = StateGraph(State) subgraph_builder.add_node(call_model) ... subgraph = subgraph_builder.compile() # Parent graph builder = StateGraph(State) builder.add_node("subgraph_node", subgraph) builder.add_edge(START, "subgraph_node") graph = builder.compile() ... graph.invoke({"messages": [{"role": "user", "content": "hi!"}]})
-
父图和子图具有不同的模式(其状态模式中没有共享状态键)。在这种情况下,您必须从父图中的节点内部调用子图:当父图和子图具有不同的状态模式,并且您需要在调用子图之前或之后转换状态时,这很有用
from typing_extensions import TypedDict, Annotated from langchain_core.messages import AnyMessage from langgraph.graph import StateGraph, MessagesState, START from langgraph.graph.message import add_messages class SubgraphMessagesState(TypedDict): subgraph_messages: Annotated[list[AnyMessage], add_messages] # Subgraph def call_model(state: SubgraphMessagesState): response = model.invoke(state["subgraph_messages"]) return {"subgraph_messages": response} subgraph_builder = StateGraph(SubgraphMessagesState) subgraph_builder.add_node("call_model_from_subgraph", call_model) subgraph_builder.add_edge(START, "call_model_from_subgraph") ... subgraph = subgraph_builder.compile() # Parent graph def call_subgraph(state: MessagesState): response = subgraph.invoke({"subgraph_messages": state["messages"]}) return {"messages": response["subgraph_messages"]} builder = StateGraph(State) builder.add_node("subgraph_node", call_subgraph) builder.add_edge(START, "subgraph_node") graph = builder.compile() ... graph.invoke({"messages": [{"role": "user", "content": "hi!"}]})