LangChain 与 LangGraph:如何选择合适的工具

最近很多做Agent开发的朋友问我:

LangChain 和 LangGraph 有啥区别?

甚至还有更直白的:

是不是就像 链表 vs 图?

我的回答:非常形象。

  • LangChain ≈ 链表(单向线性)

  • LangGraph ≈ 有向图(DAG)

下面的内容翻译自 https://www.js-craft.io/blog/langchain-vs-langgraph/

LangChain 和 LangGraph 经常引起混淆。我能理解为什么!

它们不仅名称相似,而且由同一支团队开发并具有共同的目的:与LLM(大型语言模型)协同工作并进行集成。

更有趣的是,在某个特定点,一个可以取代另一个。

把它们想象成锯子和斧头。两者都用于切割,但根据具体工作,其中一种工具可能比另一种更有效。在某些情况下,你甚至可以同时使用两种工具来获得最佳效果。

我认为下图很好地解释了我们可以定义的 LangChain 与 LangGraph 的流程类型的差异:

现在,回到正文。

顾名思义,LangChain 是基于"链"构建的。"链"指的是顺序工作流,其中每个步骤都遵循预先定义的顺序。它非常适合 A → B → C 类型的流程,其中每个步骤都紧接着前一个步骤。

这是定义一个非常简单的链的代码:

复制代码
const chain = pointA.pipe(pointB).pipe(pointC)

另一方面,LangGraph 支持动态分支流程。它允许在每一步进行决策,根据条件启用 A → B 或 C 之类的路径。这使得它非常适合 AI 代理用例,其中 LLM 需要动态确定下一步操作。

例如,上述结构的 LangGraph 代码如下所示:

复制代码
const graph = new StateGraph()
 .addNode("A", functionA)
 .addNode("B", functionB)
 .addNode("C", functionC)
 .addConditionalEdges("A", makeDecision, ["B", "C])

考虑以下提示:

复制代码
Translate this text into English and summarize it: 
<< long text in Spanish here >>

这是顺序链 A->B->C 的经典示例,其中:

  • A 正在翻译文本

  • B 总结翻译文本

  • C 输出结果

在链中,一个步骤的输出被用作下一步的输入。

现在,我们来看一个AI Agent助手帮助用户选择周末活动的场景:

复制代码
You are an AI assistant helping a user choose a weekend activity.  
Step 1: Ask if they prefer indoors or outdoors.  
- If indoors, do a web search and suggest a movie or a book 
- If outdoors, check the weather and 
  - If the weather is good, use Google Maps to suggest a hiking track  
  - If it rains, use skyscanner.com to search for a flight. 
Step 2: Output the final recommendation.

在这种情况下,流程会根据用户输入和外部条件进行分支。AI 代理可以动态调用不同的工具,例如网页搜索、天气 API、谷歌地图或天巡。这正是 LangGraph 所擅长的工作流程。

顺便提一下,LangChain 确实提供了一些类似RunnableMap的分支功能。但 LangGraph 在处理这类情况时更加符合人体工程学。

这些工具并非互相排斥,它们也可以协同工作。例如,在 LangGraph 结构中,一个节点可以包含使用 LangChain 实现的一系列步骤。

但总体思路是要记住:

  • LangChain将成为您使用的工具,以添加 LLM 集成和更简单的直接流程

  • 而LangGraph是定义 AI 智能体流程的完美工具,有时 LLM 会决定接下来调用图的哪个节点。

我认为,最好先了解 LangChain 的基础知识,然后再学习 LangGraph。虽然在使用 LangGraph 创建智能体之前,你不需要完全掌握 LangChain,但扎实掌握其基础知识肯定会有所帮助。