这道题其实是在问,当[[Agent]]工作流变复杂时,怎么用合适的抽象来编排它。LangGraph的答案是把工作流看作一个状态机,用图结构来建模。我先说核心特性。
LangGraph最核心的抽象是StateGraph,它定义了一个共享的状态结构,各个节点读写这个状态,节点之间通过边连接。边有三种:普通边就是顺序执行,条件边根据状态做路由判断,循环边支持迭代。这样一来,像[[ReAct]]这种需要多轮思考-行动-观察的循环模式,天然就能表达出来,不用像在LangChain里那样用hack的方式实现。
另一个让我觉得很有价值的设计是内置持久化。它会自动保存checkpoint,支持断点续跑和类似时间旅行的调试。这在生产环境太重要了,比如长任务跑到一半挂了,能恢复继续跑;或者需要人介入审核的环节,可以停下来等人确认再继续。
再说边界划分。很多人会把LangGraph、LangChain、AutoGen这些混在一起比较。我的理解是,LangChain的Chain适合简单流水线,比如固定步骤的[[RAG]],一步检索一步生成,没有分支和循环。LangGraph的Graph适合复杂状态机,比如多轮确认的客服流程、需要循环的Agent。AutoGen更侧重多Agent对话,它的核心抽象是对话轮次,图控制能力比较弱。实际落地时,这些框架常常是组合使用的,比如用LangChain搭检索组件,用LangGraph编排整个流程,用AutoGen处理Agent之间的对话。
举个具体业务场景,客服退款流程。用户说“我要退款”,Agent先判断订单状态,如果订单已发货,需要先确认退货意愿,再生成退货地址,然后等用户寄回,确认收货后再退款。这个过程中有分支(已发货vs未发货)、有循环(用户可能修改退货原因)、需要人介入(高金额退款需人工审核)。用LangGraph可以很清晰地建模:每个环节是一个节点,状态里存订单信息、用户确认状态、审核结果,条件边根据状态路由到不同节点,循环边支持用户反复修改原因。这里有个坑:状态设计要小心,如果把所有中间信息都塞进状态,状态会膨胀得很快,影响性能和调试。我会把状态分成持久化部分和临时部分,持久化部分只存关键的业务字段,临时计算结果下游用完就清理。
上线我会特别关注调试复杂度。图结构虽然表达力强,但调试时不像线性链那么好追踪。我会先保证每个节点有清晰的输入输出定义,配合持久化的checkpoint,可以在任意断点恢复并检查状态。另外,如果团队对状态机不熟悉,初始阶段可能觉得图比链难理解,我会先在核心流程上试用,等团队熟悉了再推广到更多场景。
还有一个点值得提,就是持久化不仅支持容错,还天然支持人类介入场景。比如在退款审批节点,可以让Agent生成建议但停在那边,等人确认后再继续。这其实把Agent从完全自动变成了半自动协作,我觉得这种模式在风险敏感业务里会越来越重要。
所以我的判断是,LangGraph适合需要显式状态管理和复杂控制流的场景,但前提是团队对图建模有理解,并且状态设计要克制。我更倾向把它看成Agent工作流的编排层,而不是一个全能框架。