LangGraph Subgraphs 子图

概述

子图,就是在另一个图中用作节点的图。langgraph支持将一个完整的图作为某个图的一个节点,适用于将复杂任务拆分为多个专业智能体协作完成,每个子图都可以独立开发,测试和复用。子图可以有自己的私有数据,也能和父图共享数据。对于主图来说,并不关心子图内部怎样处理,只关心输入和输出的State。

1.添加子图为节点

例:添加子图为节点

1..compile()编译后的子图sub_graph,才能作为节点放进父图master_graph

2.content='master graph'变成子图修改后覆盖的sub node

3.当主图调用子图,会发生状态的合并 ,因为operator.add是无条件叠加,所以子图收到初始的messages后,合并成['master graph invoke', 'sub node add']返给父图,父图还要和自己的状态做合并,于是会变成['master graph invoke', 'master graph invoke', 'sub node add']

复制代码
import operator
from typing import TypedDict, Annotated

from langgraph.graph import StateGraph
from langgraph.constants import START
from langgraph.constants import END

# 状态
class DemoState(TypedDict):
    messages: Annotated[list, operator.add]
    content: str

# 子图节点
def sub_node(state: DemoState) -> dict:
    return {
        'messages': ['sub node add'],
        'content': 'sub node'
    }


if __name__ == "__main__":
    sub_builder = StateGraph(DemoState)
    sub_builder.add_node('sub_node', sub_node)
    sub_builder.add_edge(START, 'sub_node')
    sub_builder.add_edge('sub_node', END)
    sub_graph = sub_builder.compile() #构建子图
    sub_graph.get_graph().print_ascii()
    print('*' * 30)

    master_builder = StateGraph(DemoState)
    master_builder.add_node('sub_graph', sub_graph) #子图作为父图节点
    master_builder.add_edge(START, 'sub_graph')
    master_builder.add_edge('sub_graph', END)
    master_graph = master_builder.compile()
    master_graph.get_graph().print_ascii()
    print('*'*30)

    resp = master_graph.invoke(DemoState(
        messages=['master graph invoke'],
        content='master graph'
    ))

    print(resp)

+-----------+  
| __start__ |  
+-----------+  
      *        
      *        
      *        
+----------+   
| sub_node |   
+----------+   
      *        
      *        
      *        
 +---------+   
 | __end__ |   
 +---------+   
******************************
+-----------+  
| __start__ |  
+-----------+  
      *        
      *        
      *        
+-----------+  
| sub_graph |  
+-----------+  
      *        
      *        
      *        
 +---------+   
 | __end__ |   
 +---------+   
******************************
{'messages': ['master graph invoke', 'master graph invoke', 'sub node add'], 'content': 'sub node'}

2.从节点调用子图

从节点调用子图,子图和父图共享名称相同的State字段,父图的变量,子图可修改,子图也可拥有自己的私有字段,仅在子图内有效,父图中不会最终显示出来。

复制代码
from typing import TypedDict

from langgraph.graph import StateGraph
from langgraph.constants import START
from langgraph.constants import END


class ParentState(TypedDict):
    # 字段名一致,父子共享
    parent_messages: str

class SubState(TypedDict):
    parent_messages: str
    # 子图私有
    sub_content: str

# 父图节点
def parent_node(state: ParentState) -> dict:
    return {
        'parent_messages': state['parent_messages'] + ' and parent_node msg ',
    }

# 子图节点
def sub_node(state: SubState) -> dict:
    return {
        'parent_messages': state['parent_messages'] + ' and sub_node msg ',
        'sub_content': 'sub node'
    }


if __name__ == "__main__":
    sub_builder = StateGraph(SubState)
    sub_builder.add_node('sub_node', sub_node)
    sub_builder.add_edge(START, 'sub_node')
    sub_builder.add_edge('sub_node', END)
    sub_graph = sub_builder.compile() #构建子图
    sub_graph.get_graph().print_ascii()
    print('*' * 30)

    master_builder = StateGraph(ParentState)
    # 父图自己的节点
    master_builder.add_node('parent_node', parent_node)
    # 子图作为父图节点
    master_builder.add_node('sub_graph', sub_graph)

    master_builder.add_edge(START, 'parent_node')
    # 父图自己的节点指向子图
    master_builder.add_edge('parent_node', 'sub_graph')
    master_builder.add_edge('sub_graph', END)
    master_graph = master_builder.compile()
    master_graph.get_graph().print_ascii()
    print('*'*30)

    resp = master_graph.invoke(ParentState(parent_messages='graph invoke'))

    print(resp)

+-----------+  
| __start__ |  
+-----------+  
      *        
      *        
      *        
+----------+   
| sub_node |   
+----------+   
      *        
      *        
      *        
 +---------+   
 | __end__ |   
 +---------+   
******************************
 +-----------+   
 | __start__ |   
 +-----------+   
        *        
        *        
        *        
+-------------+  
| parent_node |  
+-------------+  
        *        
        *        
        *        
 +-----------+   
 | sub_graph |   
 +-----------+   
        *        
        *        
        *        
  +---------+    
  | __end__ |    
  +---------+    
******************************
{'parent_messages': 'graph invoke and parent_node msg  and sub_node msg '}
相关推荐
吴凡wudianmei7 小时前
线上出问题不知道卡在哪?全链路追踪 + 三端统一部署
架构·langchain·llm
DGT7 小时前
不用 LangChain,200 行 TypeScript 手搓一个能联网、能写文件的 Agent
前端·langchain·agent
梦影_7 小时前
Langchain简单快速上手教程(九)—— 核心组件之少样本提示
人工智能·python·自然语言处理·中间件·langchain
BD_Marathon7 小时前
【RAG开发】CSVLoader
langchain
LMT流氓兔8 小时前
第五单元——第7课:工具读取用户身份,而不是让模型填写身份
python·langchain
云和数据.ChenGuang1 天前
LLM大模型对接本地Ollama部署模型
开发语言·人工智能·python·langchain
云和数据.ChenGuang1 天前
光哥说Python 循环导入(Circular Import)深度解析:成因、排查与解决方案
开发语言·前端·人工智能·python·langchain
染指11101 天前
152.Agent-LangGraph-Command的参数
人工智能·python·langchain·agents
小肝一下1 天前
1.大模型介绍
python·langchain·大模型·ollama·langgrap
BD_Marathon1 天前
【RAG开发】LangChain调用大语言模型
人工智能·语言模型·langchain