LangGraph实战:从零构建多步AI工作流与智能体开发指南
最近在尝试把一些重复性的文档处理、数据整理和跨系统查询的工作自动化一开始用脚本和定时任务勉强能跑但一旦遇到需要判断、回退、等待外部响应或根据结果动态调整流程的场景就发现传统的线性脚本根本不够用。要么得写一堆 if-else 硬编码要么就得拆成多个脚本手工串联不仅维护麻烦而且状态跟踪和错误恢复几乎要靠人工盯。这时候开始关注 AI Agent 框架——不是那种只能单次问答的聊天机器人而是能按流程执行多步任务、能记住上下文、能根据执行结果自主调整路径的智能体。在对比了几个方案后LangGraph 吸引我的点在于它用“图”来组织工作流把任务步骤变成节点把执行逻辑变成边这样一来复杂任务就可以被拆解成可复用、可调试、可扩展的流程单元。但真正上手时发现市面上很多教程只讲“怎么跑通 demo”却很少讲清楚“为什么这样设计”以及“实际项目里怎么避免踩坑”。这篇文章我就结合自己从零搭建智能体的经历梳理出一套适合新手的 LangGraph 实战路径重点不止在功能调用更在于理解其设计逻辑、掌握可落地的工程化方法。1. 先搞明白 LangGraph 到底解决了什么痛点在直接写代码之前有必要先理解 LangGraph 的设计动机。否则很容易陷入“调通样例但不知道下一步该怎么用”的困境。1.1 从“单次问答”到“多步工作流”的跨越大多数人在接触 AI 应用时第一个遇到的模式是问答式用户输入一个问题模型返回一个答案。这种模式对于简单查询很有效但如果任务需要多个步骤才能完成——比如“帮我查一下上个月的销售数据对比去年同期生成总结报告并发邮件给相关负责人”——直接扔给模型很容易出现输出不完整、格式混乱或遗漏步骤的情况。LangGraph 的核心价值就是把这类多步任务拆解成一个个可执行的节点并通过路由逻辑conditional edges控制执行流程。每个节点可以是一个 LLM 调用、一个工具调用比如查数据库、调用 API、或者一个数据处理函数节点之间通过状态对象传递信息。1.2 状态管理智能体的“记忆”机制传统脚本在处理多步任务时往往需要把中间结果保存在变量、文件或数据库中自己管理状态流转。LangGraph 通过内置的 StateGraph 把状态管理抽象出来开发者只需要定义状态的结构比如包含用户查询、当前步骤、已收集的数据、下一步动作等字段然后在每个节点中读写状态即可。这样做的好处是可回溯整个工作流的执行历史都被保留方便调试和复盘。可中断与恢复如果任务执行到一半因为网络或资源问题中断可以从最后一个成功节点恢复而不必重头开始。易于扩展新增一个步骤时只需要增加一个节点和相应的路由逻辑不需要重写状态管理代码。1.3 图结构把业务流程可视化用“图”来建模工作流最直观的好处是可视化。LangGraph 支持导出流程图为图片这对于复杂业务逻辑的沟通和评审非常有帮助。开发过程中你可以先画出业务流程图再直接映射成 LangGraph 的节点和边。更重要的是图结构天然支持分支、循环和并行通过异步节点比如分支根据上一步的结果选择下一步走向例如如果查询结果为空走补救分支如果有数据走分析分支。循环在满足条件时重复执行某个节点例如持续监控直到条件达成。并行多个独立任务可以同时执行最后汇总结果。这种灵活性是线性脚本难以实现的。2. 环境准备与最小可行示例理论讲多了容易抽象我们直接从一个最简单的例子开始感受 LangGraph 的基本用法。2.1 安装与依赖LangGraph 是 LangChain 生态的一部分但也可以独立使用。建议新建一个虚拟环境避免包冲突。# 创建并激活虚拟环境可选 python -m venv langgraph-env source langgraph-env/bin/activate # Windows 用 langgraph-env\Scripts\activate # 安装核心包 pip install langgraph langchain-openai这里安装了langgraph和langchain-openai后者用于调用 OpenAI 模型。如果你用其他模型如 Anthropic、本地模型可以替换成对应的 LangChain 集成包。2.2 配置模型与基础设置在代码开头我们先配置 LLM 和必要的参数。以下示例使用 OpenAI GPT-4你需要替换成自己的 API Key。import os from langchain_openai import ChatOpenAI # 设置环境变量建议使用配置文件或环境变量管理这里为了演示直接写 os.environ[OPENAI_API_KEY] 你的 API Key # 初始化模型 llm ChatOpenAI(modelgpt-4)2.3 构建第一个工作流对话循环我们实现一个简单的对话循环用户输入消息模型回复并根据用户是否说“再见”来决定是否结束对话。首先定义状态结构。LangGraph 使用 TypedDict 来定义状态 schemafrom typing import TypedDict, List class State(TypedDict): messages: List[str] # 记录对话历史 should_continue: bool # 控制是否继续对话然后创建两个节点一个处理用户输入一个调用模型生成回复。from langgraph.graph import StateGraph, END # 定义节点函数 def user_input_node(state: State): user_message input(你) state[messages].append(f用户{user_message}) # 如果用户输入“再见”则停止循环 state[should_continue] (user_message ! 再见) return state def ai_response_node(state: State): # 将对话历史拼接成上下文 context \n.join(state[messages]) prompt f以下是对话历史\n{context}\n请生成回复 response llm.invoke(prompt) state[messages].append(fAI{response.content}) return state接下来构建图并设置路由逻辑# 创建图构建器 graph_builder StateGraph(State) # 添加节点 graph_builder.add_node(user_input, user_input_node) graph_builder.add_node(ai_response, ai_response_node) # 设置入口点 graph_builder.set_entry_point(user_input) # 添加边用户输入后总是执行 AI 回复 graph_builder.add_edge(user_input, ai_response) # 添加条件边AI 回复后根据 should_continue 决定下一步 graph_builder.add_conditional_edges( ai_response, lambda state: user_input if state[should_continue] else END, [user_input, END] ) # 编译图 graph graph_builder.compile()最后运行工作流# 初始状态 initial_state {messages: [], should_continue: True} # 运行图 for step in graph.stream(initial_state): print(f当前节点{list(step.keys())}) if ai_response in step: print(fAI 回复{step[ai_response][messages][-1]})这个例子虽然简单但已经包含了 LangGraph 的核心概念状态、节点、边和条件路由。你可以通过输入“再见”来结束循环。3. 进阶实战构建一个文档查询智能体单次对话循环还体现不出 LangGraph 的真正威力。我们接下来构建一个更实用的智能体用户输入一个关于某份文档的问题智能体先检索相关段落再生成答案如果答案不完整还会主动追问补充信息。3.1 设计工作流这个智能体的工作流如下接收用户问题。检索文档从向量数据库中查找与问题相关的段落。生成初步答案基于检索结果生成回答。判断答案完整性模型自我评估答案是否足够完整如果不完整则生成追问。根据用户反馈继续或结束如果追问则等待用户回复并跳回步骤 2否则结束。3.2 实现检索节点首先我们需要一个文档库。这里为了简化使用内存向量数据库Chroma并插入示例文档。from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings from langchain.schema import Document # 示例文档 docs [ Document(page_contentLangGraph 是一个基于图的工作流编排框架适用于多步 AI 任务。), Document(page_content状态管理是 LangGraph 的核心功能支持复杂流程的暂停与恢复。), Document(page_content条件边允许根据上一步的结果动态选择下一步路径。) ] # 初始化向量数据库 embeddings OpenAIEmbeddings() vectorstore Chroma.from_documents(docs, embeddings) retriever vectorstore.as_retriever() def retrieve_node(state: State): question state[messages][-1] # 最新用户问题 relevant_docs retriever.get_relevant_documents(question) state[retrieved_docs] [doc.page_content for doc in relevant_docs] return state3.3 实现答案生成与自评估节点生成答案后让模型自我评估是否需要追问。def generate_answer_node(state: State): context \n.join(state[retrieved_docs]) question state[messages][-1] prompt f基于以下文档内容 {context} 问题{question} 请生成回答并判断回答是否完整是否需要更多信息才能完整回答。如果需要追问请生成追问问题。 response llm.invoke(prompt) # 这里简化处理实际可以解析模型返回的结构化内容 state[current_answer] response.content # 假设模型返回中包含“是否需要追问”的标记 state[need_follow_up] 需要追问 in response.content return state def follow_up_node(state: State): if state[need_follow_up]: # 生成追问 follow_up_question 请提供更多细节以便我更好地回答。 state[messages].append(fAI{follow_up_question}) return state3.4 组装完整工作流现在把各个节点组装起来并设置条件路由。graph_builder StateGraph(State) graph_builder.add_node(retrieve, retrieve_node) graph_builder.add_node(generate_answer, generate_answer_node) graph_builder.add_node(follow_up, follow_up_node) graph_builder.set_entry_point(retrieve) graph_builder.add_edge(retrieve, generate_answer) graph_builder.add_conditional_edges( generate_answer, lambda state: follow_up if state[need_follow_up] else END, [follow_up, END] ) graph_builder.add_edge(follow_up, retrieve) # 追问后重新检索 graph graph_builder.compile()这个智能体已经具备了基本的交互式问答能力。当你问一个模糊的问题时它会主动追问细节直到能给出完整答案。4. 工程化实践调试、优化与部署跑通 demo 只是第一步真正在生产环境使用 LangGraph 还需要考虑很多工程细节。4.1 调试与日志LangGraph 提供了详细的执行日志可以通过设置debugTrue开启。config {configurable: {thread_id: test_1}} for step in graph.stream(initial_state, configconfig, stream_modevalues): print(step)此外建议在每个节点函数中加入日志记录方便跟踪状态变化和排查问题。import logging logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) def retrieve_node(state: State): logger.info(f检索问题{state[messages][-1]}) # ... 其余代码4.2 性能优化异步执行如果节点中有 IO 密集型操作如网络请求、数据库查询可以使用异步节点提高并发性能。async def async_retrieve_node(state: State): # 异步检索 pass graph_builder.add_node(async_retrieve, async_retrieve_node)缓存对于重复的检索或计算可以引入缓存机制避免重复调用。批量处理如果需要处理多个独立任务可以考虑批量调用模型或工具。4.3 错误处理与重试在实际应用中网络波动、模型限流、工具故障等错误很常见。LangGraph 本身不提供自动重试机制需要开发者自己实现。可以在节点函数中加入重试逻辑from tenacity import retry, stop_after_attempt, wait_exponential retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) def reliable_llm_call(prompt): return llm.invoke(prompt)或者更高级的做法是设计一个错误处理节点专门捕获异常并根据错误类型决定重试、回退还是终止流程。4.4 状态持久化对于长时间运行的任务状态持久化是必须的。LangGraph 支持将状态保存到数据库或文件中以便中断后恢复。# 示例将状态保存到 JSON 文件 import json def save_state(state, filepath): with open(filepath, w) as f: json.dump(state, f) def load_state(filepath): with open(filepath, r) as f: return json.load(f)在生产环境中你可能需要集成 Redis、PostgreSQL 或专门的流程引擎来管理状态。4.5 版本管理与测试当工作流变得复杂后版本管理和自动化测试变得非常重要。版本管理使用 Git 管理代码对工作流定义进行版本控制。测试为每个节点编写单元测试并为完整工作流编写集成测试。可以使用 LangGraph 的stream或invoke方法模拟输入验证输出是否符合预期。5. 常见问题与避坑指南根据实践经验新手在入门 LangGraph 时最容易遇到以下几个问题。5.1 状态设计过于复杂状态对象应该只包含工作流需要传递的数据不要塞入无关字段。一开始尽量保持简洁随着需求迭代再逐步扩展。反例class OvercomplicatedState(TypedDict): messages: List[str] user_info: Dict session_id: str timestamp: str # ... 很多暂时用不上的字段正例class MinimalState(TypedDict): messages: List[str] next_action: str # 仅包含核心控制字段5.2 条件边逻辑混乱条件边的判断函数应该尽量简单只基于当前状态做布尔判断。复杂的路由逻辑可以拆分成多个节点或使用专门的决策节点。# 不推荐在条件边函数中做复杂计算 graph_builder.add_conditional_edges( some_node, lambda state: path_a if complicated_condition(state) else path_b, [path_a, path_b] ) # 推荐使用专门的决策节点 def decision_node(state): state[next_node] path_a if complicated_condition(state) else path_b return state graph_builder.add_node(decision, decision_node) graph_builder.add_edge(decision, {next_node}) # 动态路由5.3 忽略资源清理如果工作流中打开了文件连接、数据库连接或网络会话记得在节点中妥善关闭或者使用上下文管理器确保资源释放。5.4 过度依赖 LLM虽然 LangGraph 常与 LLM 结合使用但并不是所有节点都需要调用模型。简单的逻辑判断、数据转换、API 调用等能用普通代码实现的就不要用 LLM以提高性能和降低成本。6. 总结从工具使用到工作流思维LangGraph 最大的价值不在于提供了多少现成的 AI 功能而在于引入了一种“工作流思维”——把复杂的智能任务拆解成可编排、可复用、可观测的步骤。初学者常犯的错误是试图用一个庞大的提示词让模型完成所有事情结果往往不可控、难调试。而用 LangGraph 的思路你可以拆解任务把大任务分解成明确的步骤。设计流程用图结构描述步骤之间的逻辑关系。实现节点每个节点专注做好一件事。测试迭代单独测试每个节点再集成测试整个流程。这种模块化的方法不仅让 AI 应用更可靠也让团队协作和后期维护变得更容易。当你习惯了这种思维方式后会发现它不仅适用于 AI 任务任何复杂的业务流程都可以用类似的思路来设计和实现。最后提醒一点LangGraph 是一个强大的框架但并不是所有场景都需要它。对于简单的单次问答或线性任务直接调用模型可能更轻量。选择工具时始终从实际需求出发避免“为了用框架而用框架”。

相关新闻

python爬取贝壳中二手房的数据

python爬取贝壳中二手房的数据

前言:通过代码爬取贝壳中二手房的数据,以此给更多需要了解爬虫或者二手房信息的人提供便利。 第一部分:爬取地址 1.1贝壳首页地址 jiujiang.ke.com 第二部分:爬取数据 2.1输入要爬多少页 int(input(输入一共要多少页&#xf…

2026/7/29 4:25:58 阅读更多 →
从零吃透C语言数组基础!告别新手报错,小白看完直接上手

从零吃透C语言数组基础!告别新手报错,小白看完直接上手

从零吃透C语言数组基础!告别新手报错,小白看完直接上手 ** 学完C语言函数之后,我本以为自己已经入门了,写个简单计算、循环代码都不在话下。结果没过两天就遇到了新难题:需要一次性存储几十个学生的成绩,挨…

2026/7/29 4:25:58 阅读更多 →
学习日记 7.28

学习日记 7.28

在机器学习的学习之路上,线性回归和逻辑回归是两块重要的基石。今天我们将通过两个实战案例,从理论到代码,全面掌握这两种算法的应用:案例一:多元线性回归 —— 根据体重和年龄预测血压收缩压;案例二&#…

2026/7/29 4:25:58 阅读更多 →

最新新闻

SpringBoot+Vue3实现制造业质量管理系统全栈开发

SpringBoot+Vue3实现制造业质量管理系统全栈开发

1. 项目概述:中小型制造企业质量管理系统的技术实现这套基于SpringBoot2Vue3MyBatis-PlusMySQL8.0的质量管理系统,是专门为中小型制造企业设计的全栈解决方案。我在为多家汽配工厂实施类似系统时发现,传统纸质记录或单机版管理软件存在数据孤…

2026/7/29 4:37:02 阅读更多 →
C++指针详解:从基础到智能指针实战

C++指针详解:从基础到智能指针实战

1. 指针:C程序员的瑞士军刀指针在C中的地位,就像外科医生手中的手术刀——用得好能精准高效地解决问题,用不好则可能导致灾难性后果。从业十余年,我见过太多因指针使用不当引发的内存泄漏、野指针访问等"血案"。指针本质…

2026/7/29 4:37:02 阅读更多 →
STM32与LTE Cat-1模块实现物联网全球连接方案

STM32与LTE Cat-1模块实现物联网全球连接方案

1. 项目背景与核心目标在物联网和远程监控领域,设备的地理位置限制一直是开发者面临的重大挑战。传统解决方案往往依赖固定网络基础设施或高功耗的通信模块,这严重制约了设备在野外、移动环境或偏远地区的部署能力。而UG95 LTE Cat-1模块与STM32F413RH微…

2026/7/29 4:37:02 阅读更多 →
嵌入式Linux开发板Qt程序从零到一:环境搭建、交叉编译与部署实战

嵌入式Linux开发板Qt程序从零到一:环境搭建、交叉编译与部署实战

1. 项目缘起:从零到一的嵌入式Qt初体验在嵌入式开发这个行当里,把第一个图形界面程序跑在开发板上,就像小时候第一次成功点亮一个LED灯一样,有种难以言喻的成就感。我手头这块板子,是一块基于ARM Cortex-A7内核的T113开…

2026/7/29 4:37:02 阅读更多 →
51单片机入门指南:从零搭建开发环境到串口通信实战

51单片机入门指南:从零搭建开发环境到串口通信实战

1. 项目概述:为什么是51单片机?如果你对电子、嵌入式或者自动化控制感兴趣,那么“单片机”这个词你肯定绕不过去。而在单片机的浩瀚宇宙里,51单片机,尤其是经典的STC89C52RC,就像一位永远不会过时的老朋友。…

2026/7/29 4:37:02 阅读更多 →
基于Arduino与蓝牙BLE的智能氛围灯DIY:从电路设计到3D打印全解析

基于Arduino与蓝牙BLE的智能氛围灯DIY:从电路设计到3D打印全解析

1. 项目概述:当硬核技术遇上浪漫心意“智能蘑菇灯”这个项目,乍一听像是极客圈里一个普通的DIY小玩意儿,但加上“送给心仪女孩最好的礼物”这个后缀,整个项目的内核就完全不一样了。它不再仅仅是一个技术实现的载体,而…

2026/7/29 4:36:01 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻