你有没有想过为什么同样是调用 LLM用了 LangGraph 之后AI 就能「想一步、停一步、判断一步」就能在工具调用和 LLM 推理之间来回切换还不会乱套答案就藏在它的状态机设计里。01 先说说 LangChain 的老问题LangChain 的早期架构是线性的——Chain。用户输入 → PromptTemplate → LLM → OutputParser → 输出这个模型干净利落但有个致命弱点控制流是固定的。一旦你想实现「如果 LLM 觉得需要查数据库就查不需要就跳过」或者「出错了重试三次」你会发现原来的 Chain 根本放不下这些逻辑。要么把判断逻辑硬编码在节点里要么用 Python 的 if/else 在外层手动管流程——乱成一锅粥。现实中的 Agent 场景根本不是线性的调工具 → 看结果 → 决定调下一个还是直接回答生成草稿 → 自我审查 → 不行就重写多轮对话 → 根据意图走不同分支这些都需要带状态的循环控制流。这正是 LangGraph 解决的核心问题。02 状态机是什么用最简单的例子解释状态机State Machine不是什么新概念。你手机的蓝牙就是个状态机[关闭] --打开-- [扫描中] --发现设备-- [配对中] --成功-- [已连接] | --失败-- [扫描中]三个核心要素┌─────────────────────────────────────────────┐ │ 状态机三要素 │ ├──────────┬──────────────────────────────────┤ │ State │ 当前的数据快照系统处于什么情况│ │ Node │ 执行动作并更新 State │ │ Edge │ 决定下一步去哪个 Node │ └──────────┴──────────────────────────────────┘LangGraph 就是把这套机制套在了 LLM 上State 对话历史 工具结果 中间变量Node LLM 调用 / 工具执行 / 业务逻辑Edge 普通跳转 / 条件分支Conditional Edge03 StateGraph 执行引擎它的心脏长什么样打开 LangGraph 的源码Python 版langgraph/graph/state.pyJS 版同理你会看到StateGraph类维护了几个核心数据结构┌──────────────────────────────────────────────────┐ │ StateGraph 内部 │ ├─────────────────┬────────────────────────────────┤ │ nodes │ Map名称, 函数 │ │ edges │ Mapfrom, to[] │ │ conditional_ │ Mapfrom, (state)节点名 │ │ edges │ │ │ channels/ │ 每个状态字段的 Reducer │ │ schema │ │ └─────────────────┴────────────────────────────────┘当你调用graph.compile()时它做了什么compile() 阶段 │ ├─ 验证图结构有没有孤立节点有没有到 END 的路径 ├─ 构建邻接表预计算每个节点的后继 ├─ 初始化 Channels每个状态字段注册 Reducer └─ 返回 CompiledGraph可以 invoke/streamcompile()本质上是把你「描述的图」变成「可执行的调度器」。04 一次完整执行从 invoke 到节点运行的全流程来看最简单的例子一个单节点 LLM AgentimportStateGraphSTARTENDfromlangchain/langgraphimportAnnotationfromlangchain/langgraphimportChatOpenAIfromlangchain/openaiimportHumanMessagefromlangchain/core/messages// 1. 定义状态结构constAgentStateAnnotationRootmessagesAnnotationHumanMessagereducer(prev, next) default() // 2. 初始化 LLMconstnewChatOpenAImodelgpt-4o-mini// 3. 定义节点函数asyncfunctioncallLLMstate: typeof AgentState.Stateconstawaitinvokemessagesreturnmessages// 4. 构建图constnewStateGraphAgentStateaddNodellmaddEdgeSTARTllmaddEdgellmENDcompile// 5. 运行constawaitinvokemessagesnewHumanMessage你好介绍一下自己执行流程逐步拆解graph.invoke({ messages: [...] }) │ ▼ 1. 初始化 State messages [HumanMessage(你好...)] │ ▼ 2. 调度器从 START 出发 → 找到边START → llm │ ▼ 3. 执行节点 llm callLLM(state) 被调用 → llm.invoke(messages) → 返回 { messages: [AIMessage(我是...)] } │ ▼ 4. 合并状态Reducer 新 messages [...旧, AIMessage(我是...)] │ ▼ 5. 调度器检查下一步 → llm 的边指向 END → 执行结束 │ ▼ 6. 返回最终 State05 Reducer状态更新的核心机制这是很多人没搞清楚的地方。节点函数返回的不是「新 State」而是「State 的更新片段」。LangGraph 用Reducer把旧状态和更新片段合并。// 三种常见 Reducer 写法// 方式1用内置 messagesStateReducer追加消息constState1AnnotationRootmessagesAnnotationBaseMessagereducer(prev, next) // 方式2覆盖最新值覆盖旧值constState2AnnotationRootstepAnnotationnumberreducer(_, next) // 直接替换// 方式3累加计数constState3AnnotationRootcallCountAnnotationnumberreducer(prev, next) default() 0Reducer 的执行时机节点返回 { key: value } │ ▼ 对每个 key找到对应 Reducer newState[key] reducer(oldState[key], value) │ ▼ 生成新 State 快照 旧 State 不变不可变数据结构关键点State 是不可变的。每次节点执行都产生一个新的 State 快照旧快照被保留这是 Checkpoint 能实现的基础后面讲。06 图的调度器它怎么决定下一步去哪这是 LangGraph 最有意思的部分——调度器Scheduler。调度器本质上是一个事件循环while 当前节点 ! END: 1. 执行当前节点 node(state) → partial_update 2. 用 Reducer 合并状态 → new_state 3. 查询当前节点的出边 - 普通边直接去下一个节点 - 条件边调用路由函数 router(new_state) → 返回节点名 4. 把下一个节点加入执行队列 5. 取队列头 → 重复条件边Conditional Edge长这样importStateGraphSTARTENDfromlangchain/langgraph// 路由函数根据 state 返回下一个节点名functionrouteAfterLLMstate: typeof AgentState.Statestringconstmessagesmessageslength1// 如果 LLM 想调工具iftool_callsintool_callslengthreturntools// → 去工具节点returnEND// → 直接结束constnewStateGraphAgentStateaddNodellmaddNodetoolsaddEdgeSTARTllmaddConditionalEdgesllmtoolstools// 映射路由函数返回值 → 节点名ENDENDaddEdgetoolsllm// 工具执行完回到 LLMcompile执行路径示意START → llm → [判断] → 需要工具? Yes → tools → llm → [判断] → 不需要了? Yes → END No → END这就是 ReAct Agent 的本质一个带条件边的循环图。07 并行执行Fan-out / Fan-in 模式LangGraph 支持一个节点连到多个后继节点实现并行执行。// Fan-out一个节点触发多个并行节点constnewStateGraphAgentStateaddNodestartaddNodesearch_web// 并行addNodesearch_db// 并行addNodemerge// 合并addEdgeSTARTstartaddEdgestartsearch_web// 同时出发addEdgestartsearch_dbaddEdgesearch_webmerge// 都完成后汇聚addEdgesearch_dbmergeaddEdgemergeENDcompile调度器处理并行的方式start 节点执行完毕 │ ├──→ search_web加入执行队列 └──→ search_db加入执行队列 执行队列[search_web, search_db] 同时调度异步并发执行 两者都完成后 merge 节点的所有前驱都就绪 → merge 入队 │ ▼ merge 执行 → END这个 Fan-out/Fan-in 模式是并行搜索、多 Agent 协作的基础。08 编译产物CompiledGraph 里藏了什么compile()返回的CompiledGraph暴露了四个主要接口interfaceCompiledGraph// 同步执行返回最终 StateinvokeinputStateRunnableConfigPromiseState// 流式执行每个节点完成后 yield 一次streaminputStateRunnableConfigAsyncGeneratorRecordstringState// 可视化图结构调试用getGraphDrawableGraph// 获取当前状态需要 CheckpointergetStateconfigRunnableConfigPromiseStateSnapshotstream()的输出格式forawaitconstofstream// chunk 是一个对象{ 节点名: 该节点产生的状态更新 }// 例如// { llm: { messages: [AIMessage(...)] } }// { tools: { messages: [ToolMessage(...)] } }consolelog这就是为什么前端能实现「打字机效果」——每个节点完成前端就能收到一次更新。总结这篇我们从底层拆解了 LangGraph 把 LLM 变成状态机的核心机制StateGraph 三要素State 存数据、Node 执行动作、Edge 决定走向缺一不可Reducer 是关键节点返回的是「更新片段」而非「完整新状态」Reducer 负责合并State 始终不可变调度器是心脏本质是一个事件循环条件边让它能根据运行时状态动态决策compile() 的意义把声明式的图描述变成可执行的调度引擎做结构验证和邻接表预计算并行靠 Fan-out多条出边同时触发Fan-in 等待所有前驱完成调度器自动处理同步stream() 是流式基础每个节点完成即 yield这是打字机效果和实时反馈的技术支撑学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%免费】