LangGraph:构建复杂、有状态AI应用的新范式
引言从链式思维到图式思维在构建AI驱动的应用程序时我们早已超越了简单的“输入-输出”模型。现实世界的任务往往是多步骤、有状态且充满分支决策的。传统的LangChain通过“链”Chain将多个组件串联起来虽然解决了顺序执行的问题但在处理循环、条件分支和长期状态管理时仍显得力不从心。LangGraph应运而生。它不是一个替代品而是LangChain生态中的一个强大扩展将“链”的思想提升到了“图”Graph的维度。它允许开发者将AI应用的工作流建模为一张有向图其中节点代表执行单元可以是LLM调用、工具调用或自定义函数边则定义了节点间的流转逻辑。这为构建智能体Agent、复杂对话系统、工作流引擎等应用提供了前所未有的灵活性和控制力。本文将带你深入理解LangGraph的核心概念、基本用法并通过实战示例展示如何用它构建一个具备记忆和工具调用能力的智能体。核心概念在深入代码之前让我们先厘清LangGraph中的几个关键概念State状态这是贯穿整个图执行过程的共享上下文通常是一个字典TypedDict。所有节点都可以读取和修改状态中的字段。状态是LangGraph实现有状态、多轮交互的核心。Node节点图中的一个执行单元。每个节点都是一个函数它接收当前的State作为输入并返回一个对该State的更新。节点可以执行任何操作调用LLM、运行工具、进行条件判断、操作数据库等。Edge边定义节点之间如何连接和流转。边分为两种条件边Conditional Edge根据State中的某个值通常是上一个节点输出的结果来决定下一步走向哪个节点。这实现了if-else分支逻辑。普通边无条件地从一个节点指向下一个节点。Graph图由节点和边组成的整体结构。LangGraph负责管理状态的传递、节点的调度以及循环的控制。快速开始构建你的第一个LangGraph应用让我们从一个最简单的例子开始一个接收用户问题并调用LLM进行回答的图。虽然这用简单的Chain也能实现但有助于我们理解Graph的构建模式。fromtypingimportTypedDictfromlanggraph.graphimportStateGraph,ENDfromlangchain_openaiimportChatOpenAI# 1. 定义状态结构classGraphState(TypedDict):question:stranswer:str# 2. 初始化LLMllmChatOpenAI(modelgpt-4o-mini)# 3. 定义节点函数defgenerate_answer(state:GraphState):节点调用LLM生成答案responsellm.invoke(state[question])return{answer:response.content}# 4. 构建图builderStateGraph(GraphState)# 添加节点builder.add_node(generate,generate_answer)# 设置入口点builder.set_entry_point(generate)# 设置结束点从generate节点指向预定义的ENDbuilder.add_edge(generate,END)# 5. 编译图graphbuilder.compile()# 6. 运行图initial_state{question:LangGraph是什么}resultgraph.invoke(initial_state)print(result[answer])这个图虽然简单但已经包含了所有核心要素定义状态、创建节点、构建边、编译和执行。进阶实战构建一个具备工具调用能力的智能体真正的威力在于处理复杂逻辑。下面我们构建一个更实用的智能体它可以根据用户问题决定是直接回答还是需要调用一个搜索工具。fromtypingimportTypedDict,Literalfromlanggraph.graphimportStateGraph,ENDfromlangchain_openaiimportChatOpenAIfromlangchain_community.toolsimportDuckDuckGoSearchRunfromlangchain_core.messagesimportHumanMessage,SystemMessage# 定义更丰富的状态classAgentState(TypedDict):messages:list# 对话历史question:strneeds_search:bool# 是否需要搜索search_result:strfinal_answer:str# 初始化组件llmChatOpenAI(modelgpt-4o-mini)search_toolDuckDuckGoSearchRun()# 节点1路由决策defroute_question(state:AgentState):判断问题是否需要联网搜索system_prompt你是一个路由助手。判断用户的问题是否需要实时信息或网络搜索才能准确回答。如果需要回复search否则回复answer。promptf用户问题{state[question]}responsellm.invoke([SystemMessage(contentsystem_prompt),HumanMessage(contentprompt)])decisionresponse.content.strip().lower()return{needs_search:decisionsearch}# 节点2调用搜索工具defcall_search_tool(state:AgentState):执行网络搜索resultsearch_tool.run(state[question])return{search_result:result}# 节点3基于知识回答defanswer_with_knowledge(state:AgentState):仅用模型已有知识回答responsellm.invoke(f请回答以下问题{state[question]})return{final_answer:response.content}# 节点4综合搜索结果的答案defanswer_with_search(state:AgentState):结合搜索结果进行回答promptf 用户问题{state[question]}搜索到的相关信息{state[search_result]}请根据以上信息给出一个准确、全面的回答。 responsellm.invoke(prompt)return{final_answer:response.content}# 构建图builderStateGraph(AgentState)# 添加所有节点builder.add_node(route,route_question)builder.add_node(search,call_search_tool)builder.add_node(answer_directly,answer_with_knowledge)builder.add_node(answer_with_search,answer_with_search)# 设置入口点builder.set_entry_point(route)# 添加条件边根据路由结果决定走向defdecide_next_node(state:AgentState)-Literal[search,answer_directly]:ifstate[needs_search]:returnsearchelse:returnanswer_directlybuilder.add_conditional_edges(route,decide_next_node,{search:search,answer_directly:answer_directly})# 添加普通边builder.add_edge(search,answer_with_search)builder.add_edge(answer_directly,END)builder.add_edge(answer_with_search,END)# 编译图agent_graphbuilder.compile()# 运行智能体result1agent_graph.invoke({question:Python中如何读写JSON文件,messages:[]})print(【无需搜索的问题】)print(f答案{result1[final_answer][:200]}...)result2agent_graph.invoke({question:今天北京天气怎么样,messages:[]})print(\n【需要搜索的问题】)print(f答案{result2[final_answer][:200]}...)这个示例展示了LangGraph如何优雅地处理条件路由和线性序列的组合。route节点后的条件边实现了智能决策而search到answer_with_search的边则是一个简单的顺序流。可视化与调试graph.get_graph().draw_mermaid()LangGraph一个非常强大的特性是可视化。你可以轻松地将你构建的图导出为Mermaid图表直观地理解工作流。# 接上例可视化智能体图try:# 绘制并显示Mermaid图代码mermaid_codeagent_graph.get_graph().draw_mermaid()print(将以下代码复制到Mermaid编辑器中查看如mermaid.live)print(mermaid_code)exceptExceptionase:print(f生成Mermaid代码时出错{e})生成的Mermaid图可以清晰地展示节点、边和决策逻辑是设计和调试复杂工作流的利器。最佳实践与注意事项状态设计要精简只将需要在节点间传递的数据放入State。避免状态过于庞大影响性能和清晰度。节点职责单一每个节点应只完成一件明确的事情遵循单一职责原则使图更易于维护和测试。善用条件边与循环对于需要多轮对话如直到满足某个条件的智能体可以利用条件边指向自身或某个判断节点实现while循环。错误处理考虑在图中添加专门的错误处理节点或者使用try-catch包装可能失败的节点逻辑确保图的健壮性。持久化状态对于长会话应用需要将State持久化到数据库。LangGraph通常与State的checkpointer结合使用来实现状态的保存与恢复。

相关新闻

PCB设计必备:Altium Designer导入DXF板框的标准化流程与工程实践

PCB设计必备:Altium Designer导入DXF板框的标准化流程与工程实践

1. 项目背景与核心价值:为什么AD导入DXF是PCB设计的“起手式”? 在PCB设计这个行当里干了十几年,我见过太多工程师在项目初期就卡在“板框”这个看似简单的问题上。板框是什么?它不仅仅是PCB的物理边界,更是整个设计的…

2026/10/13 0:42:07 阅读更多 →
Spring Boot与MyBatis整合开发实战指南

Spring Boot与MyBatis整合开发实战指南

1. Spring Boot与MyBatis整合全景解析作为Java生态中最主流的两个框架,Spring Boot和MyBatis的组合堪称企业级开发的黄金搭档。我经历过从早期SSH到SSM的技术演进,最终在微服务时代锁定这个组合方案。Spring Boot的自动化配置特性与MyBatis的灵活SQL控制…

2026/10/8 2:04:25 阅读更多 →
Java 开发中最常用的设计模式有哪些?结合实际开发情况一次讲清

Java 开发中最常用的设计模式有哪些?结合实际开发情况一次讲清

很多人学设计模式时,背的是“23 种模式”;真正写项目时,却经常不知道该用哪一种。本文不按教材逐个复述定义,而是结合 Java 和 Spring 工程,聊聊那些真正高频的设计模式、应用场景,以及使用时容易踩的坑。一…

2026/10/12 14:53:54 阅读更多 →

最新新闻

django-crispy-forms 版本历史完全指南:2.0 破坏性变更、兼容性矩阵与源码级验证

django-crispy-forms 版本历史完全指南:2.0 破坏性变更、兼容性矩阵与源码级验证

后端 【免费下载链接】django-crispy-forms The best way to have DRY Django forms. The app provides a tag and filter that lets you quickly render forms in a div format while providing an enormous amount of capability to configure and control the rendered HTML…

2026/10/13 9:28:07 阅读更多 →
Decepticon 中间件插件开发实战:基于 decepticon-example-middleware 掌握 SDK 脚手架、入口点注册与框架装配

Decepticon 中间件插件开发实战:基于 decepticon-example-middleware 掌握 SDK 脚手架、入口点注册与框架装配

【免费下载链接】Decepticon Autonomous Hacking Agent for Red Team 项目地址: https://gitcode.com/gh_mirrors/de/Decepticon 点击查看 免费下载 Decepticon 是面向红队场景的自主攻击 Agent 框架,其插件体系允许在不修改开源主代码的前提下&#xf…

2026/10/13 9:28:07 阅读更多 →
红外小目标检测实战:YOLOv5预训练权重与4000张数据集快速上手

红外小目标检测实战:YOLOv5预训练权重与4000张数据集快速上手

简介:本资源面向红外场景下的目标检测学习者与研究者,提供一套可直接复用的YOLOv5红外微小无人机、直升机、飞机、飞鸟检测方案,解决红外小目标样本稀缺、标注与训练环境搭建繁琐的问题。包内包含4000余张YOLO格式红外图像数据集,…

2026/10/13 9:28:06 阅读更多 →
coremltools Palettization 技术全解析:权重聚类查找表压缩的原理、粒度控制与三套算法实战

coremltools Palettization 技术全解析:权重聚类查找表压缩的原理、粒度控制与三套算法实战

AI 应用机器学习模型优化 【免费下载链接】coremltools Core ML tools contain supporting tools for Core ML model conversion, editing, and validation. 项目地址: https://gitcode.com/gh_mirrors/co/coremltools 点击查看 免费下载 Palettization&#xff08…

2026/10/13 9:28:06 阅读更多 →
红外小目标检测实战:4000张数据集处理与YOLOv5训练部署

红外小目标检测实战:4000张数据集处理与YOLOv5训练部署

简介:本资源面向红外场景下的目标检测学习者与开发者,提供一套可直接复用的YOLOv5红外微小无人机、直升机、飞机、飞鸟检测方案,适合课程设计、科研实验与算法对比等场景。压缩包共约2000个文件,以1994个XML标注文件为主&#xff…

2026/10/13 9:28:06 阅读更多 →
t3code工程化方案:从代码规范到自动化质量门禁的落地实践

t3code工程化方案:从代码规范到自动化质量门禁的落地实践

不少朋友最近在问 t3code 到底是什么、能拿来做什么。说实话这个词并没有一个官方定义,圈子里聊起来通常是指一套面向改进日常开发流程的代码工程化方案——名字里的 t3 可以理解成“Third-generation”的意思,强调的是第三代代码组织和构建思路&#xf…

2026/10/13 9:27:04 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →