LangChain vs LangGraph:从链到图的LLM应用架构选型
# LangChain vs LangGraph从链到图的LLM应用架构选型## 一、问题的起点线性链什么时候会撞墙2023 年 LangChain 0.0.x 刚发布时它解决的问题很具体把「Prompt → LLM → 解析」这条链路标准化。开发者不用再手写字符串拼接、不用为每个模型单独写调用代码。LCELLangChain Expression Language在 0.1 版本引入后| 组合子配合 invoke / batch / stream / astream 四套统一接口确实让 RAG 管道和聊天机器人的开发成本大幅下降。但生产环境很快暴露出边界。一个典型的客服 Agent 需要先判断意图命中知识库就走检索检索置信度低就改写 query 重试循环涉及退款要走人工审批中断审批通过后调用工单 API外部副作用失败要回滚重来。这些需求里有三个词——**循环、中断、状态回滚**——线性 DAG 一个都给不了。LangGraph 就是为这个边界设计的。2025 年 10 月 LangChain 1.0 与 LangGraph 1.0 同期发布后两者的关系已经不是「二选一」LangChain 1.0 的 create_agent 直接构建在 LangGraph 运行时之上。理解它们的分层关系比记住功能对比表更有价值。## 二、执行模型差异DAG 与状态图**LangChain 的执行模型是单向数据流。** 一个 Runnable 序列编译成有向无环图数据从入口流到出口每个节点只拿到上游的输出不感知全局状态。分支只能靠 RunnableBranch 或 route 预先声明运行时无法根据中间结果动态改变拓扑。**LangGraph 的执行模型是 Pregel 风格的超步super-step。** 它把流程建模为 StateGraph节点是普通 Python 函数边是状态转移支持条件边、并行扇出Send API和**反向边**。反向边就是循环——这恰恰是 Agent 的核心。一次工具调用失败图可以退回 agent 节点重新推理这在 LangChain 里只能靠外部 while 循环硬编码。python# langgraph 1.0.xfrom langgraph.graph import StateGraph, START, ENDbuilder StateGraph(State)builder.add_node(agent, call_model)builder.add_node(tools, tool_node)builder.add_edge(START, agent)builder.add_conditional_edges(agent, should_continue, {tools: tools, end: END})builder.add_edge(tools, agent) # 反向边构成 ReAct 循环这段代码的价值不在于「写法更花哨」而在于**循环被声明为图的拓扑结构**而不是散落在控制流里。调试时你看到的是一张可序列化的图而不是一堆嵌套的 if/for。## 三、状态管理隐式上下文 vs 显式 reducer这是两者最深层的分野也是最容易被低估的一点。LangChain 通过 memory 模块后迁移到 LangGraph 的 checkpoint自动传递上下文本质是「把历史消息塞进 prompt」。开发者对「哪些字段被保留、如何合并、何时截断」几乎没有控制权。多轮对话里想同时维护 messages、user_profile、retrieved_docs、retry_count 四类状态就得自己写容器类。LangGraph 把这个过程显式化了。状态用一个 TypedDict 声明每个字段通过 Annotated[..., reducer] 指定合并策略python# langgraph 1.0.xfrom typing import Annotatedfrom typing_extensions import TypedDictfrom langgraph.graph.message import add_messagesclass State(TypedDict):messages: Annotated[list, add_messages] # 追加而非覆盖retry_count: int # 默认覆盖plan: list[str]add_messages 会按 message id 去重并追加这正是多轮对话需要的语义。而 retry_count 走默认的覆盖策略节点只返回增量 {retry_count: 1}框架负责合并。**状态更新变成了一等公民可观测、可测试、可持久化。**配合 checkpointer每个超步结束后状态快照落盘。MemorySaver 用于开发SqliteSaver 用于单机langgraph-checkpoint-postgres 2.x 用于生产。有了快照就有时间旅行传入历史 checkpoint_id 就能回放任意一步这对排查「Agent 为什么第三次调用工具时走错了分支」这类问题几乎是刚需。## 四、代码对比同一个 RAG 任务两种写法**LangChain 1.0LCEL**python# langchain-core 1.0.x, langchain-openai 1.0.xfrom langchain_openai import ChatOpenAI, OpenAIEmbeddingsfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import RunnablePassthroughretriever vectorstore.as_retriever(search_kwargs{k: 4})prompt ChatPromptTemplate.from_template(仅依据上下文回答无法回答时回复不知道。\n上下文{context}\n问题{question})chain ({context: retriever, question: RunnablePassthrough()}| prompt| ChatOpenAI(modelgpt-4o-mini, temperature0)| StrOutputParser())chain.invoke(LangGraph 的 checkpointer 解决什么问题)大约 15 行覆盖 80% 的 RAG 场景。这是 LangChain 依然是原型首选的原因——学习曲线低stream 和 batch 免费获得。**LangGraph 1.0带人工审批的 Agent**python# langgraph 1.0.x, langgraph-checkpoint-sqlite 2.xfrom langgraph.graph import StateGraph, START, ENDfrom langgraph.checkpoint.sqlite import SqliteSaverfrom langgraph.types import interrupt, Commanddef human_approval(state: State):decision interrupt({tool_calls: state[messages][-1].tool_calls})if decision ! approve:return {messages: [reject_message(state)]}return tool_node(state)builder StateGraph(State)builder.add_node(agent, call_model)builder.add_node(approval, human_approval)builder.add_node(tools, tool_node)builder.add_edge(START, agent)builder.add_conditional_edges(agent, should_continue,{approval: approval, tools: tools, end: END})builder.add_edge(tools, agent)graph builder.compile(checkpointerSqliteSaver.from_conn_string(agent.sqlite))config {configurable: {thread_id: user-42}}graph.invoke({messages: [(user, 把这周日志汇总成周报并发送)]}, config)# 图在 interrupt 处挂起进程可以退出graph.invoke(Command(resumeapprove), config) # 数小时后从断点继续interrupt() 是 LangGraph 相对 LangChain 最实用的能力。LangChain 时代做人机协同标准做法是把整个状态 dump 到 Redis等审批回调再重新组装上下文——脆弱且难测。LangGraph 把「挂起—恢复」做进了运行时Command(resume...) 从最后一个 checkpoint 继续执行中间不需要保持进程存活。## 五、LangChain 与 LangGraph 能力对照| 维度 | LangChain 1.0 | LangGraph 1.0 || --- | --- | --- || 架构 | 线性工作流组件串联 | 图结构节点边支持环与分支 || 流程形态 | 逐步顺序执行 | 迭代、循环、可重访 || 状态管理 | 隐式靠 memory/context 模块传递 | 显式 TypedDict reducer || 学习曲线 | 低半天可上手 | 陡需要图编程思维 || 人工介入 | 需手写脚本定制 | interrupt() 原生支持 || 复杂度承载 | 简单管道分支靠 workaround | 原生分支、并行、循环 || 适用场景 | 原型、RAG、文档处理、聊天机器人 | 生产级多 Agent、长时状态化应用 |注意表中「隐式 vs 显式」这一行。它不是程度差异而是**能力边界差异**状态不可见就无法在任意点暂停、恢复和回放不能暂停恢复就做不了需要人类审批或跨天运行的业务。## 六、选型决策判断标准可以收敛成三个问题**流程里有没有循环** 有 query 改写重试、工具调用失败重试、自我反思迭代选 LangGraph。纯一次性的检索问答LangChain 足够。**单次会话是否需要跨进程存活** 需要等待人工审批、需要断点续跑、需要用户次日回来接着聊选 LangGraph Postgres checkpointer。**是否需要多个 Agent 分工** 规划者、执行者、审查者各司其职并可能并行探索再汇总只有 LangGraph 的 Send API 和子图能自然表达。反过来如果需求是「上传 PDF → 切片 → 向量化 → 问答」硬上 LangGraph 只会增加维护成本。图的表达能力有代价状态 schema、reducer 冲突、checkpoint 序列化、超步调优都是额外工作量。两者也能混用。LangGraph 的节点内部完全可以是一段 LCEL 链——把 chain.invoke 包进节点函数即可。实践中常见的分层是**LangGraph 管流程与状态LangChain 管单步内的模型调用与检索**。LangChain 1.0 的 create_agent 就是这个思路的官方实现。## 七、收敛趋势LangChain 1.0 把 agent 抽象收敛到 LangGraph 运行时之上同时把 langchain-core 稳定为 1.0.x 接口层langchain-community 中的集成逐步迁往独立包langchain-openai、langchain-anthropic 等均按 1.0.x 节奏发版。这个动作说明维护者自己也承认**线性链是入口状态图才是终点。**对团队而言现实建议是原型阶段用 LangChain 快速验证 prompt 与检索质量一旦需求出现「重试」「审批」「多轮规划」中的任意一个词就该迁移到 LangGraph。迁移成本主要在状态 schema 的重新设计而不是代码重写——把现有的 LCEL 链原样塞进节点先跑通再逐步把散落在函数闭包里的状态提取到 State 中。选框架的本质是选状态模型。状态越复杂、生命周期越长就越需要一张显式的图。

相关新闻

面向对象程序设计-类与对象3-构造函数析构函数的执行

面向对象程序设计-类与对象3-构造函数析构函数的执行

作者 代码修行单位 湖南工程学院计算机与通信学院要求实现构造函数和析构函数的定义&#xff0c;并以此观察构造函数和析构函数的执行时机。裁判测试程序样例&#xff1a;#include<iostream> using namespace std; class CTest{int a,b; public:CTest(int , int);~CTest(…

2026/10/11 8:30:50 阅读更多 →
独立开发者为什么做不好营销:三大困境与工程化解法 | RiseClaw玄策

独立开发者为什么做不好营销:三大困境与工程化解法 | RiseClaw玄策

独立开发者为什么做不好营销&#xff1a;三大困境与工程化解法 | RiseClaw玄策 产品改到第 37 个版本&#xff0c;推广文却一篇都没发——这是很多独立开发者的日常。 白天写代码、修 bug、回工单&#xff0c;推广永远排在「明天」。据 Tech星球今年 6 月报道&#xff0c;截至 …

2026/10/16 10:38:54 阅读更多 →
AI安全扫描神器:一键修复网站漏洞,TaoToken统一Key接入实战

AI安全扫描神器:一键修复网站漏洞,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/11 19:06:50 阅读更多 →

最新新闻

《华为团队工作法》华为人才管理和薪酬激励:构建四位一体点燃员工热情的激励体系

《华为团队工作法》华为人才管理和薪酬激励:构建四位一体点燃员工热情的激励体系

本 115 页 PPT 适配企业人才管理、薪酬激励、干部管理类咨询方案与 HR 培训课件编制。基于华为人才管理体系核心实践&#xff0c;系统拆解人才选配、评估、干部任用、人才成长、文化锻造、薪酬激励、全面激励、健康成长八大模块。涵盖 STAR 行为面试、人才搭配四宫格、绩效能力…

2026/10/18 14:57:52 阅读更多 →
STM32智能家居监测系统实战:从传感器选型到MQTT上云完整代码解析

STM32智能家居监测系统实战:从传感器选型到MQTT上云完整代码解析

简介&#xff1a;基于STM32微控制器的智能家居监测系统代码包&#xff0c;面向嵌入式与物联网开发者&#xff0c;解决室内温度、湿度、光照、PM2.5和甲醛等环境参数的实时采集与远程查看问题。整体设计涵盖多传感器接入、ESP8266 WiFi上云、QT上位机可视化以及手动/自动双模式控…

2026/10/18 14:57:52 阅读更多 →
具身智能多维协同优化研究(16):TVA-VLA-World-FRA系统集成与测试方法

具身智能多维协同优化研究(16):TVA-VLA-World-FRA系统集成与测试方法

前沿技术探索&#xff1a;FRA核心定义与设计理念FRA&#xff08;Factorized Robotic Agent, FRA&#xff0c;亦称&#xff1a;因式分解机器人智能体&#xff09;是一套因式化数实融合一体化新型智能系统&#xff0c;核心设计理念是全链路系统解耦&#xff0c;将机器人作业的感知…

2026/10/18 14:57:52 阅读更多 →
Amlogic T982/T968 开发指南:选型、编译、烧录与调试避坑

Amlogic T982/T968 开发指南:选型、编译、烧录与调试避坑

简介&#xff1a;Amlogic T982/T968技术开发文档是一份面向技术支持工程师和软件开发工程师的官方技术手册&#xff0c;聚焦基于BDS Android R SDK的芯片方案开发&#xff0c;适合需要完成Android系统定制、底层调试及产线烧录的嵌入式开发者。内容覆盖SDK代码获取与版本编译、…

2026/10/18 14:57:52 阅读更多 →
专科生论文写作难?用AI学术写作工具从选题到降重全流程拆解

专科生论文写作难?用AI学术写作工具从选题到降重全流程拆解

专科生写论文&#xff0c;真的是一道跨不过去的坎。选题没方向&#xff0c;框架搭不起来&#xff0c;语言写得像聊天&#xff0c;查重一改就废。我见过太多同学在宿舍对着电脑熬到凌晨&#xff0c;导师一句“重改”就打回原点。如果你正卡在这个状态里&#xff0c;那么这篇关于…

2026/10/18 14:57:52 阅读更多 →
Oracle数据库时区版本调整实战:DBMS_DST脚本集与DST补丁避坑指南

Oracle数据库时区版本调整实战:DBMS_DST脚本集与DST补丁避坑指南

简介&#xff1a;这份资源是面向Oracle数据库管理员与运维工程师的时区版本调整脚本包&#xff0c;用于将Oracle数据库的时区版本升级至最新&#xff0c;通常需配合官方时区补丁一起使用&#xff0c;适合需要处理时区数据、排查时区相关报错的DBA参考。压缩包内共4个SQL脚本文件…

2026/10/18 14:56:52 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →