LangGraph 智能体开发实战:从链式编排到图式编排

📅 2026/8/14 4:32:10
LangGraph 智能体开发实战:从链式编排到图式编排
这里写自定义目录标题欢迎使用Markdown编辑器引言当 Chain 不够用的时候一、为什么需要图式编排二、LangGraph 的核心概念2.1 State状态是图的灵魂四、多 Agent 协作与并行五、工程化实践要点六、总结新的改变功能快捷键合理的创建标题有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能丰富你的文章UML图表流程图FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好 这是你第一次使用# LangGraph 智能体开发实战从链式编排到图式编排引言当 Chain 不够用的时候如果你在过去一年里接触过大模型应用开发LangChain这个名字大概率不会陌生它几乎成了快速搭建 RAG 或简单工具调用应用的脚手架代名词。但当你真正试图用它构建一个逻辑复杂、状态持久、需要根据中间结果动态调整执行路径的智能体Agent时可能会感到力不从心。那种感觉就像用乐高积木搭一个静态模型很顺手但要让它动起来还得自己手动去拧发条、调齿轮。这正是 LangGraph 出现的背景。简单来说LangChain 提供的是链Chain——一种线性的、预定义顺序的执行流而 LangGraph 提供的是图Graph——一种可以包含循环、分支和状态管理的执行流。从链到图的跃迁意味着智能体从按剧本走升级到了能自己看地图找路。一、为什么需要图式编排先看一个真实场景用户提出一个模糊的初始请求——“帮我分析上季度的销售数据并给出下季度的预测建议”。这个任务要求智能体自主决定先去数据库拉取数据接着清洗数据再选择分析模型生成报告最后甚至能根据初步报告发现的问题发起新一轮的细化查询。这种带有循环和状态记忆的任务用传统的 Chain 架构来堆砌代码会迅速变得难以维护和调试。因为 Chain 是静态的、线性的无法表达如果结果不理想就重试根据上一步结果决定下一步这类动态逻辑。LangGraph 的核心价值在于把 Agent 的工作流建模为一个有向图。图中的每个节点Node代表一个可执行的动作调用 LLM、执行工具、读写状态边Edge定义了动作执行后的流转条件。整个图共享一个持久化的状态State随着工作流的推进而更新。这种设计天然支持循环、分支、并行和状态管理。二、LangGraph 的核心概念2.1 State状态是图的灵魂状态是 LangGraph 中最核心的概念。它定义了工作流执行过程中需要保存和传递的数据。每个节点执行后都会更新状态后续节点可以访问前面节点的结果。状态的设计直接决定了图的表达能力。fromtypingimportTypedDict,Annotatedfromlanggraph.graphimportStateGraphclassAgentState(TypedDict):messages:list# 对话历史task:str# 当前任务data:dict# 中间数据retries:int# 重试计数### 2.2 Node节点是执行单元节点是图的基本执行单元可以是调用 LLM、执行工具、处理数据等任意函数。每个节点接收状态作为输入返回状态更新作为输出。### 2.3 Edge边定义流转逻辑边定义了节点之间的流转关系。LangGraph 支持两种边普通边固定流转和条件边根据状态动态决定流向。条件边是实现智能决策的关键——模型判断结果是否满意决定是继续还是结束。### 2.4 Checkpoint检查点与持久化LangGraph 内置了检查点机制可以在任意节点保存状态快照。这意味着任务中断后可以从断点恢复支持时间旅行调试回放任意步骤支持人机协作在关键节点暂停等待人工确认。## 三、实战构建一个带循环和工具调用的 Agent下面用 LangGraph 构建一个能自主完成数据分析任务的 Agent它包含三个节点规划Plan、执行Execute、检查Check并通过条件边实现循环。 pythonfromlanggraph.graphimportStateGraph,ENDfromlangchain_openaiimportChatOpenAI llmChatOpenAI(modelgpt-4o,temperature0)# 节点 1规划defplan_node(state):taskstate[task]planllm.invoke(f为任务制定执行计划{task})return{plan:plan.content,retries:state.get(retries,0)}# 节点 2执行defexecute_node(state):planstate[plan]resultllm.invoke(f按计划执行{plan})return{data:result.content}# 节点 3检查defcheck_node(state):datastate[data]verdictllm.invoke(f检查结果是否满足要求只回答 yes 或 no{data})return{satisfied:verdict.content.strip().lower()yes}# 条件边根据检查结果决定是否重试defshould_continue(state):ifstate.get(satisfied):returnendifstate.get(retries,0)3:returnendreturnretry# 构建图graphStateGraph(AgentState)graph.add_node(plan,plan_node)graph.add_node(execute,execute_node)graph.add_node(check,check_node)graph.set_entry_point(plan)graph.add_edge(plan,execute)graph.add_edge(execute,check)graph.add_conditional_edges(check,should_continue,{end:END,retry:plan})appgraph.compile()resultapp.invoke({task:分析上季度销售数据并给出预测,messages:[]})print(result[data])这段代码展示了 LangGraph 最核心的能力循环。当检查节点判定结果不满足要求时流程会回到规划节点重新执行直到满意或达到重试上限。这种规划-执行-检查-再规划的循环正是 Agent 区别于普通 Chain 的本质特征。四、多 Agent 协作与并行LangGraph 的图模型天然支持多 Agent 协作。你可以把多个 Agent 作为图中的节点通过边定义它们的协作关系顺序协作Agent A 完成后结果传给 Agent B。适合流水线式任务。并行协作多个 Agent 同时执行最后汇总结果。适合可以拆分的独立子任务。LangGraph 支持扇出fan-out和扇入fan-in模式。层级协作一个主管Agent 负责任务分解和调度多个工人Agent 执行具体任务。这是最常用的多 Agent 模式。fromlanggraph.graphimportStateGraph# 并行执行两个子任务graph.add_node(researcher,research_agent)graph.add_node(analyst,analysis_agent)graph.add_node(aggregator,aggregate_agent)graph.add_edge(start,researcher)graph.add_edge(start,analyst)graph.add_edge(researcher,aggregator)graph.add_edge(analyst,aggregator)并行协作能显著提升任务完成速度。比如竞品分析任务可以让信息检索 Agent和数据提取 Agent并行工作最后统一汇总整体耗时能缩短一半以上。五、工程化实践要点第一状态设计要克制。状态是图的共享内存设计得越复杂调试越困难。建议只保存必要的数据中间结果及时清理避免状态膨胀。第二善用检查点。生产环境一定要开启检查点持久化这样任务中断可以恢复也方便回放调试。检查点可以存储到 SQLite、PostgreSQL 等外部存储。第三控制循环次数。Agent 循环是烧钱的重灾区。一定要设置最大迭代次数和预算上限防止 Agent 陷入死循环或无限重试。第四可观测性。LangGraph 支持逐步追踪执行过程配合 LangSmith 可以可视化查看每个节点的输入输出。生产环境务必开启追踪否则 Agent 出问题根本无从排查。第五人机协作。对高风险操作删除数据、发送消息、支付在关键节点设置人工确认断点让 Agent 暂停等待人工审批。这是 Agent 落地到生产环境的安全底线。六、总结LangGraph 把 Agent 开发从写代码提升到了设计图的层次。它的核心贡献不是提供了多少现成组件而是建立了一套表达复杂工作流的模型状态驱动、节点执行、条件流转、检查点持久化。这套模型让 Agent 从玩具走向生产成为可能。对于开发者建议的进阶路径是先理解 State、Node、Edge 三个核心概念然后用 LangGraph 重构一个已有的 Chain 应用体会图式编排的优势接着实现带循环和工具调用的 Agent最后尝试多 Agent 协作和检查点持久化。当你掌握了图式编排的思维你会发现 Agent 开发不再是玄学而是一门可以系统化、工程化的技术。Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持除了标准的Markdown编辑器功能我们增加了如下几点新功能帮助你用它写博客全新的界面设计将会带来全新的写作体验在创作中心设置你喜爱的代码高亮样式Markdown将代码片显示选择的高亮样式进行展示增加了图片拖拽功能你可以将本地的图片直接拖拽到编辑区域直接展示全新的KaTeX数学公式语法增加了支持甘特图的mermaid语法1功能增加了多屏幕编辑Markdown文章功能增加了焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置等功能功能按钮位于编辑区域与预览区域中间增加了检查列表功能。功能快捷键撤销Ctrl/CommandZ重做Ctrl/CommandY加粗Ctrl/CommandB斜体Ctrl/CommandI标题Ctrl/CommandShiftH无序列表Ctrl/CommandShiftU有序列表Ctrl/CommandShiftO检查列表Ctrl/CommandShiftC插入代码Ctrl/CommandShiftK插入链接Ctrl/CommandShiftL插入图片Ctrl/CommandShiftG查找Ctrl/CommandF替换Ctrl/CommandG合理的创建标题有助于目录的生成直接输入1次#并按下space后将生成1级标题。输入2次#并按下space后将生成2级标题。以此类推我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。如何改变文本的样式强调文本强调文本加粗文本加粗文本标记文本删除文本引用文本H2O is是液体。210运算结果是 1024.插入链接与图片链接: link.图片:带尺寸的图片:居中的图片:居中并且带尺寸的图片:当然我们为了让用户更加便捷我们增加了图片拖拽功能。如何插入一段漂亮的代码片去博客设置页面选择一款你喜欢的代码片高亮样式下面展示同样高亮的代码片.// An highlighted blockvarfoobar;生成一个适合你的列表项目项目项目项目1项目2项目3计划任务完成任务创建一个表格一个简单的表格是这么创建的项目Value电脑$1600手机$12导管$1设定内容居中、居左、居右使用:---------:居中使用:----------居左使用----------:居右第一列第二列第三列第一列文本居中第二列文本居右第三列文本居左SmartyPantsSmartyPants 是一个文本转换工具主要功能是将普通的 ASCII 标点符号自动转换为更美观的印刷体标点符号。例如原始符号转换后说明引号“引号”直引号变弯引号单引号‘单引号’直单引号变弯单引号--–两个连字符变短破折号---—三个连字符变长破折号...…三个点变省略号创建一个自定义列表MarkdownText-to-HTMLconversion toolAuthorsJohnLuke如何创建一个注脚一个具有注脚的文本。2注释也是必不可少的Markdown将文本转换为HTML。KaTeX数学公式您可以使用渲染LaTeX数学表达式 KaTeX:Gamma公式展示Γ ( n ) ( n − 1 ) ! ∀ n ∈ N \Gamma(n) (n-1)!\quad\forall n\in\mathbb NΓ(n)(n−1)!∀n∈N是通过欧拉积分Γ ( z ) ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) \int_0^\infty t^{z-1}e^{-t}dt\,.Γ(z)∫0∞​tz−1e−tdt.你可以找到更多关于的信息LaTeX数学表达式here.新的甘特图功能丰富你的文章2014-01-072014-01-092014-01-112014-01-132014-01-152014-01-172014-01-192014-01-21已完成进行中计划一计划二现有任务Adding GANTT diagram functionality to mermaid关于甘特图语法参考 这儿,UML图表可以使用UML图表进行渲染例如下面产生的一个序列图王五李四张三王五李四张三李四想了很长时间, 文字太长了不适合放在一行.你好李四, 最近怎么样?你最近怎么样王五我很好谢谢!我很好谢谢!打量着王五...很好... 王五, 你怎么样?关于UML图表语法参考 这儿,流程图链接长方形圆圆角长方形菱形关于Mermaid语法参考 这儿,FLowchart流程图我们依旧会支持flowchart.js的流程图语法Created with Raphaël 2.3.0开始我的操作确认结束yesno关于Flowchart流程图语法参考 这儿.导出与导入导出如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到文章导出生成一个.md文件或者.html文件进行本地保存。导入如果你想加载一篇你写过的.md文件在上方工具栏可以选择导入功能进行对应扩展名的文件导入继续你的创作。mermaid语法说明 ↩︎注脚的解释 ↩︎