如何开发一个 LangGraph 智能体?从 0 到 1 搭建可控、可扩展的 AI Agent
过去我们开发 AI 应用最常见的方式是用户输入一句话模型返回一段回答。这种方式适合聊天、问答、内容生成但一旦你想让 AI 完成更复杂的任务比如自动检索资料、调用工具、分析数据、生成报告、等待人工确认、失败后继续执行、多轮记住上下文……普通的“问答式调用”就不够用了。这时候就需要 Agent。而 LangGraph就是目前开发复杂 Agent 时非常值得关注的框架之一。LangGraph 官方定位更偏向“智能体编排运行时”它重点解决的是复杂 Agent 执行过程中的状态管理、流程控制、工具调用、持久化、流式输出、人类介入等问题。官方文档也明确提到LangGraph 关注的是 agent orchestration也就是智能体编排能力包括 durable execution、streaming、human-in-the-loop 和 persistence 等能力。一、先理解LangGraph 适合解决什么问题很多人第一次接触 LangGraph会觉得它像 LangChain 的升级版。其实更准确地说LangChain 更像是组件库LangGraph 更像是智能体流程编排引擎。如果只是简单调用大模型让它回答问题普通 LangChain 或直接调用模型 API 就够了。但如果你的智能体需要多步骤执行任务中途调用搜索、数据库、接口、代码执行器等工具根据工具结果决定下一步失败后可以恢复支持长任务支持人工审批记住某个用户的历史对话把复杂任务拆成多个节点执行那么 LangGraph 就非常适合。官方文档中提到LangGraph 提供的是面向长期运行、有状态工作流或智能体的底层基础设施比如持久执行、人类介入、记忆、调试与生产部署能力。二、LangGraph 的核心思想把 Agent 设计成一张图LangGraph 这个名字里的 Graph就是“图”。它不是让你写一长串 if-else而是把智能体拆成一张流程图。一张 LangGraph 智能体图通常由三个核心部分组成State状态State 是整个智能体运行过程中的共享数据比如用户输入、历史消息、工具结果、当前任务状态、中间结论等。Node节点Node 是真正干活的地方。一个节点可以调用大模型也可以调用工具、查询数据库、执行代码、生成报告。Edge边Edge 决定流程怎么走。比如模型回答完之后如果需要调用工具就进入工具节点如果不需要工具就直接结束。官方文档对 Graph API 的解释也很清晰State 是应用当前快照Nodes 是执行逻辑的函数Edges 决定下一个要执行的节点。节点负责做事边负责决定下一步。可以简单理解为用户输入 ↓LLM 判断 ↓是否需要工具 ├── 是调用工具 → 把结果交给 LLM → 再判断 └── 否输出最终答案这就是一个最基础的 Agent Loop。三、开发一个 LangGraph 智能体的基本步骤我们以一个“资料整理智能体”为例。它要完成的任务是用户输入一个主题智能体先判断是否需要查资料如果需要就调用工具获取信息拿到结果后再整理成一段结构化内容。整体开发步骤如下1. 安装依赖2. 定义工具3. 定义模型4. 定义 State5. 定义 LLM 节点6. 定义工具节点7. 定义条件路由8. 构建并编译 Graph9. 调用智能体10. 增加记忆、流式输出、人工审批等高级能力官方 Quickstart 也是类似思路先定义工具和模型再定义状态、模型节点、工具节点、结束逻辑最后用 StateGraph 构建并 compile 成可运行的 agent。四、环境安装先安装基础依赖pip install -U langgraph langchain langchain-openai python-dotenvLangGraph 官方文档中给出的基础安装方式是pip install -U langgraph如果你要接入具体模型服务还需要安装对应模型供应商的包比如 OpenAI、Anthropic 或其他兼容接口。五、编写一个最小可用的 LangGraph Agent理解完基本概念后我们来写一个最小可用的 LangGraph 智能体。这个智能体的目标很简单用户输入一个问题模型先判断是否需要调用工具如果需要就调用工具获取信息工具结果返回给模型后模型再整理成最终答案。整体流程如下用户输入 ↓LLM 节点分析问题 ↓是否需要调用工具 ├── 是进入工具节点 │ ↓ │ 工具结果返回给 LLM │ ↓ │ LLM 继续分析 └── 否输出最终答案1. 导入必要依赖首先导入需要用到的类型、消息对象、图结构和起止节点。from typing import Annotated, Literalfrom typing_extensions import TypedDictimport operatorfrom langchain.chat_models import init_chat_modelfrom langchain.tools import toolfrom langchain.messages import AnyMessage, HumanMessage, SystemMessage, ToolMessagefrom langgraph.graph import StateGraph, START, END这里有几个重点TypedDict用来定义智能体运行时的状态结构。Annotated和operator.add用来告诉 LangGraph当新的消息产生时不是覆盖原消息而是追加到消息列表里。StateGraph是 LangGraph 中构建流程图的核心类。START和END分别表示图的开始和结束。2. 定义工具函数Agent 的一个重要能力就是可以调用外部工具。这里我们先定义两个简单工具tooldef search_knowledge(query: str) - str: 根据用户问题检索资料。 return f这里是关于「{query}」的模拟检索结果LangGraph 适合开发有状态、可控、可扩展的智能体。tooldef save_report(title: str, content: str) - str: 保存生成的报告。 return f报告《{title}》已保存成功。这两个工具分别负责search_knowledge模拟资料检索save_report模拟保存报告在真实项目中这两个工具可以替换成真正的业务能力比如搜索网页查询数据库读取知识库调用内部接口保存文件发送邮件发布文章需要注意的是工具函数的名称、参数和注释都很重要。因为模型会根据工具名称、参数结构和 docstring 判断什么时候调用哪个工具。3. 统一管理工具定义完工具之后我们把它们放到一个列表中并构建一个按名称索引的字典。tools [search_knowledge, save_report]tools_by_name {tool.name: tool for tool in tools}tools会绑定给大模型让模型知道自己有哪些工具可以使用。tools_by_name会在真正执行工具时使用。因为模型返回的工具调用结果里通常包含工具名称和参数例如{ name: search_knowledge, args: { query: LangGraph 智能体开发 }}我们需要根据工具名称找到对应函数然后执行它。4. 初始化模型并绑定工具接下来初始化大模型model init_chat_model( openai:gpt-4o-mini, temperature0)model_with_tools model.bind_tools(tools)这里的model是普通聊天模型。调用bind_tools(tools)之后模型就具备了“选择工具”的能力。也就是说模型不只是直接回答问题它还可以判断这个问题我能不能直接回答是否需要先调用 search_knowledge是否需要调用 save_report工具调用之后应该如何组织最终答案在实际项目中你可以把模型替换成自己使用的模型服务。5. 定义 AgentStateState 是 LangGraph 智能体运行过程中的共享状态。这里我们定义一个最小状态结构class AgentState(TypedDict): messages: Annotated[list[AnyMessage], operator.add] llm_calls: int这个状态里包含两个字段messages保存整个对话过程中的消息包括用户输入、模型回复、工具结果llm_calls记录模型被调用了多少次其中最关键的是这一行messages: Annotated[list[AnyMessage], operator.add]它表示每次节点返回新的 messages 时LangGraph 会把新消息追加到原来的消息列表中而不是直接覆盖。这对于 Agent 非常重要。因为 Agent 的运行过程通常是这样的用户消息模型消息工具调用结果模型再次分析最终回答这些都需要保存在消息历史中。6. 编写 LLM 节点LLM 节点是智能体的大脑。它负责读取当前状态然后调用模型进行分析。def llm_node(state: AgentState): response model_with_tools.invoke( [ SystemMessage( content( 你是一个资料整理智能体。 当用户问题需要资料时先调用 search_knowledge 整理完成后可以调用 save_report 保存结果。 最终回答要清晰、结构化、简洁。 ) ) ] state[messages] ) return { messages: [response], llm_calls: state.get(llm_calls, 0) 1 }这个节点做了三件事。第一读取当前状态里的消息state[messages]第二把系统提示词和历史消息一起传给模型[SystemMessage(...)] state[messages]第三把模型返回结果追加到状态中return { messages: [response], llm_calls: state.get(llm_calls, 0) 1}注意这里的response可能是普通回答也可能是工具调用请求。如果模型认为需要检索资料它不会直接输出最终答案而是返回类似这样的工具调用信息tool_calls[ { name: search_knowledge, args: { query: LangGraph 智能体开发 } }]下一步LangGraph 就会根据这个结果决定是否进入工具节点。7. 编写工具节点工具节点负责真正执行模型请求调用的工具。def tool_node(state: AgentState): result [] last_message state[messages][-1] for tool_call in last_message.tool_calls: tool tools_by_name[tool_call[name]] observation tool.invoke(tool_call[args]) result.append( ToolMessage( contentstr(observation), tool_call_idtool_call[id] ) ) return {messages: result}这段代码的执行逻辑是1. 取出上一条模型消息2. 查看模型想调用哪些工具3. 根据工具名称找到对应工具函数4. 把模型生成的参数传给工具5. 拿到工具执行结果6. 把结果包装成 ToolMessage7. 返回给 LangGraph其中这行代码很关键last_message state[messages][-1]它取出最后一条消息。如果最后一条消息是模型发出的工具调用请求那么里面就会包含tool_calls。然后通过tool tools_by_name[tool_call[name]]observation tool.invoke(tool_call[args])执行具体工具。工具执行完成后结果不能直接返回字符串而是要包装成ToolMessageToolMessage( contentstr(observation), tool_call_idtool_call[id])这样模型才能知道这是刚才那个工具调用对应的执行结果。8. 编写条件路由函数接下来要告诉 LangGraphLLM 节点执行完之后下一步应该去哪里如果模型请求调用工具就进入工具节点如果模型没有请求工具就结束流程。def should_continue(state: AgentState) - Literal[tool_node, END]: last_message state[messages][-1] if getattr(last_message, tool_calls, None): return tool_node return END这就是 LangGraph 的条件边。它的判断逻辑非常简单如果最后一条模型消息里有 tool_calls → 进入 tool_node否则 → 结束这也是 Agent 能够自动循环的关键。因为每次 LLM 节点执行后都要判断现在是继续调用工具还是已经可以输出最终答案9. 构建 LangGraph 流程图有了状态、节点和条件路由之后就可以开始构建图了。builder StateGraph(AgentState)builder.add_node(llm_node, llm_node)builder.add_node(tool_node, tool_node)这里创建了一个StateGraph并注册了两个节点llm_node模型分析节点tool_node工具执行节点节点注册之后还要定义流程如何流转。builder.add_edge(START, llm_node)这表示图启动后先进入 llm_node。然后添加条件边builder.add_conditional_edges( llm_node, should_continue, [tool_node, END])这表示llm_node 执行完成后调用 should_continue 判断下一步- 如果返回 tool_node就进入工具节点- 如果返回 END就结束流程最后把工具节点连接回 LLM 节点builder.add_edge(tool_node, llm_node)这表示工具执行完成后再回到 LLM 节点。这样一个最基础的 Agent 循环就形成了START ↓llm_node ↓是否需要工具 ├── 是tool_node → llm_node └── 否END10. 编译 Graph图构建完成后需要调用compile()生成可运行的 Agent。agent builder.compile()编译之后agent就可以像普通函数一样被调用。不过它背后执行的不是一段简单代码而是一张完整的状态流转图。11. 运行 Agent最后我们传入用户消息运行这个智能体。if __name__ __main__: result agent.invoke( { messages: [ HumanMessage(content帮我整理一段关于 LangGraph 智能体开发的介绍) ], llm_calls: 0 } ) print(result[messages][-1].content)这里传入的初始状态是{ messages: [ HumanMessage(content帮我整理一段关于 LangGraph 智能体开发的介绍) ], llm_calls: 0}LangGraph 会按照我们定义好的流程自动执行用户输入→ LLM 分析→ 判断是否需要工具→ 调用工具→ 工具结果返回→ LLM 生成最终回答最终我们通过result[messages][-1].content取出最后一条消息也就是智能体的最终回答。12. 完整代码汇总把上面的部分组合起来完整代码如下from typing import Annotated, Literalfrom typing_extensions import TypedDictimport operatorfrom langchain.chat_models import init_chat_modelfrom langchain.tools import toolfrom langchain.messages import AnyMessage, HumanMessage, SystemMessage, ToolMessagefrom langgraph.graph import StateGraph, START, ENDtooldef search_knowledge(query: str) - str: 根据用户问题检索资料。 returnf这里是关于「{query}」的模拟检索结果LangGraph 适合开发有状态、可控、可扩展的智能体。tooldef save_report(title: str, content: str) - str: 保存生成的报告。 returnf报告《{title}》已保存成功。tools [search_knowledge, save_report]tools_by_name {tool.name: tool for tool in tools}model init_chat_model( openai:gpt-4o-mini, temperature0)model_with_tools model.bind_tools(tools)class AgentState(TypedDict): messages: Annotated[list[AnyMessage], operator.add] llm_calls: intdef llm_node(state: AgentState): response model_with_tools.invoke( [ SystemMessage( content( 你是一个资料整理智能体。 当用户问题需要资料时先调用 search_knowledge 整理完成后可以调用 save_report 保存结果。 最终回答要清晰、结构化、简洁。 ) ) ] state[messages] ) return { messages: [response], llm_calls: state.get(llm_calls, 0) 1 }def tool_node(state: AgentState): result [] last_message state[messages][-1] for tool_call in last_message.tool_calls: tool tools_by_name[tool_call[name]] observation tool.invoke(tool_call[args]) result.append( ToolMessage( contentstr(observation), tool_call_idtool_call[id] ) ) return {messages: result}def should_continue(state: AgentState) - Literal[tool_node, END]: last_message state[messages][-1] if getattr(last_message, tool_calls, None): returntool_node return ENDbuilder StateGraph(AgentState)builder.add_node(llm_node, llm_node)builder.add_node(tool_node, tool_node)builder.add_edge(START, llm_node)builder.add_conditional_edges( llm_node, should_continue, [tool_node, END])builder.add_edge(tool_node, llm_node)agent builder.compile()if __name__ __main__: result agent.invoke( { messages: [ HumanMessage(content帮我整理一段关于 LangGraph 智能体开发的介绍) ], llm_calls: 0 } ) print(result[messages][-1].content)13. 这段代码真正体现了 Agent 的核心能力虽然这个示例很小但它已经包含了智能体开发中最重要的几个部分模型负责理解任务和规划下一步工具负责执行模型自己做不了的事情状态负责保存过程中的上下文节点负责拆分执行逻辑边负责控制流程流转条件判断负责决定是否继续执行循环负责让模型和工具多轮协作这也是 LangGraph 的核心价值。它不是让你简单调用一次大模型而是让你把一个复杂任务拆成多个可控步骤让模型、工具和业务逻辑按照你设计的流程协同工作。六、为什么要定义 State很多初学者会问为什么不直接把消息传给模型因为智能体不是一次性问答。一个真正可用的 Agent运行过程中会产生很多中间状态比如{ messages: [...], llm_calls: 2, search_results: [...], draft: ..., approved: False, error_count: 0}这些状态决定了智能体下一步做什么。比如如果approvedFalse就进入人工审核节点如果error_count 3就停止执行如果search_results为空就重新检索如果已经生成草稿就进入保存节点。这也是 LangGraph 比普通链式调用更适合复杂业务的原因。七、给 Agent 加上记忆能力如果你希望智能体记住某个用户之前的对话就需要引入 checkpoint。LangGraph 有内置 persistence layer可以把图的状态保存为 checkpoint。当 graph 编译时配置 checkpointer 后执行过程中的状态快照会被保存下来从而支持记忆、人类介入、时间回溯调试和容错恢复等能力。开发阶段可以先用内存版from langgraph.checkpoint.memory import InMemorySavercheckpointer InMemorySaver()agent builder.compile(checkpointercheckpointer)config { configurable: { thread_id: user-001 }}agent.invoke( { messages: [HumanMessage(content我正在学习 LangGraph)], llm_calls: 0 }, configconfig)agent.invoke( { messages: [HumanMessage(content我刚才说我在学什么)], llm_calls: 0 }, configconfig)这里最关键的是thread_id。你可以把它理解成“某个用户的一条会话线程”。同一个thread_id下LangGraph 可以恢复之前的状态。官方文档也提到使用 checkpointer 时需要通过configurable指定thread_id它会作为保存和恢复 checkpoint 的关键标识。八、支持流式输出让用户体验更好真实产品中不建议让用户一直等待完整结果。尤其是长文章生成资料分析多步骤推理工具调用较慢这些场景都适合流式输出。LangGraph 官方文档中提到流式系统可以实时展示更新让应用在 LLM 存在延迟时依然有更好的用户体验。示例for chunk in agent.stream( { messages: [HumanMessage(content写一篇 LangGraph 入门教程)], llm_calls: 0 }, stream_modeupdates): print(chunk)这样前端就可以把每一步更新展示出来比如正在分析用户问题...正在调用搜索工具...正在整理资料...正在生成最终内容...这会比单纯转圈等待体验好很多。九、什么时候需要人工介入很多业务不适合完全自动化。比如自动发邮件前需要用户确认自动下单前需要用户确认自动修改数据库前需要管理员审批自动发布文章前需要人工审核自动生成合同前需要法务确认。这时可以设计一个 human-in-the-loop 节点。流程可以变成生成草稿 ↓进入人工审核节点 ↓用户确认 ├── 是继续执行 └── 否返回修改LangGraph 的优势在于它不是简单“暂停一下”而是可以结合 checkpoint把当前状态保存下来等人工处理完成后再继续执行。官方文档也提到持久执行非常适合 human-in-the-loop 场景因为用户可以检查、验证或修改流程然后再继续。十、一个实际项目可以怎么设计假设我们要做一个“每日 AI 资讯整理智能体”。可以把 LangGraph 设计成这样开始 ↓读取今日任务 ↓抓取网站 / RSS / API ↓清洗内容 ↓判断是否为 AI 相关资讯 ↓总结每条资讯 ↓按重要性排序 ↓生成日报草稿 ↓人工审核 ↓发布到公众号 / 飞书 / 邮件 ↓结束对应到 LangGraphState:- raw_articles- filtered_articles- summaries- final_report- approved- publish_resultNodes:- fetch_news_node- filter_news_node- summarize_node- rank_node- write_report_node- human_review_node- publish_nodeEdges:- 抓取后进入过滤- 过滤后进入总结- 总结后进入排序- 排序后进入写作- 写作后进入人工审核- 审核通过后发布- 审核不通过则返回写作节点这就是 LangGraph 的真正价值它不是只让模型回答问题而是让模型参与一个可控、可追踪、可恢复的业务流程。十一、开发 LangGraph 智能体的几个建议第一不要一开始就做“大而全”的 Agent。先做一个最小闭环用户输入 → 模型判断 → 工具调用 → 最终输出跑通之后再加记忆、人工审核、流式输出和多智能体协作。第二工具函数要尽量清晰。工具不是越多越好而是要边界清楚。比如search_news()summarize_article()save_to_database()send_email()publish_article()每个工具只做一件事Agent 才更容易正确调用。第三State 设计要提前规划。State 不要只放 messages。真实项目中建议把任务状态、中间结果、错误信息、审批状态都放进去。第四关键动作一定要可追踪。比如发邮件、发布文章、修改数据库、调用支付接口这类动作都应该先生成草稿再人工确认最后执行第五生产环境一定要考虑持久化。内存 checkpointer 只适合本地开发。真正上线时要考虑数据库、任务队列、日志、权限、重试、监控等工程能力。十二、总结开发 LangGraph 智能体本质上不是“写一个更复杂的 Prompt”。而是把 AI 应用从一次性问答升级成一个有状态、有流程、有工具、有记忆、可恢复的智能系统。你可以把它理解成Prompt 解决表达问题Tools 解决能力问题State 解决上下文问题Graph 解决流程问题Checkpoint 解决可靠性问题。当你的 AI 应用只需要回答问题时直接调用大模型就够了。但当你的 AI 应用需要真正“做事”时比如检索、分析、审批、生成、保存、发布、恢复执行LangGraph 就会变得非常有价值。未来的 Agent 应用不会只是一个聊天框。它更像是一个可以持续运行、可以调用工具、可以理解流程、可以和人协作的自动化系统。而 LangGraph正是构建这类系统的一块重要基础设施。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】