Agent101第五课:开始学习LangGraph

LangGraph 是一个用于构建具有状态的、多角色的 LLM 应用程序的库,用于创建 Agent 和 Multi-Agent Workflow。

LangGraph 与 LangChain 的区别与联系

LangChain:是一个用于开发由 LLM 驱动的应用程序的框架。它通过一系列开源构建模块、组件和第三方集成,简化了 LLM 应用程序生命周期的每个阶段。LangChain 的核心是“链”(Chain),即将多个 LLM 调用和工具调用链接在一起,形成一个有序的任务序列。其架构遵循有向无环图(DAG)结构,任务按单一方向流动,不形成循环。

LangGraph:是 LangChain 生态系统中的一个专门库,专注于构建有状态的多智能体系统。它采用图(Graph)结构来表示任务和流程,其中节点代表操作或步骤,边表示节点之间的依赖关系。LangGraph 的架构更加灵活,支持循环、回溯以及处理多样化的用户输入。其核心优势在于强大的状态管理和 Multi-Agent 支持。

两者可以独立使用,也可以结合使用。你很快就能看到我可以在 LangGraph 的节点中调用 LangChain 的组件,以利用其丰富的功能。

选择指南:何时使用 LangChain 或 LangGraph?

使用 LangChain 的场景:

  • 需要构建预定义的、顺序明确的工作流程,如数据检索、内容总结、简单问答等。

  • 希望快速开发和部署 LLM 应用程序,利用 LangChain 提供的丰富组件和简洁的链式结构。

使用 LangGraph 的场景:

  • 需要构建复杂的、Multi-Agent 协作的系统,如任务管理助手、虚拟助理等。

  • 需要支持循环、条件判断、并行执行等复杂流程控制。

  • 需要在工作流程中保持持久的上下文和状态。

同时使用 LangChain 和 LangGraph 的场景:

  • 希望利用 LangChain 的组件优势,同时通过 LangGraph 实现复杂的流程控制和状态管理。

总结:

LangChain 和 LangGraph 各有优势,选择合适的框架取决于具体的需求。对于简单、线性的应用,LangChain 提供了快速开发的便利;而对于需要复杂流程控制和状态管理的应用,LangGraph 提供了更大的灵活性和控制力。在某些情况下,结合使用两者可以充分发挥各自的优势,构建更强大和灵活的 LLM 应用程序。

LangGraph中的关键元素

在本节中,我们来看看 Langraph 中的不同组成元素。

我们先从第一个也是最基础的元素开始——状态(State)

那么,什么是状态呢?

它是一个共享的数据结构,记录了整个应用当前的信息或上下文。

换句话说,它就像是应用程序的“记忆”,用于跟踪变量和数据,供不同的节点(Node)访问和修改。

如果你还不清楚什么是“节点”,不用担心,我们接下来就会讲到。

但现在你可以想象一个会议室里的白板:

当与会者想记录新内容或更新信息时,他们会把它写在白板上。

这个白板就相当于状态,而与会者就相当于节点。

也就是说,状态展示的是整个应用的最新信息。

在介绍节点之前,我们要先理解最核心的概念:图(Graph)

图是整个结构的框架,它定义了各个任务(即节点)之间的连接关系与执行顺序。

你可以把它想象成路线图,图上标出了连接不同城市的路线和路口选择。

图可视化了整个工作流程的执行逻辑和条件分支。

一个典型的图如下所示:

接着我们来看第二个基本元素:节点(Node)

节点就是图中的一个个功能单元或操作步骤。

每个节点接收输入(通常是当前状态),进行处理,然后输出一个结果或更新的状态。

一个形象的类比是生产流水线:每个工人执行一个特定任务,比如安装零件、喷漆或检查质量等。每个工人都对应一个节点,它专注完成一个具体的任务。

接下来的概念是:边(Edge)

边是节点之间的连接线,它们决定了任务的执行顺序。

通俗讲,它告诉应用程序当前节点执行完后,接下来该执行哪个节点。

一个类比是火车轨道:轨道就是边,连接两个“站点”——也就是两个节点。而在这条轨道上行驶的火车,就是状态,它在各个节点之间传递和更新。

还有一种特殊的边叫做条件边(Conditional Edge),它会根据状态中的特定条件来决定下一步执行哪个节点。

一个很直观的例子是交通信号灯:绿灯表示前进,红灯表示停止,黄灯表示减速。信号灯的颜色(条件)决定了下一步的行动路径。这也可以理解为一个 if-else 条件语句。

接下来是起点(Start Node)

这是图的入口点。它本身不执行任何操作,但标志着流程的开始。

可以把它看作是一场比赛的起跑线。

既然有起点,那也一定有终点节点(End Node)

当应用执行到终点节点时,整个图的流程就结束了。

它表示所有预定任务已经执行完毕。

你可以把它看作是比赛的终点线。

工具(Tool)是一些特殊的函数或功能模块,节点可以使用它们来完成特定任务,比如从 API 获取数据等。

它们增强了节点的功能。

那么工具和节点的区别是什么?

节点是图中的组成部分,而工具是节点中调用的功能。

类比为:节点是“工人”,而工具是“工人用的工具箱里的锤子、螺丝刀”等。

工具节点(Tool Node)是一种特殊的节点,专门用于调用某个工具。

比如,一个工具节点的任务可能就是从某个 API 获取数据,然后把结果写入状态中供后续节点使用。

流水线上操作机器的工人就是工具节点,控制机器(工具),然后把结果传回装配线。

状态图(StateGraph)是我们最先会接触到的部分之一,它的作用是构建和编译整个图结构。

它管理所有的节点、边以及整体的状态,确保数据在各组件之间正确流动。

你可以把它看成是建筑蓝图:蓝图定义了结构和连接方式,状态图则定义了你的工作流结构。

接着是一个在 LangChain 背景下你可能熟悉的概念:Runnable

在 Langraph 中,Runnable 是一种可以执行的标准组件,用于执行图中的某个任务。

你可以将它理解为构建模块化系统的基础构件。

Runnable 和 Node 有什么区别?

Runnable 可以表示多种操作,而 Node 通常接收状态、处理状态并返回更新的状态。

等我们后面开始写代码时,你就会更明白这个区别了。

一个类比是乐高积木:就像你可以把乐高积木拼接在一起构建出复杂结构,runnable 也可以组合成复杂的 AI 工作流。

最后我们来看看消息类型(Message Types),尤其是如果你有 LangChain 背景,这部分应该很熟悉。

Langraph 中常见的五种消息类型包括:

  • Human Message:用户输入的信息

  • AI Message:AI 生成的回复

  • System Message:提供给模型的说明或上下文

  • Tool Message:表示工具的使用

  • Function Message:表示一次函数调用(与 Tool Message 类似)

本系列课程源代码位于:

https://github.com/realyinchen/AgenticRAG

课程的文字版将发布在我的知识星球:

如果你对提示工程感兴趣,可以进入微信公众号主页,进入【提示工程】专栏:

第四课可以在这里看:Agent101第四课:类型注解

(文:PyTorch研习社)

发表评论