大家好,这篇文章继续为大家分享在langgraph这个框架中那些晦涩难懂的概念我们应该如何来理解,前面两章内容我已经介绍了一部分比较重要的概念如何去对比理解学习,那么本篇分享就不过多的去将之前的内容了,这里我直接分享。

       在langgraph中有一个知识点叫做Send,官方对他的定义是:允许你动态生成并执行分支的机制,主要用于实现 Map-Reduce(映射-归约)等复杂工作流。说实话,最开始接触这个东西我是懵的,那我们怎么来理解这个概念呢?这里,我们可以问一下文档中自带的助手,让他给我们解释一下,得到的解释是这样的:

通常情况下,LangGraph 的节点(Nodes)和边(Edges)是预先定义好的,并且所有操作都在同一个共享状态(State)上执行。然而,在某些场景下,你需要解决以下问题:

  1. 动态边(Dynamic Edges): 下一步要调用的节点数量在运行前是未知的。
  2. 多状态并行(Multiple States): 你希望在同一个“超级步(Super-step)”内并行运行多个相同类型的任务,且每个任务拥有各自独立的输入状态,而不是共享同一个全局状态。

       从解释中我们关注一个最重要的词汇“并行”,以往一个平常的graph中,操作都在State上执行,每一个节点执行一次任务(循环除外),然后走向下一个节点,但是当我们接到到一个需要在一个节点中多次执行的需求怎么办呢?比如:现在需要在一个大模型节点执行一个生成多篇相同格式的文章,但是内容各不相同,这个需求怎么做?有的朋友可能会说,重复调用这个节点执行任务就能解决了,但是这里我们要考虑一个问题,在一个具体的工程化项目当中,一个业务流程通常是比较长的,或许只是其中一个节点需要执行这样的任务,所以这种方法在工程化项目是不太可取的。

       那么问题怎么解决,这里就会用到Send这个概念了,我们在上文中强调了两个字---并行,在低代码平台上有一个这样的模块,叫做“并行执行”:【并行执行】节点接收一个数组,对每个元素同时执行同一段子工作流,最后把所有结果汇总输出。如下图:

那么这个和langgraph中的Send有什么能够联系起来的呢?Send允许你从条件边(Condition Edges)中动态返回一系列指令。它接收两个参数:

Node Name 要执行的目标节点名称。
State 传递给该目标节点的输入数据。

实际上就是上游节点生成一个对象列表,然后利用Send将列表中的每个对象分发给下游节点进行并行处理,最后下游节点的输出会写回共享状态供后续节点汇总使用。这样对比下来,我们能发现Send和低代码平台中的并行执行他们去干的事情是同样的,这就不难理解Send这个概念了,当然它们其中是有一些细微的差别的,这里不过多阐述,主要是帮助正在学习的朋友去理解这个概念,在实际的使用过程中,我们再去关注里面的参数也不迟,下面我举一个简单的例子来看看Send的实际使用方法,就拿我上面提出的问题为例:

       现在一个上有的节点已经生成好了一组多篇文章的主题,现在需要为每个主题生成具体的内容?

from langgraph.types import Send

def continue_to_jokes(state: OverallState):
    # 根据 state 中的动态数据,返回多个 Send 对象
    # 每个 Send 都会触发一个独立的“generate_article”节点实例
    return [Send("generate_article", {"subject": s}) for s in state['subjects']]

# 将此逻辑绑定为条件边
graph.add_conditional_edges("node_a", continue_to_article)

通过这种方式,generate_joke 节点会根据 state['subjects'] 的长度被多次并行调用,每次调用都会获得特定的 subject 输入,从而实现了灵活的动态并行计算。好的,对于Send的解释就先到这里。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐