当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/333186.html

相关文章:

  • RK3588 recovery模式和misc分区介绍
  • Ant-Design AUpload如何显示缩略图;自定义哪些类型的数据可以使用img预览
  • HTTP 请求方法:GET 与 POST
  • 应用层协议——HTTP
  • Jenkins+Python自动化持续集成详细教程
  • 神经网络设计中关于BN归一化(Normalization)的讨论
  • 扣子(Coze),开源了!Dify 天塌了
  • 淡季磨剑,旺季出鞘!外贸管理软件让淡季备货与旺季冲刺无缝衔接
  • Mini MAX AI应用矩阵测评报告——基于旗下多款产品的综合体验与行业价值分析
  • 亚马逊“十省联动”4.0:产业带跨境转型的全维度赋能路径
  • Linux操作系统--多线程(锁、线程同步)
  • 优秘企业智脑 AISEO 技术拆解:从算法逻辑到 GEO 优化,如何重构企业智能营销底层能力?
  • JVM执行引擎深入理解
  • Redis核心架构
  • Java学习第一百三十六部分——finally块执行时机
  • 如何回答研究过MQ的源码吗
  • Jenkins 环境部署
  • 在多语言大模型中保留文化细微差别:超越翻译
  • IPv4地址和IPv6地址:解析两代互联网协议的本质差异
  • 【swift开发】SwiftUI概述 SwiftUI 全面解析:苹果生态的声明式 UI 革命
  • DevEco Studio 6.0.0 元服务页面跳转失败
  • 机器翻译:模型微调(Fine-tuning)与调优详解
  • leetcode 1780. 判断一个数字是否可以表示成三的幂的和 中等
  • 新手入门Makefile:FPGA项目实战教程(二)
  • 达梦数据库使用控制台disql执行脚本
  • 【uni-app】根据角色/身份切换显示不同的 自定义 tabbar
  • 用Qt自带工具windeployqt快速打包程序
  • python自学笔记9 Seaborn可视化
  • ​​金仓数据库KingbaseES V9R1C10安装教程 - Windows版详细指南​
  • AXI4-Stream Switch IP核的用法