从 Loop 到 Graph:一次 Agent 架构的进化,以及 LangGraph 内核里藏着的那台状态机

发布时间:2026/7/30 2:43:57
从 Loop 到 Graph:一次 Agent 架构的进化,以及 LangGraph 内核里藏着的那台状态机 上周刷到一篇文章开头引了 X 上的一个问题“Are we still talking loops, or did we shift to graphs yet?”我们还在聊 Loop 吗还是已经进入 Graph 时代了说实话我第一反应是又来造词。但我花了一个周末把公众号上的讨论、LangGraph 的架构文档、几篇英文技术博客以及港大那篇 GraphAgent 论文都翻了一遍之后结论变了这轮讨论的含金量比我想象的高得多。它不只是“流程图画法”的争论背后是图论、BSP 并行计算模型、状态机工程甚至知识图谱与大模型融合的一整条技术线。这篇文章是我的阅读笔记尽量把技术细节讲透。一、Loop 的死穴它只有“下一步”没有“全局”早期 Agent 的逻辑就是一个循环你给目标模型想一步调个工具看结果没完成就再来一轮。查资料、调 API、写小段代码这么跑完全没问题。任务一复杂就不行了。让 Agent“分析销售数据找出影响转化率的因素出一份报告”至少六步采数、清洗、探索分析、建模、写报告、质检。跑起来全是岔路●探索分析发现数据分布不对是退回重洗还是硬着头皮建模●建模建到一半发现关键字段缺失重新采数还是换个替代指标●报告图表格式错了局部修还是整份重做「AI产品经理之路」那篇文章里有句话说得准Loop 关心的是“下一步模型该做什么”Graph 关心的是“整个任务该怎么流转”。前者没有全局状态的概念Agent 不知道自己走到任务的哪个阶段自然谈不上主动回退、并行和跳转。但我想补充一层Loop 的问题不只是“不知道在哪”还有三个工程上的硬伤。第一状态隐式地堆在上下文里越滚越长成本和噪声一起涨第二没法并行——数据分析里“建模”和“可视化”明明可以同时进行Loop 只能串行排队第三没法精确恢复跑到第五步崩了要么从头再来要么靠日志人肉还原。这三个硬伤恰好就是 Graph 架构逐个解决的东西。不过在拆 LangGraph 之前值得先花一分钟把图论的地基打上。二、先补一课图论节点、边以及为什么“有环”这么重要图Graph在数学里就两样东西节点Node和边Edge。节点表示一个计算步骤边表示状态怎么流转。听起来简单但图的性质差别直接决定了系统能力的上限。传统的流程编排大多是有向无环图DAGA 到 B 到 C一条路走到底绝不回头。Airflow、早期的 LangChain Chain 都是这个思路。DAG 的好处是可预测、好调度坏处是表达不了“根据结果回到上一步重试”这种逻辑——而 Agent 的核心行为恰恰是“看结果再决定下一步”天然需要环。LangGraph 的关键一步就是显式支持有环图边可以指回上游节点形成受控的循环。这让迭代精炼、自动重试、多轮推理这些模式成了图的原生能力而不是在 DAG 外面硬套 while。从图论角度看Agent 系统的进化可以概括成一句话从链Chain到有向无环图DAG再到带环、带条件路由、带共享状态的状态机图State Graph。表达力每上一层能描述的系统行为就复杂一个量级。图 1Loop 与 Graph 架构对比——前者只会原地转圈后者能分支、并行、回退三、LangGraph 内核它其实是一台 BSP 状态机大多数人用 LangGraph停留在 add_node、add_edge、compile 这一层。但真正决定它行为的是底层的执行模型。我翻了几篇拆解源码的英文博客最有意思的发现是LangGraph 的运行时 PregelLoop实现的是 Google 当年为图计算提出的 BSPBulk Synchronous Parallel整体同步并行模型。3.1 State 不是变量是 Channel在 LangGraph 里你定义的 State schema通常是 TypedDict里的每个字段底层都是一个 channel通道。节点不直接改共享内存而是向通道发布更新。通道分三种行为●LastValue默认保留最新值适合覆盖式更新●BinaryOperatorAggregate用二元操作符合并更新比如 Annotated[list[str], operator.add] 表示“追加而不是覆盖”——这是并行安全的关键同一超步里多个节点写同一个字段运行时按确定性规则聚合不会丢更新、不会有竞态●Topic类似 pub/sub 的瞬时事件通道。一个最小可用的 State 定义长这样from typing import TypedDict, Annotatedimport operatorclass AgentState(TypedDict):messages: Annotated[list[str], operator.add] # 追加式通道并行安全 summary: str # 默认通道覆盖式更新 retry\_count: int注意 Annotated[list[str], operator.add] 这一行——它定义的不只是类型而是“这个字段的更新怎么合并”。这是整个状态设计的题眼。这个设计的前端类比很直观Node 是处理函数Edge 是路由规则State 是 Redux storereducer 决定状态怎么合并。「前端Q」那篇文章用的就是这个类比基本准确。3.2 PregelLoop一个超步superstep的三个相位LangGraph 的执行不是一个连续的 while 循环而是一个个离散的“超步”。每个超步分三个相位Plan规划运行时检查各通道的版本号。如果某个节点订阅的通道在上一步被更新了这个节点就被激活如果上一步结束在条件边上路由函数决定下一步激活谁。注意调度是数据驱动的不是写死的顺序。Execute执行所有被激活的节点并行跑。这里有两个关键机制——读隔离和写缓冲。每个节点读到的是超步开始时的状态快照哪怕并行节点 A 已经产出了更新节点 B 看到的还是旧快照节点的输出先写进缓冲区不立即生效。Update Barrier更新与栅栏所有活跃节点跑完后运行时收集缓冲的写入应用 reducer 合并比如 old_messages new_A new_B递增通道版本号然后把完整状态序列化进 checkpoint 存储。做完这一切栅栏才放开下一个超步开始。图 2BSP 超步的三个相位——规划调度、隔离执行、栅栏合并后落盘3.3 Checkpoint 不是存档是逻辑时钟很多人把 Checkpointer 理解成“游戏存档”这个理解浅了。从机制上看checkpoint 存的是 channel_values用户数据加版本号本质上是一个逻辑时钟它让“回到过去某个超步、改一个输入、继续往下走”成为合法操作。这直接撑起三个生产场景都是业界真实用法●复现线上 bug。客户说“昨天导出的 JSON 少了三条”从 checkpointer 捞出那个线程的历史定位到导出节点跑完时的状态发现过滤条件是时区写错了。整个排查不到十分钟。●What-if 分支实验。“Reviewer Agent 换成便宜一档的模型结果会差多少”从昨天某个 checkpoint 出发改一行模型名继续跑不用重跑前面一小时的活。●人工审批。状态与执行解耦意味着你可以“冻结世界”让人工改完状态比如修正转账金额再恢复执行系统就当世界一直是一致的。四、生产环境的五个坑都是真金白银买的概念讲完说点疼的。我找到一篇业界实战文章记录了五个把 LangGraph 推上线时真实踩过的坑每个都值得展开。坑一State 设计成巨型 dict。MVP 阶段图快所有数据塞同一层三个月后 40 个字段没人说清哪个节点会改哪个。正解是用嵌套 TypedDict 分区把字段归成 pipeline_meta、coder_output、test_results 这类子对象责任边界一目了然。坑二把 LLM 调用塞进条件边函数。想让 LLM 判断“该走哪条分支”结果 edge 函数变成一次模型调用。这是灾难——路由函数应该是纯 Python、确定性、可单元测试的。LLM 的判断该放回节点内部写成 state 字段edge 只读那个字段。坑三拿 MemorySaver 上生产。教程示例几乎全用内存版 checkpointer新人抄过来就部署进程一重启所有线程状态全丢。有团队被产品经理报障“客户点了 approve 系统却不记得”查了半天才发现是 checkpointer 问题。生产环境老老实实用 PostgresSaver最好写成 lint 规则挡住 MemorySaver 进主分支。坑四不设递归上限烧钱死循环。条件边写错一个条件重试就永远停不下来。默认跑满 25 步才抛 GraphRecursionError但 25 次顶级模型调用已经烧掉好几美元。正解是在路由函数里显式检查 retry_count超上限强制走人工审核或 END别指望 recursion_limit 兜底。坑五reducer 的隐形成本。reducer 每次节点跳转都要跑一遍。如果你的 list 已经几千个元素operator.add 等于每次全量复制。日誌型数据用 reducer 累加是常见性能陷阱——正解是把累积数据写外部存储Postgres、S3state 里只放引用指针。还有一个选型细节TypedDict 和 Pydantic 怎么选。实测经验是先 TypedDict 起步近乎零成本只给“接收外部输入的节点”比如 webhook 入口换 Pydantic 做运行时校验。一上来全用 Pydantic每次节点跳转多吃 5-15 毫秒多节点图累积起来很可观。五、三个高级模式动态扇出、子图、人在回路5.1 Map-Reduce运行时才知道要并行几路普通并行是编译时画死的。但真实任务经常是“规划阶段才知道要拆几个子任务”。LangGraph 用 Send API 解决这个问题规划节点返回一组 Send 对象运行时在下一个超步动态 fan-out 出 N 个 worker 并行执行所有 worker 的结果通过 operator.add 这类 reducer 聚合到列表字段全部完成后 fan-in 到汇总节点。写调研报告时“按章节并行起草再合并”就是这个模式。5.2 子图图可以嵌套图一张编译好的子图可以作为节点挂进父图。父图暂停子图按自己的超步推进跑完把状态交还父图。这让复杂系统可以分形组合——每个子团队维护自己的图对外只暴露一个节点接口避免了“巨型单图”的维护地狱。5.3 HITLinterrupt 是把“暂停”变成一等公民前面说过 checkpoint 让冻结世界成为可能interrupt 机制就是它的用户接口节点执行到 interrupt(“Approve transfer of 1000?”) 时整个图挂起、状态落盘等人工输入 approve 或 reject 后从挂起点精确恢复。转账、发文、删库这类高危操作前设一道这样的闸成本几乎为零。5.4 横向对比和 CrewAI、AutoGen 比呢很多人会问多智能体框架不止 LangGraph 一个差别在哪几篇英文拆解给的判断挺一致。CrewAI 走的是“角色扮演团队”的高层抽象定义角色、目标、任务就能跑上手最快适合快速验证想法。但代价是粒度——你很难精确控制状态流转想实现严格的回滚和重放基本没戏。AutoGen 以“对话”为中心多个 Agent 靠消息互相对话来推进任务。这个范式很符合直觉但状态散落在各个 Agent 的对话历史里没有一个集中的、可检查的全局状态。想做全局撤销、时间旅行调试会发现状态根本捞不出来。LangGraph 的选择是把状态集中化、显式化再把执行语义超步、栅栏、reducer钉死。学习曲线确实更陡但换来的是可观察、可恢复、可调试、可优化——这四点恰恰是生产环境和玩具 Demo 的分水岭。一篇综述文章里的说法我很认同当你的工作流需要显式分支、并行路径和人工审批闸时图状态机是目前最顺手的抽象。图 3多智能体 Supervisor 协作结构——调度、分工、人工审批、反馈回流六、论文视角GraphAgent 把“图”又往深推了一层如果说 LangGraph 解决的是“Agent 流程怎么组织”学术界最近在解的是另一个问题Agent 怎么理解和利用数据里的图结构。港大 HKUDS 实验室的 GraphAgentarXiv:2412.17029已被 EMNLP 2025 接收开源在 GitHub是这条线的代表作。它的出发点很实在真实世界的数据同时以结构化和非结构化形式存在——既有显式的图连接社交关系、用户行为也有语义实体之间隐式的相互依赖通常靠知识图谱表达。GraphAgent 由三个协作的 Agent 组成●Graph Generator Agent从原始数据构建知识图谱把复杂的语义依赖显式化●Task Planning Agent理解多样化的用户查询通过自主规划把查询拆解成可执行的任务序列●Task Execution Agent执行规划好的任务自动完成工具匹配和调用。三个 Agent 无缝协作把大语言模型和图语言模型Graph Language Model结合起来同时覆盖预测类任务如节点分类和生成类任务如文本生成论文在多个数据集的两类任务上都验证了有效性。这篇论文有几个细节值得单独说。第一它处理的是“双重依赖”问题显式依赖好办图数据库里本来就存着难的是隐式依赖——两段文本在语义上相关但没有任何现成的边把它们连起来Graph Generator Agent 要做的就是把这种语义相关性蒸馏成图谱结构。第二Task Planning Agent 用的是“自主规划”而不是静态模板同一个“帮我分析这个用户的社交关系”的查询系统会自己决定先建图、再跑节点分类、最后生成自然语言解释任务序列是运行时生成的。第三它把两类模型做了分工语言模型负责理解意图和生成文本图语言模型负责在图结构上推理中间的接口是任务规划层。这种“各干各的强项”的拆法和工程侧多智能体的 Supervisor 模式在思想上是一致的。把它放进更大的学术脉络里看更有意思Think-on-Graph 让 LLM 在知识图谱上做“深思式”推理GraphGPT 用图指令微调让 LLM 直接理解图结构2025 年初还有专门的 Graph RAG 综述系统梳理“图增强检索生成”这条线。我的判断是工程侧的 Agent Graph流程编排和学术侧的 Graph LLM知识组织正在合流——未来的 Agent 既运行在图上也思考着图。当然也要说句公道话这条线目前还在早期。GraphAgent 的实验集中在学术基准数据集上图谱构建的质量高度依赖底层模型的能力放到企业里真实的脏数据上表现如何还需要更多验证。学术展示的效果和生产环境的稳定性之间隔着的正是前面几节讲的那些工程细节。七、放回地图五层工程里Graph 管的是“组织”最后把视角拉高。「Pipeline」有篇文章借用了 X 上的一个框架把 AI 应用拆成五层工程这是我见过的把 Graph 的位置讲得最清楚的地图层次核心问题典型工程内容Prompt Engineering模型这一轮该怎么回答角色、指令、示例、输出格式Context Engineering模型该知道什么检索、重排、记忆、上下文裁剪Harness Engineering模型能做什么如何安全地做工具、权限、重试、校验、观测Loop Engineering工作如何自动推进何时停止触发器、状态、预算、停止条件Graph Engineering多个角色如何协作节点、边、路由、并行、审批、共享状态一句话Prompt 管模型怎么回答Context 管模型知道什么Harness 管模型能干什么Loop 管活怎么往下干Graph 管一帮 Agent 怎么搭伙干活。五层是叠加关系不是替代关系——单次分类任务不需要 Graph简单内部工具也不必硬拆多 Agent。八、巨头的 Graph比工程图纸更大工程之外商业侧的“Agent Graph”是另一个量级的故事。2026 年 3 月 10 日Meta 收购了 AI Agent 社交网络 Moltbook一个“AI Agent 版 Reddit”团队并入 Meta 超级智能实验室。「AI智能新动态」的解读是Facebook 当年靠 Friend Graph 连接了几十亿人Meta 现在想织一张连接数以亿计 AI agents 的网。等 AI 开始替人购物、预订、做决策谁握着这张网谁就握着未来的商业入口。OpenAI 二月挖走 OpenClaw 创始人腾讯出了 QClaw这条赛道已经开卷。九、落地建议够用就好但底线要守住综合所有材料我的实践建议浓缩成几条先定任务和验收标准再谈架构。单个 Agent 加工具加验证器能搞定的别拆多 Agent。正确顺序是Prompt → Context → Harness → Loop → 确实需要多角色协作时才上 Graph。上了 Graph 就守住三条底线路由函数保持纯 Python 确定性生产环境 checkpointer 用持久化存储重试次数在路由里显式封顶。State 设计提前想清楚嵌套分区、累积数据放外部存储只留指针、reducer 只给真正需要合并语义的字段。高危操作一律过 interrupt 人工闸。写在最后绕了一圈Agent 这几年其实就干了一件事一层层往外补。Prompt 补回答质量Context 补信息Harness 补安全执行Loop 补持续推进Graph 补稳定运行与协作。LangGraph 把 2010 年 Google 为图计算发明的 BSP 模型搬进 Agent 运行时这件事让我挺感慨的Agent 架构的下一站答案可能就藏在分布式系统和图计算十几年前的论文里。新技术的问题往往是老技术的答案。至于那张连接亿万 Agent 的网最后织成什么样老实说我也很好奇。学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%免费】