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,但扎实掌握其基础知识肯定会有所帮助。