2、Agent开发框架学习思路分享---以langgraph为例(第二章)
在第一篇文章中我分享了使用对比学习的方式来学习主流的Agent开发框架,在接下来的内容中,我继续分享将低代码平台里面的元素和langgraph这个框架中的概念相结合起来对比,让人更容易理解框架中的概念。
在继续分享之前先给大家分享一个学习的小技巧,如下:
不得不说,即便是langgraph这个框架已经比较主流,但是里面存在的问题还是比较大,很多工程师对它还是颇为不满的,最简单的问题就是他们的官方文档不够细致,对新手来说不够友好,带来的学习成本是比较大的(官方一直在不断完善中),文档中的一些抽象让人是在是琢磨不透。但是我在看这个官方文档的时候发现一个比较有用的外挂,那就是文档自带的“AI助手”。

也可以说是一个学习的小tips吧,毕竟这相当于在一本书专门搭配了一个解答疑惑的老师。很多我们不理解的抽象实际上我们可以直接询问这个AI助手就可以得到一个比较通俗的解释了,基本是一瞬间,你就能够理解你不懂的概念是什么意思。举一个简单的列子:在最初我看到StateSnapshot这个概念的时候我不理解他的具体作用是什么,我快速的问了一下:

它让我把它看作一个从数据库中读取出来的、经过格式化处理的“某个瞬间的完整报告。然后我就立马理解了他的作用。那这个概念不就是相当于低代码平台中的一个工作流中的一个节点的返回的当时瞬间结果吗。以上的内容就是我在学习的时候给自己找的一个免费的老师,虽然向ChatGPT、deepseek等等这些第三方应用也可以得到差不多的解释,但是我更加推荐使用它自带的AI助手,毕竟是官方的,同时在他工作的过程中他会通过RAG这个步骤去检索本身的文档里面的内容。这只是在最初帮助我们去理解这些概念的方法,但是建议大家还是从工程师的角度去深刻理解的的概念,加深自己的专业程度。
回到正题,在第一篇文章中分享了将langgraph这个框架的三个最基本概念:State、Node、edge和低代码平台相对比起来理解,那么本章我来拆解一下三个中包含的概念我们该怎么对比起来理解?
一、State中概念对比学习
State这个概念里面包含了:Schema、Reducers、Messages这几个最基本的概念,每个概念之下又有单独细分的概念,不过没关系,使用对比学习法,我们能够轻易的搞懂里面的内容。首先是Scheme,新看看官方给出的定义:在 LangGraph 中,图的每一个节点都需要读写数据,Schema 则明确规定了这些数据长什么样、包含哪些字段,以及每个字段应该如何进行更新。然后我们再想想在低代码平台中我们去设置全局变量的时候,我们是不是需要去编辑全局变量的名称、类型、约束等操作,仔细想下来,这两步的操作实际上在各自流程上面起到的作用是相同的,那么这个概念我们就对应上了(在这个概念之下的更多分概念我会单独分享出来)。
然后我们看Reduers:当一个节点执行完毕,准备把新数据写回 State 时,Reducer 决定了这份新数据是完全替换旧数据,还是与旧数据进行某种形式的合并(如追加、相加、取并集等)。简单的说就是Reducers(归约函数)是用来做更新state中的数据更新的。那么再次回到低代码平台上,这些平台上大都有一个叫做“变量更新”的节点,就是将一个全局变量进行更新操作,实现的方式我们可以自定义操作。ok,这样就很容易理解这个大名叫归约函数的东西了。然后简单介绍一下Reducer常见的几个场景,第一是Overwrite(覆盖)、第二是Append(追加)、第三是累加(Accumulate)、第四是自定义逻辑(适合更加复杂的逻辑)。
最后是Messages: 这个概念就不需要着重强调了,也不需要使用对比学习,比较容易理解,类别有:HumanMessage、AIMessage、SystemMessage这几个类别。需要提到的一点我认为是对Message的管理,因为这涉及到上下文工程,对这部分内容的讲解官方文档讲得更好,大家可以去查阅官方文档:LangGraph overview - Docs by LangChain
二、nodes中概念对比学习
在第一章其实已经介绍过node实际上就是低代码工作流中的一个功能模块,在langgraph中,node实际上就是一个Python函数,它接受state、config、runtime这些参数。他们能够分为START 节点、END节点、自定义的节点;在低代码平台中,我们新建一个工作流文件,创建成功之后会默认出现,一个开始模块和结束模块,在我们实际去做工作的时候就是将连接线接到实际工作节点,最后结束时接到结束节点,我们并不会对这两个模块做任何操作(我们也做不了,因为它本身不能做任何操作);同样,我们也无法对START节点、END节点做任何修改操作。好的,不用多说,相信此时你也已经懂了他们的相似之处。
三、Edges中概念对比学习
Edges实际上就是在低代码平台中的那些连接线,但这里我还是说得专业一点:Edges定义了逻辑的路由方式以及图的终止方式。主要包括的类型如下:
Normal Edges(普通边):直接一个节点到下一个节点。这实际上就对应低代码平台的最普通的连接线。
Conditional Edges(条件边):调用函数来确定接下来要访问哪个(哪些)节点。这里类似于低代码平台中的if/else节点,不过在langgraph中并不是代表是固定的if/else,他是根据函数调用结果决定的,还是有一点微小的区别的。
Entry point(入口点):当用户输入到达时,首先调用哪个节点。通常情况下,这个是搭配START节点一起使用,比如:
from langgraph.graph import START
graph.add_edge(START, "node_a")
Conditional entry point(条件入口点):调用一个函数来确定当用户输入到达时首先调用哪个(哪些)节点。使用方法如下:
from langgraph.graph import START
graph.add_conditional_edges(START, routing_function)
#还可以选择提供一个字典,将 routing_function 的输出映射到下一个节点的名称。
graph.add_conditional_edges(START, routing_function, {True: "node_b", False: "node_c"})
以上内容就是这一章分享的一些学习思路分享,除了这些概念之外,在langgraph还有巨多其他概念需要去理解,我会慢慢分享。
最后说一点题外话吧如果你想学习langgraph这个框架,建议是在了解了这个框架的一下大致的概念之后直接找项目做,遇到问题在具体去分析解决,这样才是最好的学习方式。另外再分享一下我个人做agent的思路,在最初使用低代码平台比较多之后,我遇到一个agent业务我通常会使用这些平台做一个MVP(最小可行性版本)出来,低代码平台的优势就是能够快速将业务基础流程给跑通,在理清业务基础流程之后,在使用框架来写就可以了(当然在之中会遇到无数问题),不断修改、调整。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)