语言模型为用户与AI系统之间的交互以及这些系统之间的沟通开启了新的可能性,通过使用自然语言。
当企业希望使用Agentic AI的能力打造解决方案时,遇到的第一个技术问题之一是“应该用什么工具?”对于急着上手的人来说,这通常成为他们遇到的第一个障碍。
出自:Dalle-3
在本文中,我们将探讨两个最受欢迎的构建代理AI应用的框架——LangChain和LangGraph。 到本文结束时,你应该已经能够对每个框架的关键构建模块有一个详细的理解,知道它们在处理核心功能的方式有何不同,并能够判断哪个框架最适合你的需求。
由于将生成式AI广泛应用于解决方案中还是一项相对较新的实践,开源项目参与者正在积极竞争开发最优秀的代理框架和编排工具。这意味着虽然每个参与者都有自己独特的方案,但他们几乎每天都在推出新的功能。阅读本文时,请记得今天正确的东西明天可能就不适用了。
注意:我原本打算比较AutoGen、LangChain和LangGraph。不过,AutoGen已经宣布即将推出全新的AutoGen 0.4版本,这是一个从底层开始彻底重新设计的全新框架。敬请关注AutoGen 0.4发布后的另一篇文章!
LangChain 和 LangGraph 的基本组成通过了解每个框架的基础元素,你将更好地理解它们在处理某些核心功能上的关键差异。以下描述并不是对每个框架所有组件的全面列举,但可以作为理解它们一般方法差异的良好起点。
兰链
处理LangChain有两大方法:一种是作为一系列预定义命令的线性流程,另一种是使用LangChain代理进行操作。它们在处理工具和编排上各有特色。链遵循预设的线性流程,而代理则像是一个灵活的协调者,能够做出动态的决策。
- 链:一系列可以包括调用大语言模型(LLM)、代理人、工具、外部数据源、过程代码等步骤的流程。链可以分叉,这意味着一个链可以基于逻辑条件分裂成多个路径。
- 代理人或语言模型:语言模型能够生成自然语言的响应。但是,代理人则使用语言模型并增加了推理能力、调用工具以及在调用工具失败时重试的能力。
- 工具:由代码实现的功能,可以在链中调用或由代理人调用以与外部系统或服务交互。
- 提示:这可以包括系统指令,指示模型如何完成任务及可用的工具,来自外部数据源注入的信息以为模型提供额外的上下文信息,以及用户指令或任务。
LangGraph(语言图谱)
LangGraph 以不同的方式处理 AI 工作流。正如名字所暗示的,它像图一样调度工作流。因为它能灵活处理不同 AI 代理、程序代码和其他工具之间的各种流程,因此它更适用于那些线性链方法、分支链或简单代理系统无法满足需求的场景。LangGraph 设计用于处理比 LangChain 更复杂的条件判断和反馈循环。
- 图:一种灵活的工作流组织方式,可以包含调用大型语言模型(LLM)、工具、外部数据源、程序代码等。LangGraph 支持循环图结构;这意味着你可以创建循环和反馈机制,使节点可以多次遍历。
- 节点:代表工作流中的步骤,如一个 LLM 查询、API 调用或工具执行。
- 边和条件边:边定义信息流,通过将一个节点的输出连接到下一个节点的输入。条件边定义在满足特定条件时从一个节点到另一个节点的信息流。开发人员可以自定义这些条件。
- 状态:状态是信息流经图表时应用程序的当前状态。这是一个由开发者定义的可变的 TypedDict 对象,包含当前图表执行的所有相关信息。LangGraph 自动处理状态在每个节点的信息流经过时的更新。
- 代理程序或语言模型:图中的语言模型仅负责生成给定输入的文本响应。代理功能不仅基于语言模型,还利用多个节点来代表不同的代理组件,如推理、工具选择和工具执行。代理可以根据情况选择执行图中的不同路径,更新图表的状态,并执行除生成文本之外的更多任务。
LangGraph 和 LangChain 在某些功能上有所重叠,但它们解决问题的角度不同。LangChain 侧重于通过链或不同的AI代理模式来实现线性工作流程。而LangGraph则侧重于创建一个更为灵活和颗粒化的基于流程的工作流程,可以包括AI代理、工具调用、过程代码等更多内容。
总体来说,LangChain的学习曲线比LangGraph要平缓。LangChain提供了更多的抽象和预定义配置,使得它更适合简单的情况。LangGraph允许对工作流的设计有更多的自定义控制,这意味着它提供了更少的抽象层次,开发人员需要更多时间来掌握使用该框架的技能。
工具调用:工具调用是指使用特定工具的过程。
LangChain (làng chéin)
在 LangChain 中,有两种方法可以调用工具,这取决于你是否用链来安排一系列步骤,或者只是单纯使用代理功能而没有在链中明确定义。在链中,工具被预设为链中的步骤——这意味着工具不一定是由代理调用的,因为它们已经是链中预定要调用的步骤。然而,当代理没有在链中定义时,它可以根据需要来决定何时调用哪个工具,基于它所知道的工具集合。
链式流程例子:
这张图片是由 Sandi Besen 制作的
- 创建一个表示该工具的函数并使其与链兼容
- 将该工具集成到链中
-
运行链
一个代理的工作流程示例:
图片来自 Sandi Besen
- 工具被定义
- 工具被添加到代理
- 代理接收到查询后,决定是否以及何时使用搜索工具。代理可以根据需要多次使用该工具。
语言图谱 (LangGraph,一种语言分析工具)
在 LangGraph(语言图形) 中,工具通常表示成图中的一个节点。如果图包含一个智能代理,那么是智能代理根据其推理能力来决定调用哪个工具。基于智能代理的工具选择,图将导航至“工具节点”来处理工具的执行。智能代理与工具节点之间的边可以包含条件逻辑,以增加决定是否执行该工具的额外逻辑条件。这为开发人员提供了另一层控制,如有必要。如果没有智能代理在图中,就像在 LanchChain 中的链一样,工具可以根据条件逻辑被包含在工作流中。
图中包含代理的流程示例:
图片由 Sandi Besen 拍摄
- 定义了工具
- 工具与代理绑定
- 代理决定是否需要工具,如果需要,决定使用哪个工具。
- LangGraph 框架检测到需要调用工具,导航到图中的工具节点以执行调用。
- 工具的输出被捕获并添加到图的状态中。
-
代理再次被调用,根据更新后的状态以决定下一步做什么。
一个没有代理的图形流程示例:
图片由 Sandi Besen 拍摄
- 工具被定义为
- 添加为节点到图中
- 可以使用条件边来确定何时使用某个工具节点并控制图的流程
-
工具可以被配置为更新图的状态
如果你想了解更多关于工具调用的知识,可以看看我的朋友Tula Masterman写的一篇非常好的文章(article),讲解了工具调用在生成式AI中的工作方式。
注意:LangChain 和 LangGraph 像微软的 Semantic Kernel 一样,原生不支持 语义函数。
聊天记录和保存的历史兰链(一个特定的概念或品牌名称,保持不变)(Lánghuìlián)
Langchain 提供内置抽象来处理对话历史和记忆。您可以选择传递给大语言模型(LLM)的粒度级别(因此也是 token 数量),包括完整的会话历史、摘要版本的会话历史或自定义的记忆。开发人员可以创建这样的系统,将记忆存储在外部数据库中,在需要时检索。
LangGraph
在 LangGraph 中,状态通过在每个时间点跟踪已定义的变量来管理内存。状态可以包括诸如对话历史、计划步骤、语言模型之前响应的输出等信息。状态可以在节点间传递,每个节点都可以访问到当前系统状态。然而,跨会话的长期持久记忆并不是框架直接提供的功能。为了实现这一点,开发人员可以在外部数据库中增加专门存储记忆和其他变量的节点,以便后续检索。
即插即用的RAG功能:LangChain
LangChain 可以处理复杂的检索和生成工作流,并提供了一套更成熟的工具来帮助开发人员将 RAG 集成到他们的应用程序中。比如,LangChain 自带文档加载、文本解析、嵌入创建、向量存储和检索功能,你可以直接使用这些工具,如 langchain.document_loaders、langchain.embeddings 和 langchain.vectorstores。
LangGraph
在LangGraph中,RAG需要从头开始开发,成为图结构的一部分。比如,可以为文档解析节点、嵌入节点和检索节点创建单独的节点,这些节点通过普通或条件边相连。每个节点的状态会用于在RAG管道的不同步骤间传递信息。
并行性:LangChain
LangChain 使用 RunnableParallel
类允许并行运行多个链或代理。对于更复杂的并行操作和异步工具使用,开发者需要使用如 asyncio
等 Python 库来实现这些功能。
LangGraph
LangGraph 支持节点的并行处理,只要这些节点间没有依赖关系(例如,一个语言模型的输出不会作为下一个节点的输入)。这意味着在没有依赖关系的情况下,它就可以支持图中多个代理的同时运行。类似于 LangChain,LangGraph 可以使用 RunnableParallel 类来并行运行多个图。LangGraph 还可以通过使用如 asyncio 这样的 Python 库来支持并行工具调用。
重试机制和错误处理机制:LangChain
在 LangChain 中,错误处理机制由开发者明确定义,可以通过在链本身中添加重试逻辑,或者在代理中实现工具调用失败时的相应处理。
LangGraph
在 LangGraph 中,你可以将错误处理嵌入到工作流中,让它成为一个独立的节点。如果某些任务失败,你可以让它跳转到另一个节点或让它自己重试。最棒的是,只有出错的节点会被重新尝试,而不会整个流程都从头再来。这样图就不用从头开始跑,而是可以直接从出错的地方继续。如果你的工作流程涉及很多步骤和工具调用,这可能会对你很有帮助。
总之你可以单独使用 LangChain,也可以单独使用 LangGraph,或者两者一起使用!你也可以尝试将 LangGraph 的图编排与像微软的 AutoGen 这样的其他 AI 框架结合使用,让 AutoGen 代理成为图中的节点。可以说,有很多选择——这可能会让你觉得有些不知所措。
所以,经过了所有的研究,我应该什么时候使用每一个呢?虽然没有硬性规定,但以下是我的一些建议:
仅在以下情况使用LangChain:
你需要快速地为涉及顺序任务(如文档检索、文本生成或总结)的AI工作流进行原型设计或开发,这些任务遵循一个预定义的线性模式。或者,你想利用可以动态做出决策的AI代理模式,但你不需要对复杂的流程进行细致的控制。
仅在以下情况下使用LangGraph:
你的用例需要非线性的流程,其中多个组件动态交互,例如依赖条件的工作流程,需要复杂的分支逻辑来处理,包含错误处理,并支持并行执行。你愿意为这些不像在LangChain中那样被封装好的组件构建自定义实现。
当你使用LangChain和LanGraph一起使用时:
你享受 LangChain 开箱即用的组件,如 RAG 等功能和记忆功能,但同时也希望使用 LangGraph 的非线性编排功能来管理复杂的任务流。结合使用这两个框架可以成为一种强大的工具,以充分发挥它们各自的优势。
总之,你是选择LangChain、LangGraph还是两者结合的方式,取决于你的项目的具体需求。
请注意:本文以及该论文中的观点仅为作者的观点,并不代表他们的雇主的观点或政策。
仍有问题或觉得某些地方需要进一步解释吗?可以在LinkedIn私信我!我总是乐于交流意见并不断改进我的工作。
参考如下:
探索新的LLM代理和架构,ReAct代理的失败催生了新一代代理和可能性towardsdatascience.com 在家构建语言代理,使用图谱 - langchain-ai.github.io LangGraph 和研究代理 | PineconeLangGraph 是一个基于图形的代理平台,让我们可以构建更灵活、更可控的 AI 代理程序。这里www.pinecone.io 链接未来:深入探索LangChain链 LangChain链是由一系列相互连接的组件构成,旨在按特定顺序执行任务,以实现最大化的任务执行……www.comet.com 从入门到精通:探索LangGraph之旅,构建单代理和多代理工作流以及人机互动中的用户回路共同學習,寫下你的評論
評論加載中...
作者其他優質文章