【Agent的革命之路——LangGraph】工作流中的 Command 模式

这篇文章我们将 LangGraph中的控制流(边)和状态更新(节点)结合起来使用。比如,我们希望同时执行状态更新并决定下一步要转到哪个节点,且这些操作在同一个节点中完成。而正好 LangGraph 提供了一种方法,可以通过从节点函数返回一个 Command 对象来实现这一点。

def my_node(state: State) -> Command[Literal["my_other_node"]]:
    return Command(
        # state update
        update={
   
   "foo": "bar"},
        # control flow
        goto="my_other_node"
    )

如果我们使用的是 subgraphs(子图) 我们还可以通过 Command 中指定 graph=Command.PARENT这种方式,实现节点从一个子图导航到其他子图。

def my_node(state: State) -> Command[Literal["my_other_node"]]:
    return Command(
        update={
   
   "foo": "bar"},
        goto="other_subgraph",  # where `other_subgraph` is a node in the parent graph
        graph=Command.PARENT
    )

当我们从子图节点向父图节点发送更新的时候,且更新的键同时存在于父图和子图的状态模式中时,我们必须为父图状态中正在更新的键定义一个 reducer。
下面我们开始我们的例子。

定义节点和State

定义 graph State:

class State(TypedDict)
### LangGraph 工作流使用教程 #### 创建基础工作流 构建基于 LangGraph工作流涉及多个方面,从简单的对话记录到复杂的应用程序开发。对于初学者来说,可以先尝试通过 LangGraph 来实现与虚拟角色之间的交互[^1]。 ```python from langgraph import Graph, Node # 初始化图结构 graph = Graph() # 添加节点并设置属性 node_start = Node(id="start", content="欢迎来到LangGraph世界!") graph.add_node(node_start) # 连接不同节点形成路径 next_node_id = "greeting" node_greet = Node(id=next_node_id, content="你好啊!有什么可以帮助你的吗?") graph.connect_nodes("start", next_node_id) ``` 此段代码展示了如何初始化一个基本的会话流程,其中包含了两个主要部分:一是创建起始点 `Node` 对象;二是利用 `.connect_nodes()` 方法来指定各个节点间的连接关系。 #### 定义高级工作流 当掌握了基础知识之后,就可以进一步学习更复杂的操作——即定义应用程序的工作流。这通常涉及到一系列预设好的节点配置以及它们之间相互作用的方式[^2]。 ```python def define_workflow(): workflow_steps = [ {"id": "input_user_message", "type": "input"}, {"id": "process_request", "type": "function_call"}, {"id": "output_response", "type": "output"} ] for step in workflow_steps: node = Node(**step) graph.add_node(node) if not first_step: previous_step_id = get_previous_step() graph.connect_nodes(previous_step_id, step["id"]) define_workflow() ``` 上述函数说明了怎样按照既定顺序排列各功能模块,并确保每一步都能顺利传递给下一步执行。值得注意的是,在实际项目中还需要考虑错误处理机制等问题。 #### 利用代理增强工作流能力 为了满足更加多样化的需求场景,LangGraph 支持引入代理概念来进行任务分配和协调。这种特性允许开发者设计出具备高度灵活性及可扩展性的解决方案[^3]。 ```python class Agent: def __init__(self, name): self.name = name def execute_task(self, task_name): print(f"{self.name}正在执行{task_name}") agent_a = Agent(name='AgentA') agent_b = Agent(name='AgentB') agents_mapping = { 'search_web': agent_a, 'summarize_text': agent_b } for task, responsible_agent in agents_mapping.items(): responsible_agent.execute_task(task) ``` 这段示例体现了通过类实例化方式模拟不同的代理实体,并让其负责特定类型的作业。借助这种方式,不仅简化了整体架构的设计难度,同时也提高了系统的响应速度和服务质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔巴先生24

乔巴谢谢你的鼓励哦,我会努力的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值