AI Agent工作流程:关于是使用 LangGraph 还是 LangChain 进行构建的完整指南

深入了解同一创建者 LangChain 和 LangGraph 的两个库:它们的关键构建块、它们如何处理其功能的核心部分,以及为您的用例在它们之间做出决定
语言模型为用户如何与 AI 系统交互以及这些系统如何通过自然语言相互通信开启了可能性。

在本文中,我们将探讨用于构建代理 AI 应用程序的两个最流行的框架——LangChain 和 LangGraph。在本文结束时,您应该对关键构建块、每个框架在处理其核心功能方面有何不同,并能够形成一个受过教育的观点,了解哪个框架最适合您的问题。

由于将生成式 AI 广泛纳入解决方案的做法相对较新,因此开源参与者正在积极竞争开发“最佳”代理框架和编排工具。这意味着,尽管每个参与者都带来了独特的方法,但他们几乎一直在推出新功能。阅读这篇文章时,请记住,今天是正确的,明天可能就不是了!

注意:我原本打算对 AutoGen、LangChain 和 LangGraph 进行比较。但是,AutoGen 已经宣布推出 AutoGen 0.4,这是对框架从基础开始的完全重新设计。请留意 AutoGen 0.4 发布时的另一篇文章!

LangChain 和 LangGraph 的基本组件

通过了解每个框架的不同基本元素,您将对它们在下一节中如何处理某些核心功能的主要差异有更丰富的了解。下面的描述并不是每个框架的所有组件的详尽列表,而是作为理解它们一般方法差异的有力基础。

LangChain

使用 LangChain 有两种方法:作为预定义命令的连续链或使用 LangChain Agent。每种方法处理工具和编排的方式都不同。链遵循预定义的线性工作流程,而Agent充当协调器,可以做出更动态(非线性)的决策。

  • Chain:一系列步骤,可以包括对 llm、代理、工具、外部数据源、过程代码等的调用。链可以分支,这意味着根据 逻辑条件将单个链拆分为多个路径。
  • Agent或语言模型:语言模型能够以自然语言生成响应。但是 Agent 使用语言模型和附加功能来推理、调用工具,并在出现任何故障时重复调用工具的过程。
  • Tools:基于代码的函数,可以在链中调用或由代理调用以与外部系统交互。
  • Prompts:这可能包括指示模型如何完成任务以及可用工具的系统提示、从外部数据源注入的信息(为模型提供更多上下文)以及模型要完成的用户提示或任务。

LangGraph

LangGraph 从不同的角度处理 AI 工作流。顾名思义,它像图表一样编排工作流。由于它在处理 AI 代理、过程代码和其他工具之间的不同流方面具有灵活性,因此它更适合线性链方法、分支链或简单Agent系统无法满足用例需求的用例。与 LangChain 相比,LangGraph 旨在处理更复杂的条件逻辑和反馈循环。

  • Graph:一种组织工作流的灵活方式,可以包括对 llm、工具、外部数据源、程序代码等的调用。LangGraph 也支持循环图;这意味着您可以创建循环和反馈机制,以便可以多次重新访问节点。
  • Nodes:表示工作流程中的步骤,例如 LLM 查询、API 调用或工具执行。
  • Edges and Conditional Edges:边通过将一个节点的输出作为输入连接到下一个节点来定义信息流。条件边定义在满足特定条件时从一个节点到另一个节点的信息流。开发人员可以自定义定义这些条件。
  • State:State 是信息流经图形时应用程序的当前状态。它是一个开发人员定义的可变 TypedDict 对象,其中包含当前执行图形的所有相关信息。当信息流经图形时,LangGraph 会自动处理每个节点的状态更新。
  • Agent或语言模型:图形中的语言模型仅负责生成对输入的文本响应。代理功能利用语言模型,但使图形具有多个节点,表示代理的不同组件(例如推理、工具选择和工具执行)。代理可以决定在图形中采用哪个路径,更新图形的状态,并执行更多任务,而不仅仅是文本生成。

每个框架处理核心功能的方式之间的差异

LangGraph 和 LangChain 在某些功能上存在重叠,但它们从不同的角度处理问题。LangChain 通过使用链或不同的 AI 代理模式专注于线性工作流。而 LangGraph 专注于创建更灵活、更精细、基于流程的工作流程,其中可以包括 AI 代理、工具调用、程序代码等。

一般来说,LangChain 需要的学习曲线比 LangGraph 少。有更多的抽象和预定义配置,使 LangChain 更容易在简单的用例中实现。LangGraph 允许对工作流的设计进行更多自定义控制,这意味着它不那么抽象,开发人员需要学习更多才能有效地使用框架。

工具调用:

LangChain

在 LangChain 中,有两种方法可以调用工具,具体取决于您是使用链对一系列步骤进行排序,还是仅使用其Agent功能而不在链中明确定义。在链中,工具作为预定义的步骤包含在链中,这意味着它们不一定由代理调用,因为已经预先确定它们将在链中调用。但是,当您有一个未在链中定义的Agent时,Agent可以自主决定调用什么工具以及何时根据它所拥有的工具列表调用。

链的流示例:
在这里插入图片描述
- 创建表示工具的函数并使其与链兼容
- 将工具整合到链条中
- 执行链

Agent的流示例:
在这里插入图片描述

  • 工具已定义
  • 该工具已添加到代理
  • 代理会收到查询并决定是否以及何时使用搜索工具。如果需要,代理可以多次使用该工具。
LangGraph

在 LangGraph 中,工具通常表示为图形上的一个节点。如果图形包含代理,则代理将根据其推理能力确定要调用的工具。根据代理的工具决策,图形导航到 “tool node” 以处理工具的执行。条件逻辑可以包含在从代理到工具节点的边缘中,以添加确定是否执行工具的附加逻辑。如果需要,这为开发人员提供了另一层控制。如果图中没有代理,那么就像在 LanchChain 的链中一样,该工具可以基于条件逻辑包含在工作流中。

使用 anAgent 的 Graph 的 Flow 示例:
在这里插入图片描述

  • 工具已定义
  • 该工具已绑定到Agent
  • Agent决定是否需要工具,如果需要,则决定使用哪种工具
  • LangGraph 框架检测到需要工具调用,并导航到图形中的工具节点以执行工具调用
  • 捕获工具输出并将其添加到图形的状态中
  • 使用更新的状态再次调用代理,以允许它决定下一步做什么

没有Agent的图表的 Flow 示例:
在这里插入图片描述

  • 工具已定义
  • 该工具将作为节点添加到图表中
  • 条件边可用于确定何时使用某个工具节点并控制图形的流程
  • 该工具可以配置为更新图形的状态

对话历史记录和内存

LangChain

Langchain 提供了用于处理对话历史和内存的内置抽象。有一些选项可以用于要传递给 llm其中包括完整的会话对话历史记录、汇总版本或自定义定义的内存。开发人员还可以创建自定义长期记忆系统,他们可以将记忆存储在外部数据库中,以便在相关时检索。

LangGraph

在 LangGraph 中,state 通过跟踪每个时间点定义的变量来处理内存。状态可以包括对话历史记录、计划步骤、语言模型上一个响应的输出等内容。它可以从一个节点传递到下一个节点,以便每个节点都可以访问系统的当前状态。但是,跨会话的长期持久内存不作为框架的直接功能提供。为了实现这一点,开发人员可以包含负责将内存和其他变量存储在外部数据库中以供以后检索的节点。

开箱即用的 RAG 功能

LangChain

LangChain 可以处理复杂的检索和生成工作流程,并拥有一套更成熟的工具来帮助开发人员将 RAG 集成到他们的应用程序中。例如,LangChain 通过直接使用 langchain.document_loaders、langchain.embeddings 和 langchain.vectorstores 提供开箱即用的文档加载、文本解析、嵌入创建、矢量存储和检索功能。

LangGraph

在 LangGraph 中,RAG 需要作为图结构的一部分从头开始开发。例如,可能有单独的节点用于文档解析、嵌入和检索,这些节点将通过正常或条件边缘连接。每个节点的状态将用于在 RAG 管道中的步骤之间传递信息。

并行性

LangChain

LangChain 提供了使用 RunnableParallel 类并行运行多个链或代理的机会。对于更高级的并行处理和异步工具调用,开发人员必须使用 python 库(如 ayncio)自定义实现这些功能。

LangGraph

LangGraph 支持节点的并行执行,只要没有任何依赖关系(例如一个语言模型的响应输出作为下一个节点的输入)。这意味着它可以支持在图表中同时运行的多个代理,只要它们不是依赖节点。与 LangChain 一样,LangGraph 可以使用 RunnableParallel 类并行运行多个图形。LangGraph 还支持使用 ayncio 等 python 库进行并行工具调用。

重试逻辑和错误处理

LangChain

在 LangChain 中,错误处理由开发人员明确定义,可以通过将重试逻辑引入链本身或在工具调用失败时在Agent中完成。

LangGraph

在 LangGraph 中,你实际上可以通过将 workflow 设为自己的节点来将错误处理嵌入到你的工作流中。当某些任务失败时,您可以指向另一个节点或让同一节点重试。最好的部分是,只有失败的特定节点会重试,而不是整个工作流。这意味着图形可以从故障点恢复,而不必从头开始。如果您的使用案例需要许多步骤和工具调用,这可能是重要的。

总结

你可以不使用 LangGraph,不使用 LangChain,或者同时使用两者!通过将 AutoGen 代理设为图中自己的节点,也完全可以探索将 LangGraph 基于图的编排与其他 Agentic AI 框架(如 MSFT 的 AutoGen)结合使用。可以肯定地说,有很多选择——而且可能会让人感到不知所措。

那么,经过所有这些研究,我应该什么时候使用呢?虽然没有硬性规定,但以下是我个人的选择:

仅在以下情况下使用 LangChain:

您需要快速构建原型或开发 AI 工作流,这些工作流涉及遵循预定义线性模式的顺序任务(例如文档检索、文本生成或摘要)。或者,您希望利用可以动态做出决策的 AI 代理模式,但不需要对复杂的工作流程进行精细控制。

仅在以下情况下使用 LangGraph:

您的使用案例需要多个组件动态交互的非线性工作流,例如依赖于条件、需要复杂分支逻辑、错误处理或并行性的工作流。你愿意为那些没有像 LangChain 那样为你抽象的组件构建自定义实现。

在以下情况下同时使用 LangChain 和 LanGraph:

您喜欢 LangChain 预先构建的提取组件,例如开箱即用的 RAG 功能、内存功能等,但也希望使用 LangGraph 的非线性编排来管理复杂的任务流。同时使用这两个框架可以成为从每个框架中提取最佳能力的强大工具。最终,你是选择 LangChain、LangGraph 还是两者的组合,取决于你项目的具体需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/33974.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

qt QPrinter详解

1、概述 QPrinter类是Qt框架中用于打印输出的绘图设备。它表示打印出来的一系列页面,并提供了一组附加功能来管理特定于设备的特性,比如方向和分辨率。QPrinter可以生成PDF文档,也可以将内容发送到打印机进行实际打印。它继承自QPagedPaintD…

腾讯面试:如何解决哈希冲突?

我们面试时经常被问到HashMap是怎么解决哈希冲突的,很多同学对其含糊其词、一知半解。因此小编对相关知识进行了总结,希望帮助读者加深对其理解。 哈希表就是通过散列函数将键映射到定值,简单来说就是一个键对应一个值。 而通过散列函数映射…

数组中的四个函数(数组实现)

strlen&#xff08;输出长度&#xff09; #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) { char str[100]; int count 0; // 提示用户输入字符串 printf("请输入一个字符串: &qu…

大数据-241 离线数仓 - 电商核心交易 业务数据表结构 订单、产品、分类、店铺、支付表

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

Linux-命令

文章目录 一. Linux的目录1. Linux的目录结构2. Linux的路径的描述方式3. home目录,当前工作目录4. 栗子 二. Linux命令入门1. 什么是命令,命令行2. Linux命令基础格式 三. 目录相关命令1. ls:展示当前工作目录下的内容2. cd:切换工作目录3. pwd:输出当前所在的工作目录4. 相对…

SpringBoot该怎么使用Neo4j - 优化篇

文章目录 前言实体工具使用 前言 上一篇中&#xff0c;我们的Cypher都用的是字符串&#xff0c;字符串拼接简单&#xff0c;但存在写错的风险&#xff0c;对于一些比较懒的开发者&#xff0c;甚至觉得之间写字符串还更自在快速&#xff0c;也确实&#xff0c;但如果在后期需要…

旋转图像

旋转图像 ​ 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 ​ 你必须在** 原地** 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,…

3D数据大屏实现过程,使用echarts、Next.js

&#x1f4dc; 本文主要内容 数据大屏自适应方案动效 echarts&#xff1a; 3D 立体柱状图动态流光折线图 3D 地球&#xff08;飞线、柱状图&#xff09;无限滚动列表 &#x1f50d; 大屏效果 数据大屏&#xff1a; 点击预览 &#x1f579; 运行条件 next 12.3.4echarts 5.4…

长文 | RAG的实战指南及探索之路

今天给大家带来一篇知乎孙鹏飞 的关于RAG实战的文章。 作者&#xff1a;孙鹏飞 知乎&#xff1a;https://zhuanlan.zhihu.com/p/6822534961. 背景介绍 RAG&#xff08;Retrieval Augmented Generation&#xff0c;检索增强生成 &#xff09;方法是指结合了基于检索的模型和生…

LeetCode—11. 盛最多水的容器(中等)

题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;…

leetcode 63.不同路径||

1.题目要求: 2.题目代码: class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {//创建dp数组的含义vector<vector<int>> dp;dp.resize(obstacleGrid.size());for(int i 0;i < dp.size();i){dp[i].…

C++:std::deque简介

std::deque 是 C 标准模板库&#xff08;STL&#xff09;中的一个双端队列&#xff08;Double-ended Queue&#xff09;容器。它是一种动态数组&#xff0c;允许快速地在序列的两端插入和删除元素&#xff0c;同时支持随机访问。 特点 双端操作 支持在队列头部和尾部快速插入和…

【Linux】基础IO_文件系统IO_“一切皆文件”_缓冲区

目录 1. 理解"⽂件" 1-1 狭义理解 1-2 ⼴义理解 1-3 ⽂件操作的归类认知 1-4 系统⻆度 访问文件&#xff0c;需要先打开文件&#xff01;那么是由谁打开文件&#xff1f;&#xff1f;&#xff1f; 操作系统要不要把被打开的文件管理起来&#xff1f; 2. 回顾…

nginx防盗链原理与实践

nginx防盗链的原理是基于http请求头中的referer来限制对资源的访问&#xff08;referer是用来告知浏览器该网页时从哪个页面链接来的&#xff09;&#xff0c;从而防止其他网站胃经授权直接链接资源。 nginx防盗链的作用是节省带宽和资源消耗&#xff0c;保护数据安全&#xf…

UG NX二次开发(Python)-UIStyler-选取点

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、设计一个UI界面3、创建长方体的代码4、需要引入的库5、测试验证1、前言 采用Python语言进行UG NX二次开发的资料比较少,我本来不是很认可采用Python进行二次开发的,但是近期有读者咨询…

linux环境中后台运行java程序

在生产环境&#xff0c;我们通常需要让java进程后台运行&#xff0c;并且即使会话关闭&#xff0c;进程也依然存在。 使用的命令&#xff1a; nohup java -jar xxx.jar -> aaa.log 2>&1 & 详细介绍下上面这条命令 &#xff08;1&#xff09;nohup&#xff1a;…

算法笔记:力扣15、三数之和

思路&#xff1a; 实现代码 class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result new ArrayList<>(); Arrays.sort(nums); // 先对数组进行排序 for (int i 0; i < nums.length - 2; i) { /…

java基础语法光速入门

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理Java的基础语法部分 适合有编程基础的人快点掌握语法使用 没学过一两门语言的话。。还是不建议看了 极致的浓缩没有一点解释 注释 单行注释 // 多行注释 /**/ 数据类型 布尔型:true false 整型:int,lon…

karmada-descheduler

descheduler规则 karmada-descheduler 定期检测所有部署&#xff0c;通常是每2分钟一次&#xff0c;并确定目标调度集群中无法调度的副本数量。它通过调用 karmada-scheduler-estimator 来完成这个过程。如果发现无法调度的副本&#xff0c;它将通过减少 spec.clusters 的配…

LeetCode 力扣 热题 100道(十四)二叉树的中序遍历(C++)

给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 如下为代码&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullpt…