Skip to content

LangGraph 与多步骤流程

1. 先从一个会变长的请求开始

假设用户发来一条消息:

我昨天和客户吵了一架,心情很差。你帮我看看明天下午有没有空,我想安排一次复盘会议。

这条消息看起来只是一句话,但系统内部要处理的事情并不少:

  1. 判断有没有安全风险或敏感内容。
  2. 判断用户当前的情绪状态。
  3. 判断这条消息里是否包含日程需求。
  4. 如果有日程需求,去查日历。
  5. 最后决定是安抚用户、给出建议,还是继续追问。

如果把这些步骤都塞进一个 Agent 的 Prompt,一次模型调用也能跑。但流程一长,真正难的地方不再是「模型能不能生成回复」,而是:

  • 这一步之后应该去哪一步。
  • 中间结果要不要保留、怎么传递。
  • 某一步失败后从哪继续。
  • 哪些步骤必须执行,哪些可以跳过。

这时候,LangChain 的单 Agent 封装开始显得不够用了,LangGraph 的工作流和运行时能力正是为了解决这些问题而设计的。

2. LangGraph 先解决的不是模型,而是流程

很多人第一次看到 LangGraph,会下意识把它理解成「Agent 的进阶版本」。这个理解不算错,但不够准确。更准确的说法是:

LangGraph 先解决的是流程编排问题,然后才是多 Agent 问题。

在刚才那条消息里,系统要不要先做安全检查、要不要做情绪分析、要不要走日历查询,这些都是流程问题。如果只靠普通函数把所有步骤串起来,代码很容易变成:

  • 先写一个 if
  • 再写一个 if
  • 中间塞一个工具调用
  • 失败后又加一个分支

步骤一多,代码会越来越像一条绕来绕去的线。LangGraph 做的事,就是把这条线整理成一张明确的图:节点是步骤,边是流转条件。

从职责上看,LangGraph 更适合处理下面这些事:

  • 组织流程顺序和分支。
  • 保存和传递中间状态。
  • 处理条件路由和回跳。
  • 让多个节点稳定协作。
  • 支持中断、恢复和人工确认。

3. 把日程请求拆成一张图

我们还是用刚才那条消息,把系统内部流程拆得更细:

节点职责可能产生的新信息
safety_check判断是否需要特殊处理安全标记、风险提示
emotion_check判断当前情绪状态情绪标签、安抚策略
intent_router判断是否是日程相关请求意图分类、下一步路由
calendar_lookup去外部系统查时间可用时间段、冲突事件
reply_generator生成最终回复最终回复文本

这张图里最值得关注的不是节点名字,而是这几个事实:

  • 请求不是一步完成的。
  • 有些步骤固定会走,比如安全检查和意图路由。
  • 有些步骤只在满足条件时走,比如日程意图成立时才查日历。
  • 中间会不断产生新信息。
  • 最后才汇总成回复。

这就是 LangGraph 的典型使用场景:它处理的不是「模型怎么生成一句话」,而是「一整条流程怎样稳定往前走」。

4. State 是中间信息的公共记事本

新手第一次接触 LangGraph,最容易觉得抽象的词通常是 state。把它放回业务场景里就很好理解。

在刚才那条请求里,系统跑到一半时,内部已经有很多信息:

  • 用户原始输入
  • 安全检查结果
  • 情绪判断结果
  • 路由判断结果
  • 日历查询结果

如果这些信息只是散落在几个局部变量里,一旦流程复杂起来,很快就会乱。你会开始搞不清:哪个结果是上一阶段产出的、哪个字段还有效、下一步到底能读哪些数据。

LangGraph 的 state 做的,就是把中间信息收拢成一份明确的数据对象,让后面的节点继续往下读。可以把它理解成:

  • 每个节点都在读同一份状态。
  • 每个节点执行完以后,会补充或修改这份状态。
  • 下一步节点看到的是更新后的结果。

这样流程走到哪一步,都不会丢上下文。很多请求不是简单的一问一答,而是会一步步累积信息:先知道用户心情差,再知道他想安排复盘,再知道明天下午有空位,最后才能生成一段既带安抚又带安排建议的回复。如果没有统一状态,这些信息很难顺畅地在各步骤之间流动。

5. Node 和 Edge 让隐式流程显式化

Node 就是流程里的一个步骤。比如:

  • 做安全检查。
  • 做情绪识别。
  • 查日历。
  • 生成回复。

每个节点只负责一件相对明确的事。

Edge 就是这一步做完以后,下一步该去哪里。比如:

  • 安全检查通过后,去情绪识别。
  • 如果判断出有日程需求,去查日历。
  • 如果没有日程需求,直接生成回复。

nodeedge 并不是为了把事情说复杂,而是为了把原本代码里隐含的流程显式写出来。一旦显式化,后面很多事情都会简单很多:

  • 哪一步出了问题更容易定位。
  • 新加一个步骤更容易插进去。
  • 条件分支会更清楚。

这也是为什么 LangGraph 更适合承接复杂流程。流程一旦复杂,最怕的不是功能少,而是路线不清楚。

6. 多 Agent 只是图的一种常见形态

前一篇讲过,多 Agent 的重点是分工。到了 LangGraph 这一层,这种分工才有了更自然的落地方式。系统里不再只是一个大 Agent,而是一张流程图。图里的某些节点,完全可以换成不同的 Agent。

还是刚才那个场景,继续往下拆可以变成:

  • router_agent:判断当前请求属于哪类任务。
  • memory_agent:专门负责记忆检索和记忆写入。
  • schedule_agent:专门负责日程和提醒。
  • reply_agent:专门负责对外回复。

这时候每个 Agent 就像流程图里的一个专职节点。所以多 Agent 并不是 LangGraph 唯一的作用,但它确实是非常常见的一种用法:

  • 先有一条流程。
  • 再把流程里的某些关键步骤交给不同的 Agent。

这样做的好处是职责比较清楚。路由 Agent 负责分流,记忆 Agent 负责查记忆,日程 Agent 负责写日程,最后回复 Agent 再把结果说出来。在代码和排查上,这会比一个超级大 Agent 把所有事都揽下来更好维护。

7. Checkpoint 让流程在线上跑得稳

只在本地写 demo 时,很多人感觉不到 checkpoint 的价值。因为 demo 通常只有一轮请求,跑完就结束。但真实服务上线以后,很多流程并不会一次顺顺利利走完。比如:

  • 外部日历接口超时了。
  • 某一步需要人工确认。
  • 流程执行到一半服务重启了。

如果系统没有保存执行进度,就只能整条流程重来。LangGraph 的 checkpoint 解决的就是这个问题。它让系统可以记住:

  • 当前走到哪个节点了。
  • 当前状态里已经有哪些结果。
  • 下一步原本准备做什么。

流程被打断以后,就不是从头再跑一遍,而是从中间接着跑。这类能力在真实场景里并不遥远,比如:

  • 写日程前需要用户确认。
  • 某条敏感消息需要人工审核。
  • 某些外部工具调用不稳定。

这些都属于真实线上问题。LangGraph 的价值就在这里,它不是只让流程「更好看」,而是让流程在服务里更能跑得住。

8. 总结

前一篇讲的是:当问题还在单 Agent 范围内,LangChain 负责把模型、工具、上下文这些能力接起来。

这一篇讲的是:当请求处理变成一条多步骤流程以后,LangGraph 负责把流程组织清楚。

它们的分工可以这样理解:

  • LangChain 更像在组装一个能工作的 Agent。
  • LangGraph 更像在组织一条能持续推进的流程。

当系统只有一轮请求时,你更常碰到的是模型、Prompt、工具问题。当系统变成多步骤、多分支、多节点时,你更常碰到的是流程、状态和恢复执行问题。

后面的内容会继续往实现层讲单 Agent;再往后进入 LangGraph 相关内容时,就会继续往下拆节点、状态和多 Agent 编排。

一句话总结

LangGraph 不是让 Agent 更聪明,而是让多步骤流程有清晰的路线、稳定的状态和可恢复的执行能力。

参考资料

基于 MIT 协议开源