AI个人学习
和实操指南
讯飞绘镜

LangChain vs. LangGraph:官方告诉你该如何选择

当前生成式 AI 领域发展迅速,新的框架和技术层出不穷。因此,读者需要注意,本文所介绍的内容可能具有时效性。本文将深入探讨用于构建 LLM 应用程序的两个主流框架:LangChain 和 LangGraph,并分析它们的优劣,帮助你选择最适合的工具。

blank


 

LangChain 与 LangGraph 的基础组件

了解这两个框架的基础元素,能帮助开发者更深入地理解它们在处理核心功能上的关键区别。下面的描述并未列出每个框架的所有组件,而是为了让大家对它们的整体设计有一个清晰的认识。

LangChain

LangChain 主要有两种使用方式:预定义命令的顺序链(Chain)和 LangChain Agent。这两种方式在工具和编排上有所不同。链采用预定义的线性工作流,而 Agent 则作为一个协调者,可以进行更具动态性(非线性)的决策。

  • 链(Chain):一系列步骤的组合,这些步骤可以包括调用 LLM、Agent、工具、外部数据源以及过程式代码等。链可以根据逻辑条件分支,将单一流程拆分为多个路径。
  • Agent 或 LLM:LLM 本身能够生成自然语言响应,而 Agent 则结合了 LLM 与额外能力,使其能够进行推理、调用工具,并在调用工具失败时尝试。
  • 工具(Tool):是可以在链中被调用的代码函数,或由 Agent 触发,以与外部系统交互。
  • 提示词(Prompt):包括系统提示词(用于指示模型如何完成任务以及可用工具)、来自外部数据源的注入信息(为模型提供更多上下文)、以及用户的输入任务。

LangGraph

LangGraph 采用了一种不同的构建 AI 工作流的方法。正如其名,它以图(Graph)的方式编排工作流。由于其在 AI Agent、过程式代码和其他工具之间的灵活处理能力,它更适用于线性链、分支链或简单 Agent 系统难以满足需求的复杂应用场景。LangGraph 为处理更复杂的条件逻辑和反馈循环而设计,比 LangChain 更强大。

  • 图(Graph):一种灵活的工作流组织方式,支持调用 LLM、工具、外部数据源、过程式代码等。LangGraph 还支持循环图(Cyclical Graph),即可创建循环和反馈机制,使得某些节点能够被多次访问。
  • 节点(Node):表示工作流中的步骤,例如 LLM 查询、API 调用或工具执行。
  • 边(Edge)和条件边(Conditional Edge):边用于连接节点,定义信息流向,使一个节点的输出作为下一个节点的输入。条件边允许在满足特定条件时,将信息从一个节点流向另一个节点。开发者可以自定义这些条件。
  • 状态(State):表示应用程序的当前状态,随着信息在图中流动而更新。状态是一个开发者定义的可变 TypedDict 对象,包含当前执行图所需的所有相关信息。LangGraph 会在每个节点自动更新状态。
  • Agent 或 LLM:图中的 LLM 仅负责对输入生成文本响应。而 Agent 能力则允许图中包含多个节点,分别代表 Agent 的不同组件(如推理、工具选择和工具执行)。Agent 可以决定在图中采取哪条路径、更新图的状态,并执行比单纯文本生成更多的任务。

简单来说,LangChain 更适合线性和基于工具的调用,而 LangGraph 则更适合复杂的、多路径和具有反馈机制的 AI 工作流。

 

LangChain 与 LangGraph 在核心功能处理方式上的区别

LangGraph 和 LangChain 在某些能力上有所重叠,但它们处理问题的方式有所不同。LangChain 主要关注线性工作流(通过链)或不同的 AI Agent 模式,而 LangGraph 则专注于创建更灵活、细粒度的、基于流程的工作流,其中可以包含 AI Agent、工具调用、过程式代码等。

通常,LangChain 的学习曲线相对较低,因为它提供了更多的抽象封装和预定义配置,这使得 LangChain 更容易应用于简单的使用场景。而 LangGraph 则允许对工作流设计进行更细粒度的定制,这意味着它的抽象程度较低,开发者需要学习更多内容才能有效使用。

工具调用(Tool Calling)

LangChain

在 LangChain 中,工具的调用方式取决于是在链中按顺序执行一系列步骤,还是仅使用 Agent 能力(不在链中明确定义)。

  • 在链中,工具是作为预定义步骤包含的,这意味着它们并不一定是由 Agent 动态调用的,而是在链设计时就已决定了调用哪些工具。
  • 当 Agent 不在链中定义时,Agent 具有更大的自主性,它可以根据自己可访问的工具列表,决定调用哪个工具以及何时调用。

链方式的流程示例:

blank

Agent 方式的流程示例:

blank

LangGraph

在 LangGraph 中,工具通常被表示为图上的一个节点。如果图中包含一个 Agent,那么 Agent 负责决定调用哪个工具,这一决策基于其推理能力。当 Agent 选择了某个工具后,工作流会跳转到对应的“工具节点”(Tool Node),以执行该工具的操作。在 Agent 和工具节点之间的边可以包含条件逻辑(Conditional Logic),从而增加额外的判断逻辑,以决定是否执行某个工具。这样,开发者可以拥有更精细的控制能力。如果图中没有 Agent,那么工具的调用方式类似于 LangChain 的链,即根据预定义的条件逻辑在工作流中执行工具。

包含 Agent 的图流程示例:

blank

没有 Agent 的图的流程示例:

blank

对话历史和记忆

LangChain

LangChain 提供内置的抽象层来处理对话历史和记忆。它支持不同粒度级别的记忆管理,从而控制传递给 LLM 的 token 数量,主要包括以下几种方式:

  • 完整的会话历史(Full session conversation history)
  • 摘要版本的对话历史(Summarized conversation history)
  • 自定义定义的记忆(Custom defined memory)

此外,开发者还可以自定义长期记忆系统,将对话历史存储在外部数据库中,并在需要时检索相关记忆。

LangGraph

在 LangGraph 中,状态(State)负责管理记忆,它通过记录每个时刻定义的变量来跟踪状态信息。State 可以包括:

  • 对话历史
  • 任务执行的各个步骤
  • 语言模型上一次的输出结果
  • 其他重要信息

State 可以在节点之间传递,这样每个节点都能获取当前系统的状态。但是,LangGraph 本身不提供跨会话的长期记忆功能,如果开发者需要持久化存储记忆,可以引入特定的节点,用于将记忆和变量存入外部数据库,以便后续检索。

即用型 RAG 能力

LangChain

LangChain 原生支持复杂的 RAG 工作流,并提供了一套成熟的工具,方便开发者将 RAG 集成到应用程序中。例如,它提供了:

  • 文档加载(Document Loading)
  • 文本解析(Text Parsing)
  • Embedding 生成(Embedding Creation)
  • 向量存储(Vector Storage)
  • 检索能力(Retrieval Capabilities)

开发者可以直接使用 LangChain 提供的 API(如 langchain.document_loaderslangchain.embeddings 和 langchain.vectorstores)来实现 RAG 工作流。

LangGraph

在 LangGraph 中,RAG 需要开发者自行设计,并作为图结构的一部分实现。例如,开发者可以创建单独的节点,分别用于:

  • 文档解析(Document Parsing)
  • Embedding 计算(Embedding Computation)
  • 语义检索(Retrieval)

这些节点之间可以通过普通边(Normal Edges)或条件边(Conditional Edges)进行连接,而各个节点的状态可以用于传递信息,以便在 RAG 流水线的不同步骤之间共享数据。

并行处理(Parallelism)

LangChain

LangChain 允许并行执行多个链或 Agent,可以使用 RunnableParallel 类来实现基本的并行处理。

但如果需要更高级的并行计算或异步工具调用,开发者需要使用 Python 库(如 asyncio)自行实现。

LangGraph

LangGraph 天然支持并行执行节点,只要这些节点之间没有依赖关系(例如,一个 LLM 的输出不能作为下一个节点的输入)。这意味着多个 Agent 可以同时运行,前提是它们不是相互依赖的节点。

此外,LangGraph 也支持:

  • 使用 RunnableParallel 运行多个 Graph
  • 通过 Python 的 asyncio 库并行调用工具

重试逻辑和错误处理

LangChain

LangChain 的错误处理需要由开发者显式定义,可以通过:

  • 在链中引入重试逻辑(Retry Logic)
  • 在 Agent 中处理工具调用失败的情况

LangGraph

LangGraph 可以直接在工作流中嵌入错误处理逻辑,方法是将错误处理作为一个独立的节点。

  • 当某个任务失败时,可以跳转到另一个错误处理节点,或者在当前节点进行重试。
  • 失败的节点会被单独重试,而不是整个工作流重新执行。
  • 这样,图可以从失败的地方继续执行,而不需要从头开始。

如果你的任务涉及多个步骤和工具调用,这种错误处理机制可能会非常重要。

 

如何选择 LangChain 与 LangGraph?

开发者可以:

  • 仅使用 LangChain
  • 仅使用 LangGraph
  • 同时使用 LangChain 和 LangGraph

此外,也可以将 LangGraph 的图结构编排能力与其他 Agent 框架(如微软的 AutoGen)结合,例如:将 AutoGen 的 Agent 作为 LangGraph 的节点。

LangChain 和 LangGraph 各有优势,选择合适的工具可能会让人感到困惑。

何时选择 LangChain?

如果开发者需要快速构建 AI 工作流,以下情况可以考虑选择 LangChain:

  • 线性任务:文档检索、文本生成、摘要等预定义的工作流。
  • AI Agent 需要动态决策,但不需要对复杂流程进行精细控制。

何时选择 LangGraph?

如果应用场景需要非线性(Non-linear)工作流,以下情况可以考虑选择 LangGraph:

  • 任务涉及多个组件的动态交互。
  • 需要条件判断、复杂的分支逻辑、错误处理或并行执行。
  • 开发者愿意自行实现 LangChain 未提供的部分功能。

何时同时使用 LangChain 和 LangGraph?

如果希望同时利用 LangChain 现成的抽象能力(如 RAG 组件、对话记忆等)和 LangGraph 的非线性编排能力,可以考虑同时使用两者。

两者结合,可以充分发挥各自的优势,打造更加灵活和强大的 AI 工作流。

CDN1
未经允许不得转载:首席AI分享圈 » LangChain vs. LangGraph:官方告诉你该如何选择

首席AI分享圈

首席AI分享圈专注于人工智能学习,提供全面的AI学习内容、AI工具和实操指导。我们的目标是通过高质量的内容和实践经验分享,帮助用户掌握AI技术,一起挖掘AI的无限潜能。无论您是AI初学者还是资深专家,这里都是您获取知识、提升技能、实现创新的理想之地。

联系我们
zh_CN简体中文