当前位置: 首页 > article >正文

LangGraph入门:构建有状态的AI Agent工作流

LangGraph 入门用状态图构建 Agent手写 ReAct 循环容易写出 bug。LangGraph 用「状态图」的方式定义 Agent把每一步定义为一个节点跳转逻辑定义为边——清晰、可测试、可扩展。一、为什么需要 LangGraph手写 Agent 循环的痛点# 手写版容易出 bug难扩展whilestepmax_steps:responsellm.chat(messages)ifFinal Answerinresponse:breakeliftool_call:resultexecute(tool_call)messages.append(result)elifneed_retry:# 嗯...重试逻辑写哪# 越写越乱LangGraph 换了个思路Agent 就是一个状态图State Graph。每个「做什么」是一个节点每个「下一步去哪」是一条边。二、核心概念┌──────────────────────────────────────┐ │ LangGraph 四要素 │ ├──────────────────────────────────────┤ │ State状态 Agent 当前记住的所有信息 │ │ Node节点 做什么调用 LLM、执行工具│ │ Edge边 做完之后去哪 │ │ Graph图 节点 边的集合 │ └──────────────────────────────────────┘三、第一个 LangGraph Agent# pip install langgraph langchain-openaifromtypingimportTypedDict,Annotatedfromlanggraph.graphimportStateGraph,ENDfromlangchain_openaiimportChatOpenAI# ── 1. 定义状态 ──classAgentState(TypedDict):messages:list[dict]# 对话历史next_step:str# 下一步去哪# ── 2. 初始化 LLM ──llmChatOpenAI(modeldeepseek-chat,api_keyyour-key,base_urlhttps://api.deepseek.com/v1)# ── 3. 定义节点函数 ──defchatbot(state:AgentState)-AgentState:LLM 节点调用大模型responsellm.invoke(state[messages])state[messages].append(response)state[next_step]check_tools# 下一步去检查是否需要工具returnstatedefcheck_tools(state:AgentState)-AgentState:工具路由判断是否需要调工具last_msgstate[messages][-1]ifhasattr(last_msg,tool_calls)andlast_msg.tool_calls:state[next_step]execute_toolselse:state[next_step]endreturnstatedefexecute_tools(state:AgentState)-AgentState:工具执行节点# 简化的工具执行逻辑last_msgstate[messages][-1]fortool_callinlast_msg.tool_calls:resultf工具{tool_call[name]}执行结果state[messages].append({role:tool,content:result})state[next_step]chatbot# 回到 LLM 继续returnstate# ── 4. 构建图 ──defbuild_graph():graphStateGraph(AgentState)# 添加节点graph.add_node(chatbot,chatbot)graph.add_node(check_tools,check_tools)graph.add_node(execute_tools,execute_tools)# 添加边graph.add_edge(chatbot,check_tools)# 条件边根据 next_step 决定去向graph.add_conditional_edges(check_tools,lambdastate:state[next_step],{execute_tools:execute_tools,end:END})graph.add_edge(execute_tools,chatbot)# 返回 LLMgraph.set_entry_point(chatbot)# 入口returngraph.compile()# ── 5. 运行 ──agentbuild_graph()resultagent.invoke({messages:[{role:user,content:你好}],next_step:chatbot})print(result[messages][-1].content)执行流程可视化┌──────────┐ │ chatbot │ ← 入口调用 LLM └────┬─────┘ │ ┌────▼─────┐ │check_tools│ ← 判断需要工具吗 └────┬─────┘ ┌───┴───┐ ▼ ▼ execute END _tools │ │ │ └───→───┘ 回到 chatbot四、完整实战代码审查 Agentfromlanggraph.graphimportStateGraph,ENDfromlanggraph.checkpoint.memoryimportMemorySaverclassCodeReviewState(TypedDict):code:strreview_result:strfixed_code:strtest_result:strstep:strdefreview_code(state:CodeReviewState)-CodeReviewState:节点 1审查代码promptf审查以下代码指出问题和改进建议\n\n{state[code]}\nresponsellm.invoke([{role:user,content:prompt}])state[review_result]response.content state[step]fixif问题inresponse.contentelsepassreturnstatedeffix_code(state:CodeReviewState)-CodeReviewState:节点 2修复问题promptf 原始代码 {state[code]} 审查意见{state[review_result]}请修复所有问题只输出修复后的代码。 responsellm.invoke([{role:user,content:prompt}])state[fixed_code]response.content state[step]testreturnstatedefrun_tests(state:CodeReviewState)-CodeReviewState:节点 3运行测试验证# 实际项目中会真的执行测试promptf检查以下代码是否有明显的语法或逻辑错误\n\n{state[fixed_code]}\nresponsellm.invoke([{role:user,content:prompt}])state[test_result]response.content state[step]donereturnstate# 构建审查工作流defbuild_review_graph():graphStateGraph(CodeReviewState)graph.add_node(review,review_code)graph.add_node(fix,fix_code)graph.add_node(test,run_tests)graph.set_entry_point(review)# 条件路由graph.add_conditional_edges(review,lambdas:s[step],{fix:fix,pass:END})graph.add_edge(fix,test)graph.add_edge(test,END)returngraph.compile()# 运行review_agentbuild_review_graph()resultreview_agent.invoke({code:def add(a,b):\n return ab\n\nprint(add(1,2)),review_result:,fixed_code:,test_result:,step:review})print(f审查结果{result[review_result]})print(f修复代码\n{result[fixed_code]})五、LangGraph vs 手写循环维度手写 while 循环LangGraph逻辑清晰度❌ 嵌套深了容易乱✅ 状态图一目了然可测试性❌ 整个循环是一个函数✅ 每个节点独立测试可扩展性❌ 加新逻辑要改主循环✅ 加新节点 新边调试❌ print 大法✅ 每个节点状态可见持久化❌ 自己实现✅ MemorySaver 开箱即用学习成本✅ 不需要学框架❌ 需要学新概念六、总结LangGraph 是构建 Agent 的工业级方案——告别手写循环核心是「状态图」——节点 做什么边 去哪条件边实现路由——根据不同状态走不同分支每个节点独立可测试——符合软件工程最佳实践七、生产实战LangGraph 跑到生产才知道的事7.1 持久化和断点续跑Agent 跑了 10 步后崩溃了从头再跑一遍生产环境不允许fromlanggraph.checkpoint.memoryimportMemorySaverfromlanggraph.checkpoint.sqliteimportSqliteSaver# 开发环境内存存储memoryMemorySaver()# 生产环境SQLite 持久化重启不丢checkpointerSqliteSaver.from_conn_string(checkpoints.db)graphgraph.compile(checkpointercheckpointer)# 运行时可指定 thread_id 来区分会话config{configurable:{thread_id:user-session-123}}resultgraph.invoke(initial_state,config)# 如果崩溃了同一个 thread_id 可以从上次的 checkpoint 继续resultgraph.invoke(None,config)# None 从上次 checkpoint 恢复7.2 流式输出用户不想等Agent 执行期间用户盯着空白界面体验很差# 每个节点完成后推送状态更新asyncforeventingraph.astream(initial_state):node_namelist(event.keys())[0]yield{type:node_update,node:node_name,status:completed}# 如果是 chatbot 节点流式输出 Tokenifnode_namechatbot:forchunkinevent[node_name][messages][-1].content:yield{type:chunk,text:chunk}7.3 节点级错误处理fromlanggraph.graphimportStateGraphdefsafe_review(state:State)-State:try:returnreview_code(state)exceptExceptionase:state[error]str(e)state[step]error_handlerreturnstate# 注册错误处理节点graph.add_node(review,safe_review)graph.add_node(error_handler,handle_error)graph.add_conditional_edges(review,lambdas:s[step],{fix:fix,pass:END,error_handler:error_handler})7.4 并行节点速度翻倍LangGraph 的 Send API 支持并行fromlanggraph.typesimportSend# 继续条件为每个 sub-task 创建并行执行asyncdefcontinue_to_workers(state):return[Send(worker,{task:t})fortinstate[tasks]]# 3 个 worker 同时执行总时间 最慢的那个下一篇《MCP 协议实战给 AI 接上外部世界》——写一个 MCP Server让 Claude Desktop、Cursor 都能调用你的工具。系列文章00-总纲 → ①-LLM 原理 → ②-Prompt 工程 → ③-Function Calling → ④-RAG → ⑤-Agent 模式 → ⑥-LangGraph → ⑦-MCP → ⑧-Multi-Agent

相关文章:

LangGraph入门:构建有状态的AI Agent工作流

LangGraph 入门:用状态图构建 Agent手写 ReAct 循环容易写出 bug。LangGraph 用「状态图」的方式定义 Agent,把每一步定义为一个节点,跳转逻辑定义为边——清晰、可测试、可扩展。一、为什么需要 LangGraph 手写 Agent 循环的痛点&#xff1a…...

FPGA+DDR3+千兆以太网:构建实时高清图像传输与显示系统(附源码)

1. 实时高清图像传输系统的核心价值 想象一下这样的场景:医疗内窥镜手术中,医生需要实时查看1080p高清影像;工业检测线上,高速摄像头每秒产生数百帧4K画面;无人机航拍时,需要将拍摄的高清视频实时回传到地面…...

从源头到治理:光伏并网逆变器直流分量抑制技术全解析

1. 光伏并网逆变器直流分量问题概述 第一次在光伏电站现场看到直流分量超标告警时,我盯着监控屏幕愣了半天。作为从业多年的光伏系统工程师,我深知这个看似微小的技术指标背后隐藏着多大的隐患。直流分量就像电网中的"隐形杀手",它…...

Linux Ext 调度器核心原理:BPF 驱动的自定义调度革命

简介 Linux 内核调度器自诞生以来,始终以通用公平调度(CFS)与硬实时调度(SCHED_DEADLINE/SCHED_FIFO)为核心,支撑服务器、桌面、嵌入式等全场景负载。但传统调度框架存在硬耦合、难扩展、定制成本极高的痛…...

MATLAB单双目标定实战:逐图解析重投影误差的提取与评估

1. 重投影误差的底层逻辑与MATLAB实现 第一次用MATLAB做相机标定时,盯着那个总均方根误差(Total RMS Error)数值看了半天,总觉得少了点什么。后来才明白,就像考试不能只看总分,标定质量评估也需要细化到每张…...

Linux Idle 调度器的 cpuidle_reflect:Idle 状态统计更新

简介 在 Linux 内核电源管理与调度体系中,CPU Idle(空闲)调度器是实现 CPU 低功耗管理的核心模块,负责在 CPU 无任务可调度时,选择并进入合适的硬件空闲状态(C-state),在性能与功耗…...

从特征稀缺到精准定位:基于HS-FPN与可变形注意力的白细胞检测新范式

1. 白细胞检测的现状与挑战 在医学影像分析领域,白细胞检测一直是个让人头疼的问题。想象一下,医生需要从密密麻麻的血细胞图像中找出白细胞,就像在沙滩上找特定形状的贝壳一样困难。传统方法主要依赖医生手动操作显微镜,不仅效率…...

SmartDock:让Android设备拥有桌面级生产力的智能启动器

SmartDock:让Android设备拥有桌面级生产力的智能启动器 【免费下载链接】smartdock A user-friendly desktop mode launcher that offers a modern and customizable user interface 项目地址: https://gitcode.com/gh_mirrors/smar/smartdock 你是否曾经想过…...

从谐波治理到能量回馈:深入聊聊LCL滤波器在光伏逆变器和PWM整流器里的那些关键设计

LCL滤波器设计实战:从谐波抑制到能量回馈的工程权衡 在光伏逆变器和PWM整流器设计中,电流谐波治理一直是工程师面临的核心挑战。当项目要求总谐波失真率(THD)必须低于3%时,传统L滤波器往往力不从心——要么需要超大电感量导致体积膨胀&#x…...

Cadence变种BOM实战:以IMU模块为例,打造多配置硬件设计流程

1. 从零理解变种BOM的核心价值 第一次接触变种BOM这个概念时,我正被一个IMU模块的项目折磨得焦头烂额。客户要求这个模块能支持五种不同的通信接口,还要可选配导航和RTC功能。这意味着我需要维护十几个不同版本的原理图和BOM表,每次修改都要同…...

蚂蚁百灵 Ring-2.6-1T 开源解析:万亿级思考模型如何实现「按需推理」

引言 2026年5月,蚂蚁百灵团队正式开源了其旗舰级思考模型 Ring-2.6-1T,这是一款拥有万亿参数的推理模型,在 AIME 2026 数学竞赛基准测试中取得了 95.83分 的惊人成绩,一跃成为国产开源 Agent 模型的新里程碑。更值得关注的是,该模型首次引入了 可调节的 Reasoning Effort…...

CST仿真入门实战:Dipole天线结果解读与关键参数分析

1. Dipole天线仿真结果初探 第一次打开CST仿真软件完成Dipole天线仿真后,面对密密麻麻的结果图表,相信很多人都会感到无从下手。我刚开始接触电磁仿真时也是这样,盯着那些S参数曲线和远场辐射图发愣。其实读懂这些结果并不难,关键…...

别再只会用阿里云加速了!手把手教你配置Docker daemon.json,优化日志与存储路径

深度优化Docker生产环境:daemon.json高阶配置实战指南 当Docker从开发测试环境走向生产部署时,默认配置往往成为性能瓶颈和系统隐患的源头。许多团队在遭遇磁盘爆满、日志失控或网络拥塞后,才意识到基础镜像加速只是Docker调优的冰山一角。本…...

零代码构建你的AI知识库:让Obsidian笔记开口说话

零代码构建你的AI知识库:让Obsidian笔记开口说话 【免费下载链接】anything-llm The all-in-one AI productivity accelerator. On device and privacy first with no annoying setup or configuration. 项目地址: https://gitcode.com/GitHub_Trending/an/anythi…...

STM32F429三重ADC+DMA实战:从CubeMX配置到7.2MHz采样率代码调试全流程(避坑指南)

STM32F429三重ADCDMA极限采样实战:从CubeMX配置到7.2MHz数据采集全解析 在工业测量、医疗设备或高频信号分析领域,对高速数据采集的需求日益增长。当常规的单ADC方案无法满足采样率要求时,STM32F429的三重ADC交替采样模式配合DMA传输&#xf…...

在国产UOS系统上搞定Horizon Client for Linux(ARM版)的保姆级安装与排错

在国产UOS系统上搞定Horizon Client for Linux(ARM版)的保姆级安装与排错 当国产操作系统遇上企业级虚拟桌面,技术适配的挑战往往超出预期。最近在华为鲲鹏920芯片的终端上部署Horizon Client时,那些在x86环境下一帆风顺的安装步骤…...

NotebookLM化学辅助实战手册(附ACS期刊PDF解析模板+分子式自动标注插件)

更多请点击: https://kaifayun.com 第一章:NotebookLM化学研究辅助概述 NotebookLM 是 Google 推出的基于人工智能的文档理解与知识协作工具,专为研究者设计,支持对 PDF、TXT 等格式的科学文献进行语义索引、跨文档推理与可追溯问…...

5G网络优化关键参数解读:从入门到实战

5G网络优化中,参数调整是最核心的日常操作。本文系统梳理5G NR关键优化参数,帮助初学者快速建立参数优化知识体系。一、5G NR参数分类5G网络优化参数按功能可分为5大类:类别参数数量核心参数优化频率功率控制参数~30个P0、Alpha、MaxPower高切…...

别再为485传感器没文档发愁了!一个USB转485模块+两款免费软件,5分钟搞定Modbus通信测试

5分钟极简方案:用USB转485模块与开源工具破解Modbus传感器通信 当你拿到一个没有文档的485温湿度传感器时,是否曾为如何读取数据而头疼?本文将分享一套经过实战验证的极简工具组合——仅需一个常见的USB转485转换器和两款免费软件&#xff0c…...

告别云台乱晃!手把手教你用Arduino+SG90舵机实现‘鸡头稳定’效果(附PID模拟器使用心得)

从鸡头稳定到智能云台:ArduinoPID算法实战指南 你是否注意过鸡在行走时头部能保持惊人的稳定?这种被称为"鸡头稳定"的生物现象,启发了工程师们设计出能自动补偿晃动的智能云台系统。本文将带你用Arduino、SG90舵机和MPU6050传感器&…...

从ZZULIOJ 1138题出发,手把手教你用C语言写一个‘标识符检查器’小工具

从OJ题到实战工具:用C语言打造智能标识符检查器 在编程学习过程中,我们经常遇到各种在线判题系统(OJ)的练习题,比如判断一个字符串是否为合法的C语言标识符。这类题目看似简单,但如何将其转化为一个真正实用…...

终极指南:3步重塑你的Windows桌面视觉体验

终极指南:3步重塑你的Windows桌面视觉体验 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 想象一下,当你专注工作…...

从零到一:在VMware中部署银河麒麟V10桌面版全流程实战

1. 环境准备:搭建你的虚拟实验室 在开始安装银河麒麟V10之前,我们需要先准备好虚拟化环境。就像装修房子前要准备好工具一样,这个步骤决定了后续安装的顺畅程度。我建议使用VMware Workstation Pro 16.x版本,这个版本对国产操作系…...

高通机器人RB5平台:从RAM转储分析到安全启动的实战配置指南

1. 高通RB5平台RAM转储分析实战 第一次拿到高通RB5开发板时,遇到系统崩溃完全不知道从何下手。后来发现RAM转储分析就像给机器人做"脑部CT",能完整记录崩溃瞬间的系统状态。这里分享我摸索出来的完整操作流程。 1.1 环境准备与工具链配置 工欲…...

告别电流畸变!手把手教你用PR调节器搞定开绕组电机零序电流(附Simulink仿真模型)

开绕组电机零序电流抑制实战:PR调节器参数整定与Simulink仿真指南 当开绕组永磁同步电机(OEW-PMSM)运行在考虑永磁体三次谐波反电动势的场景时,工程师们常会遇到一个棘手问题——三倍频零序电流导致的相电流畸变和转矩脉动。这种现…...

从FFT到CZT:解锁频谱细化的精准分析新维度

1. 为什么我们需要频谱细化? 在信号处理的世界里,傅里叶变换(FFT)就像是一把瑞士军刀,几乎每个工程师都会用它来分析信号的频率成分。但当你面对两个频率非常接近的信号时,FFT就显得力不从心了。我曾在一次…...

Codex 怎么详细科学地先出计划

本文聚焦一个非常关键的使用能力:让 Codex 在执行之前先出计划。很多人一上来就让 Codex 改代码、修 bug、做联动,结果不是方向偏了,就是改动过大、验证困难。先出计划的价值,不是多一个步骤,而是让复杂任务先被看清楚…...

【NotebookLM知识图谱构建权威白皮书】:基于127个企业POC验证的4层语义对齐框架

更多请点击: https://intelliparadigm.com 第一章:NotebookLM知识图谱构建概览 NotebookLM 是 Google 推出的面向研究者与开发者、基于用户自有文档构建可推理知识体的 AI 工具。其核心能力并非依赖通用语料,而是围绕上传文档(PD…...

通过用量看板与账单追溯实现团队 AI 成本精细化管理

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过用量看板与账单追溯实现团队 AI 成本精细化管理 对于技术团队而言,将大模型能力集成到产品与研发流程中已成为常态…...

【NotebookLM研究问题生成避坑白皮书】:从0到1构建可复现、可评估、可审计的问题生成工作流

更多请点击: https://intelliparadigm.com 第一章:NotebookLM研究问题生成的定义与核心价值 NotebookLM 是 Google 推出的面向研究者与知识工作者的实验性 AI 工具,其“研究问题生成”(Research Question Generation, RQG&#x…...