LangChain与LangGraph:大模型应用开发中的链与图架构解析
如果你刚开始接触大语言模型应用开发大概率会同时遇到 LangChain 和 LangGraph 这两个名字。它们都带着“Lang”前缀都出现在各种教程和项目里甚至很多文章会把它们混在一起讲。这很容易让人困惑它们到底是一个东西的两个部分还是两个完全不同的工具我应该先学哪个我的项目到底该用哪个这种困惑非常普遍但背后的原因其实很简单LangChain 和 LangGraph 解决的是大模型应用开发中两个不同层级、但又紧密相关的问题。一个帮你“组装”静态的、线性的任务链另一个帮你“编排”动态的、有状态的、可能循环的工作流。理解这个核心区别远比记住一堆 API 调用更重要。今天我们就用最直白的方式帮你理清 LangChain 和 LangGraph 的从属关系、核心区别以及各自的适用场景。无论你是零基础的新手还是已经用过 LangChain 但对 LangGraph 感到好奇的开发者这篇文章都会给你一个清晰的路线图。1. 先搞明白它们各自的“本职工作”组装零件 vs. 设计流水线要理解关系首先要抛开名字看看它们各自被设计出来是干什么的。LangChain 的核心是“链”Chain。你可以把它想象成一个高级的“胶水”或者“组装工具箱”。大模型本身就像一个功能强大但有点“傻”的万能工人它很能干但不知道先干什么后干什么也不知道怎么跟数据库、搜索引擎、计算器这些专业工具配合。LangChain 的作用就是帮你定义好一套固定的工作流程也就是“链”告诉这个工人“你先去数据库查资料Retrieval然后把查到的资料和用户问题一起给我Combining我再根据这些信息生成最终答案Generation。” 这个过程通常是线性的、一步接一步的像一个预设好的剧本。它的重点是把不同的模块模型、工具、记忆、数据源连接成一个可执行的、端到端的应用程序。LangGraph 的核心是“图”Graph。它解决的是一个更复杂的问题当你的工作流程不是一条直线而是一个需要根据中间结果动态决定下一步怎么走的网络时该怎么办比如一个客服机器人需要根据用户情绪决定是安抚还是转接一个数据分析任务需要循环执行“查询-判断-再查询”直到满足条件一个游戏NPC需要根据对话历史和当前状态选择不同的行为分支。LangGraph 允许你定义多个“节点”Node每个节点执行特定任务比如调用模型、运行工具、更新状态然后用“边”Edge来定义节点之间的流转规则。最关键的是流转规则可以基于上一个节点的执行结果来动态决定这就形成了“有状态”的、可能包含循环或条件分支的工作流。它更像是在设计一个智能流水线或一个决策流程图。所以最形象的比喻是LangChain 帮你把螺丝刀、扳手、电钻各种工具组装成一个好用的“多功能螺丝刀”一个链而 LangGraph 则帮你设计一整条汽车装配流水线这条线上有多个工位节点并且能根据上一道工序的结果动态决定下一辆车是送去喷漆还是直接检测有条件的工作流。2. 理清从属关系LangGraph 是 LangChain 生态中的“高级模块”从项目归属上看关系非常明确LangGraph 是 LangChain 项目旗下的一个库。你可以认为 LangChain 是一个“全家桶”里面包含了很多子工具langchain-core: 基础抽象和接口。langchain: 主库包含了大量的链Chains、代理Agents、检索器Retrievers等核心组件。langgraph: 专门用于构建有状态、多参与者的工作流图。还有其他如langchain-community社区贡献集成、langchain-text-splitters文本处理等。因此在安装时你通常会pip install langchain langgraph技术上的从属与互补基础依赖LangGraph 构建在 LangChain 的核心抽象之上。一个 LangGraph 的节点Node其内部完全可以执行一个 LangChain 的链Chain或者调用一个 LangChain 的工具Tool。也就是说LangGraph 用 LangChain 的“零件”来构建更复杂的“机器”。功能演进在 LangGraph 出现之前LangChain 用“代理”Agent来模拟一些简单的动态决策。但代理的复杂逻辑隐藏在内部难以定制和可视化。LangGraph 可以看作是对“代理”模式的一种显式化、模块化和增强化的实现。它把代理内部隐式的决策逻辑变成了外部可清晰定义和调试的图结构。使用场景对于简单的、线性的任务直接用 LangChain 的链就足够了。只有当你需要处理复杂的、有状态的、带循环或分支的逻辑时才需要请出 LangGraph。简单来说LangChain 提供了构建智能应用的基础积木和简单组合方式链而 LangGraph 提供了用这些积木搭建复杂、动态系统的蓝图和引擎图。3. 核心区别对比一张表看清何时该用谁光说概念可能还是有点模糊我们通过一个具体的对比表格从多个维度来看它们的区别特性维度LangChain (链)LangGraph (图)核心抽象链 (Chain)将多个组件按固定顺序连接。图 (Graph)由节点(Node)和边(Edge)组成支持条件流转。工作流状态无状态 (Stateless)每次调用独立不自动保留中间状态需额外配置记忆。有状态 (Stateful)内置状态管理在整个图执行过程中传递和更新上下文。执行流程线性/定向A - B - C像执行一个函数。动态/条件性根据节点结果决定下一步走X、Y还是Z甚至循环回到A。复杂度相对简单适合定义明确、步骤固定的任务。相对复杂适合需要决策、循环、多分支的复杂场景。可视化较难直观展示链的内部步骤。原生支持可视化可以将整个工作流图渲染出来便于理解和调试。典型应用- 问答链检索后生成- 文档总结链- 简单数据提取链- 复杂对话机器人带状态和分支- 多步骤决策系统- 循环执行直到满足条件的数据处理- 模拟仿真如游戏NPC学习曲线较低概念直观易于上手构建简单应用。较高需要理解图、节点、边、状态管理等概念。与代理关系包含“代理”作为实现动态性的一种但较黑盒。可视为“代理”的显式、可定制化实现。甚至可以用 LangGraph 来构建更强大的自定义代理。一个更具体的例子客服对话系统用 LangChain你可以构建一个“检索增强生成RAG链”。用户提问 - 检索知识库 - 生成回答。这个流程每次都是固定的。用 LangGraph你可以构建一个完整的对话流程。用户提问 - 节点A意图识别- 根据意图边决定路由如果是“查询”走到节点BRAG链如果是“投诉”走到节点C安抚并记录工单如果是“闲聊”走到节点D闲聊模式。节点C执行后可能还会根据用户情绪边决定是否循环回节点A继续安抚或走到结束节点。整个对话的历史和状态比如用户是否已生气都在图中被维护和传递。4. 零基础上手路径从链到图一步步来如果你是完全的新手按照以下路径学习可以避免很多困惑第一步先用 LangChain 搞定“单次任务”不要一开始就想着复杂的工作流。你的第一个目标应该是环境搭建安装langchain和你的大模型API包如openai。Hello World学会用ChatModel发起一次最简单的对话。构建第一个链尝试一个经典的LCELLangChain Expression Language链比如prompt | model | output_parser。感受一下如何把提示词、模型调用和输出解析串起来。引入工具尝试让链调用一个简单的工具比如计算器或者网络搜索需要配置API。尝试代理用 LangChain 内置的create_react_agent体验一下代理如何自动选择工具。这时你会初步感受到“动态性”。关键体会在这一步你要理解PromptTemplate、LLM、Tool、Chain这些核心组件是如何通过 LCEL 的管道符 (|) 组合在一起的。这是所有后续工作的基础。第二步当链不够用时认识 LangGraph当你发现你的需求开始出现以下信号时就该考虑 LangGraph 了“如果……那么……”需要根据模型或工具的输出来决定下一步做什么。“重复直到……”需要循环执行某些步骤直到满足某个条件比如解析结果合格。“记住之前……”需要在整个多轮交互中维护一个不断更新的状态比如对话历史、已执行步骤列表、临时变量。“多角色协作”需要模拟多个“参与者”可以是不同的模型实例也可以是工具按照一定规则进行交互。第三步从 LangGraph 的核心概念学起学习 LangGraph不要直接复制复杂例子。从最核心的三个概念入手状态 (State)定义一个字典类型明确你的工作流需要跟踪哪些信息。比如{messages: list, step_count: int, data: dict}。节点 (Node)一个普通的函数它接收当前状态执行一些操作比如调用一个 LangChain 链然后返回一个对状态的更新。这是你放置业务逻辑的地方。def call_model(state: State): # 从state中获取消息 messages state[“messages”] # 调用模型这里可能封装了一个LangChain链 response chat_model.invoke(messages) # 返回更新后的状态部分 return {“messages”: messages [response]}边 (Edge)定义规则决定一个节点执行完后下一个该执行哪个节点。可以是固定的always_go_to_node_b也可以是条件的lambda state: node_b if some_condition else node_c。一个极简的 LangGraph 工作流构建流程如下from langgraph.graph import StateGraph, END # 1. 定义状态类型 class State(TypedDict): messages: list # 2. 创建图构建器 builder StateGraph(State) # 3. 添加节点上面定义的call_model函数 builder.add_node(“model”, call_model) # 4. 设置入口点 builder.set_entry_point(“model”) # 5. 添加边这里简单设置为执行完model后就结束 builder.add_edge(“model”, END) # 6. 编译图得到可执行对象 graph builder.compile()现在你可以像调用函数一样运行这个图final_state graph.invoke({“messages”: [“Hello”]})。第四步实现循环和分支在上面极简图的基础上实现复杂逻辑循环添加一个边从某个节点指回它自己或之前的节点。通常需要配合一个“条件节点”来判断是否继续循环。分支添加多个不同的节点并使用add_conditional_edges方法根据某个节点的输出结果决定下一步走哪条边。5. 项目选型决策指南我到底该用哪个最后我们来回答最实际的问题。面对一个新项目如何选择毫不犹豫选择 LangChain 的情况你的任务流程是线性、确定、无状态的。例如输入文档 - 分割 - 向量化 - 存储这是一条预处理流水线用链清晰明了。你需要快速构建一个RAG 问答系统流程就是“检索 - 生成”。你正在学习大模型应用开发想先理解基础组件模型、提示词、检索器、输出解析器如何协同工作。项目原型期追求最快速度验证核心功能。需要考虑引入 LangGraph 的情况你的应用本质是一个有状态的对话系统需要根据完整对话历史做决策。你需要构建一个复杂的多步骤代理这个代理需要规划、执行工具、检查结果、并可能重新规划。业务流程中天然存在**“是/否”判断、循环审批、条件分支**。例如“生成报告 - 审核是否通过 - (是)发送邮件 / (否)返回修改”。你需要清晰的可视化来向团队或客户解释整个工作流的逻辑。你对工作流的可控性、可调试性要求极高希望每一步的流转都明确定义和可见。一个实用的建议从 LangChain 链开始。当你在用链开发的过程中发现代码里开始出现大量的if...else...来控制流程或者发现需要手动维护一个全局变量来传递状态时这就是一个强烈的信号——你的项目可能更适合用 LangGraph 来重构。此时引入 LangGraph不仅能简化代码还能使你的业务逻辑变得更加清晰和健壮。总结一下 LangChain 是你的基础工具箱和粘合剂用于组装静态功能单元。而 LangGraph 是高级的流程设计器和执行引擎用于编排动态的、智能的业务工作流。它们不是二选一的关系而是相辅相成。在复杂的生产级应用中你很可能同时使用两者用 LangChain 构建链和工具再将它们作为节点组装进 LangGraph 的蓝图中。理解这种层次关系你就能在技术选型和架构设计上做出更明智的决策。

相关新闻

Java转大模型:会调API的人很多,能搞定权限日志的为什么少?

Java转大模型:会调API的人很多,能搞定权限日志的为什么少?

聊《Java转大模型,真正值钱的为什么不是会调 API?》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要最近面试了几个从Java后端转大模型的同学,有个现象挺有意思:简…

2026/10/14 13:41:05 阅读更多 →
提升聊天情绪感与趣味性的心理学与语言学实践指南

提升聊天情绪感与趣味性的心理学与语言学实践指南

1. 项目概述:为什么我们需要“情绪感”与“趣味性”的聊天?聊天的本质是什么?是信息交换吗?是,但远不止于此。回想一下那些让你感觉如沐春风、意犹未尽的对话,和那些让你只想尽快结束、味同嚼蜡的交流&…

2026/10/8 5:46:38 阅读更多 →
AI桌面智能体:从零部署到自动化办公实战指南

AI桌面智能体:从零部署到自动化办公实战指南

这次我们来看一个能直接操控电脑的 AI 智能体项目。它不是一个简单的聊天机器人,而是一个能理解你的自然语言指令,并像真人一样操作鼠标、键盘,在真实电脑桌面环境中完成任务的智能系统。想象一下,你只需要说“帮我打开浏览器&…

2026/10/6 23:54:31 阅读更多 →

最新新闻

ORA-12154排查全攻略:TNS解析原理与Python cx_Oracle连接实践

ORA-12154排查全攻略:TNS解析原理与Python cx_Oracle连接实践

上周有个同事跑过来,说自己的数据同步脚本突然连不上库了,Python里抛出的错误就一行:ORA-12154: TNS: 无法解析指定的连接标识符。他百思不得其解——自己在数据库管理工具里用同样的用户名、密码和服务名都能连,代码这段时间也没…

2026/10/15 20:06:30 阅读更多 →
SVM支持向量机实战:基于sklearn红酒数据集分类与调参详解

SVM支持向量机实战:基于sklearn红酒数据集分类与调参详解

前阵子把手头一个支持向量机分类项目收了个尾,项目文件名就叫“SVM支持向量机sklearn-wine红酒数据集代码V1”。这版代码没有神经网络,没有复杂特征工程,就是标准的加载数据、样本切分、训练模型、评估效果四步走,但恰恰是这套最朴…

2026/10/15 20:06:30 阅读更多 →
Jupyter QtConsole:轻量级Python交互式编程的隐藏利器

Jupyter QtConsole:轻量级Python交互式编程的隐藏利器

1. 为什么我还在用这个"老古董"写Python第一次跟人聊起Jupyter QtConsole,对方的表情通常是"啊?那玩意儿不是十年前的东西吗"。确实,现在打开任何一个技术社区,满屏都是VS Code、Cursor、PyCharm的讨论&#…

2026/10/15 20:06:30 阅读更多 →
Verilog generate语法详解:从重复例化到条件生成的工程实践

Verilog generate语法详解:从重复例化到条件生成的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 20:06:30 阅读更多 →
C++类设计实战:从Point到Rectangle,避开组合与值语义的坑

C++类设计实战:从Point到Rectangle,避开组合与值语义的坑

1. 从坐标点到矩形:一个看似简单的类设计练习,藏着多少坑"C创建Point类表示坐标点,点构线线构矩形"——这个标题看起来像是课本上的一道课后习题,但我跟你讲,真动手写起来,能踩的坑远比想象中多。…

2026/10/15 20:06:30 阅读更多 →
Apollo 11.0:面向车规级量产的自动驾驶仿真与通信架构解析

Apollo 11.0:面向车规级量产的自动驾驶仿真与通信架构解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 20:05:29 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →