LangGraph 初学者入门文档1
结论先行LangGraph 是一个用于构建有状态、可控的 AI Agent 工作流的编排框架。它把 Agent 的逻辑建模成一张图——节点负责干活边负责控制流程状态在整张图中流动。对于初学者建议从最小的“单节点线形图”开始逐步加入条件分支和循环最后再接触持久化和人工中断等高级特性。一、LangGraph 是什么为什么需要它传统 LLM 应用通常是“输入 → 处理 → 输出”的线性链式结构。但真实的 Agent 往往需要循环比如反复调用工具直到任务完成、条件分支根据中间结果走不同路径、人工审批在关键步骤暂停等待确认。这些用线性链很难优雅实现。LangGraph 的核心思路是把工作流画成一张图。每个工作流都由 StateGraph 表示本质上是一个有向图节点封装具体操作如调用 LLM、执行工具边定义节点之间的跳转规则状态在所有节点间流动的共享数据这样做的好处是流程一目了然加减节点不需要重写协调逻辑状态有类型约束循环有内置的终止条件。二、先跑通第一个例子在深入概念之前先安装并运行一个最简单的例子。这一步只需要 30 秒但能帮你建立最直观的感受。安装pipinstall-Ulanggraph 最小示例——两个节点顺序执行各自往文本后追加一个字母 python from langgraph.graphimportSTART, StateGraph from typing_extensionsimportTypedDict class State(TypedDict): text: str def node_a(state: State)-dict:return{text:state[text]a}def node_b(state: State)-dict:return{text:state[text]b}graphStateGraph(State)graph.add_node(node_a, node_a)graph.add_node(node_b, node_b)graph.add_edge(START,node_a)graph.add_edge(node_a,node_b)appgraph.compile()print(app.invoke({text:}))# 输出: {text: ab}这段代码做了三件事定义状态 State一个 TypedDict规定图中流动的数据结构。定义节点 node_a 和 node_b接收当前状态返回要更新的字段。连接图START → node_a → node_b编译后即可调用。三、四个核心概念3.1 State状态状态是整个图的共享数据容器。所有节点都能读取它节点返回的字典会被合并回状态中。关键规则节点返回的是增量更新不是完整状态。比如节点返回 {“text”: “新值”}LangGraph 只把 text 字段覆盖掉其他字段保持不变。classAgentState(TypedDict):messages:list# 对话历史iteration:int# 当前轮次final_answer:str# 最终答案默认情况下节点返回的某个字段会覆盖旧值。如果希望累加比如消息列表不断追加需要用 Annotated 指定归并函数fromtypingimportAnnotatedfromoperatorimportaddclassState(TypedDict):messages:Annotated[list,add]# 新列表会追加而非覆盖初学者的常见坑对话历史字段如果不加 Annotated[list, add]第二条消息会直接丢掉第一条。3.2 Node节点节点是执行具体任务的函数。接收当前状态返回要更新的字段。defprocess_input(state:AgentState)-dict:return{text:state[text].upper()}节点可以是普通函数也可以是 LangChain 的 Runnable。每个节点都是无状态的——它只拿到当前状态的快照返回更新实际的状态修改由 LangGraph 在外部完成。3.3 Edge边边决定执行完一个节点后去哪里。普通边固定跳转。graph.add_edge(node_a,node_b)# node_a 执行完必去 node_b条件边根据状态动态选择下一个节点。defshould_continue(state:State)-str:ifstate[count]3:returnincrement# 继续循环returnEND# 结束graph.add_conditional_edges(increment,should_continue)路由函数返回的字符串会匹配到目标节点。这使得循环变得自然——只需要让条件边指回前面的节点即可。3.4 Graph图图是节点和边的集合。构建流程builderStateGraph(State)# 1. 创建图指定状态结构builder.add_node(name,func)# 2. 添加节点builder.add_edge(START,name)# 3. 定义边builder.add_conditional_edges(...)# 条件边appbuilder.compile()# 4. 编译为可执行对象app.invoke({text:hello})# 5. 运行四、构建一个真正的 Agent 循环有了上面的基础就可以实现 Agent 最核心的推理→行动→再推理循环了。以下是一个简化的 ReAct 风格工作流fromlanggraph.graphimportStateGraph,START,ENDfromtypingimportAnnotatedfromoperatorimportaddclassAgentState(TypedDict):messages:Annotated[list,add]# 累加对话iteration:intdefagent_node(state:AgentState)-dict:Agent 的“大脑”决定是调用工具还是直接回答# 实际场景中这里会调用 LLMlaststate[messages][-1]ifstate[messages]elseNoneiflastand需要工具instr(last):return{messages:[调用工具...],iteration:state[iteration]1}return{messages:[任务完成],iteration:state[iteration]1}deftool_node(state:AgentState)-dict:执行工具返回结果return{messages:[工具执行结果]}defshould_continue(state:AgentState)-str:决定回到 agent 继续推理还是结束ifstate[iteration]3:# 简化最多循环 3 次returnEND last_msgstate[messages][-1]ifstate[messages]elseif工具instr(last_msg):returntoolsreturnEND builderStateGraph(AgentState)builder.add_node(agent,agent_node)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)# 关键工具执行完回到 agent形成循环appbuilder.compile()resultapp.invoke({messages:[需要工具帮忙],iteration:0})print(result[messages])关键设计tools 节点执行完后指回 agent形成循环。should_continue 负责在合适的时机跳出循环。五、进阶但重要的概念5.1 Checkpointer检查点让状态可持久化默认情况下每次 invoke 都从头开始状态用完即弃。加上 Checkpointer 后每一步的状态都会被保存。fromlanggraph.checkpoint.memoryimportMemorySaver checkpointerMemorySaver()# 开发用生产建议用 SqliteSaver 或 PostgresSaverappbuilder.compile(checkpointercheckpointer)config{configurable:{thread_id:user-001}}app.invoke({messages:[你好]},config)# 状态被保存app.invoke({messages:[继续]},config)# 同一 thread_id上一轮状态自动恢复thread_id 区分不同会话实现短期记忆——同一用户的多轮对话上下文得以保持。5.2 Human-in-the-loop人工中断在关键操作前暂停等待人工确认fromlanggraph.typesimportinterrupt,Commanddefreview_node(state):decisioninterrupt({question:是否批准,data:state[draft]})ifdecisionapprove:return{status:approved}return{status:rejected}# 恢复时传入人工决定app.invoke(Command(resumeapprove),config)5.3 状态归并的细节默认覆盖节点返回 {“text”: “新值”}旧值被替换。归并累加用 Annotated[list, add] 让列表追加而非覆盖。强制覆盖用 Overwrite 绕过归并函数直接替换。重要提醒如果字段用了归并函数如 add返回空列表不会清空该字段——空列表会被合并进去旧值还在。要清空必须用 Overwrite([])。六、初学者学习路径建议最关键的一步是亲手写一个包含循环的工作流。LangGraph 的真正价值在于控制流而不是单次 LLM 调用。当你能让一个图根据中间结果决定“继续循环”还是“退出”时就已经掌握了它的核心。七、一张图记住核心概念┌─────────────────────────────────────────────────────┐ │ StateGraph │ │ │ │ START ──▶ [节点 A] ──▶ [节点 B] ──▶ END │ │ │ │ │ │ │ (条件边) │ │ │ │ ▼ │ │ └────── [节点 C] ◀── 循环 ──────────────┘│ │ │ │ State: 贯穿全图的共享数据节点返回增量更新 │ │ Node: 执行任务的函数接收状态返回更新 │ │ Edge: 普通边固定跳转 / 条件边动态路由 │ │ Checkpointer: 状态快照支持恢复和记忆 │ └─────────────────────────────────────────────────────┘LangGraph 的设计哲学是“低层级、高控制”。它不替你决定 Agent 该怎么想只负责可靠地执行你画的流程。作为初学者从简单的图开始逐步增加复杂度是最有效的学习方式。

相关新闻

MQTT QoS深度解析:报文交换机制与选型建议

MQTT QoS深度解析:报文交换机制与选型建议

1. 从一次实际故障聊起:为什么选错 QoS 会让人半夜爬起来修 先说个我踩过的坑。某次给一套物联网设备做数据采集,传感器每隔几秒上报一次温湿度,我图省事把所有消息都设成了 QoS 0,觉得"丢了就丢了,下一条马上就来…

2026/10/15 16:51:56 阅读更多 →
35kV单侧电源辐射网三段式电流保护整定计算与仿真验证

35kV单侧电源辐射网三段式电流保护整定计算与仿真验证

前段时间帮朋友做一套35kV单侧电源辐射网的继电保护整定方案,核心就是经典的三段式电流保护。说实话,这套东西教材上讲得不少,但真正从短路电流计算、逐段整定、灵敏度校验、时限配合一路做到仿真验证,里面值得抠的细节远比想象中…

2026/10/15 16:51:56 阅读更多 →
OpenClaw 3.1.0 下载安装教程,快速搭建本地 AI 数字员工

OpenClaw 3.1.0 下载安装教程,快速搭建本地 AI 数字员工

Windows 一键部署 OpenClaw 教程|5 分钟搞定本地 AI 智能体,告别复杂配置 说明:本文适配 CSDN 发布,全部版本号、链接、文件大小已替换,删除标签 / 日期 / 阅读量 / 示意图,规避禁用词汇,首次全…

2026/10/15 16:51:56 阅读更多 →

最新新闻

Hart主模式协议栈实现:从帧结构到主站轮询的完整落地路径

Hart主模式协议栈实现:从帧结构到主站轮询的完整落地路径

简介:这份资源是面向工业自动化通信开发者的HART主模式协议栈实现代码包,适合已具备嵌入式C基础、需要为智能仪表或控制系统集成HART通信能力的工程师参考。HART协议在4-20mA模拟信号上叠加FSK数字信号,实现模拟与数字共线传输,主…

2026/10/15 17:36:55 阅读更多 →
零基预算怎么落地才不翻车?6步方法论理清口径与流程

零基预算怎么落地才不翻车?6步方法论理清口径与流程

零基预算怎么落地才不翻车?6步方法论理清口径与流程零基预算(ZBB)的口号是"每年从零开始",但真从零开始的企业几乎没有,也很少有企业能撑过次年。翻车的原因通常不是理念不对,而是把它当成了一次…

2026/10/15 17:36:55 阅读更多 →
文件命令实战指南:从批量重命名到高效清理的完整方案

文件命令实战指南:从批量重命名到高效清理的完整方案

文件的应用命令:从日常整理到批量处理,一套思路搞定九成文件场景无论你是开发者、运维,还是日常需要和电脑较劲的办公族,总有一天会被文件逼到墙角:下载了一整年的混乱文档找不到版本、一个目录下面上万张图片要转格式…

2026/10/15 17:36:55 阅读更多 →
MFC调用C# DLL的跨平台桥接实战:C++/CLI封装指南

MFC调用C# DLL的跨平台桥接实战:C++/CLI封装指南

简介:本资源是一份面向C/MFC开发者与.NET跨语言集成学习者的实战型技术包,聚焦解决Windows平台下MFC应用程序调用C#编写的托管DLL这一典型互操作难题。资源包含完整可运行的工程实例,覆盖C# DLL封装、P/Invoke接口定义、MFC项目配置、类型映射…

2026/10/15 17:36:55 阅读更多 →
FastAPI 中 JWT 的基本使用与实践

FastAPI 中 JWT 的基本使用与实践

1. 引言 JWT(JSON Web Token)是目前最流行的无状态认证方案之一。在 FastAPI 中,结合 python-jose 与 passlib 可以快速实现基于 JWT 的用户认证与授权。本文将从零开始,带你掌握 FastAPI 中 JWT 的基本使用与实践。 2. 环境准备 …

2026/10/15 17:36:55 阅读更多 →
从半加器到超前进位:加法器设计原理与Verilog实现

从半加器到超前进位:加法器设计原理与Verilog实现

1. 从半加器到全加器:为什么需要两级结构 很多人学数字电路,学到加法器这一节就开始犯迷糊。教材上先讲半加器,再讲全加器,然后告诉你全加器可以由两个半加器加一个或门拼出来。但为什么要这么拼?直接用一个电路把三个…

2026/10/15 17:35:54 阅读更多 →

日新闻

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/14 16:30:29 阅读更多 →
影刀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 阅读更多 →