《LangGraph 条件路由与循环:如何让 Agent 自己决定下一步?》

前两篇我们解决了:

  • Graph 是什么
  • State 如何流转
  • Node 如何更新 State

但是目前的流程:

css 复制代码
START

↓

Node A

↓

Node B

↓

END

还是固定路线。

而真实 Agent 最大的特点:

下一步往往不是提前确定的,而是根据当前结果动态决定。

这就是 Conditional Edge 和 Loop。


1. 普通 Edge:固定流程

先回顾:

arduino 复制代码
.addEdge("A", "B")

表示:

css 复制代码
A
|
↓
B

无论发生什么:

永远走 B。

例如:

复制代码
用户登录

↓

查询用户信息

↓

返回结果

这种流程非常适合固定业务。

但是 Agent 不一样。


2. Agent 为什么需要条件路由?

例如:

用户输入:

复制代码
帮我计算 1+2

和:

复制代码
介绍一下 LangGraph

处理方式完全不同。

如果只有一个 Agent:

复制代码
用户问题

↓

LLM自己判断

↓

选择工具

所有能力都塞在一个大脑里。

另一种方式:

拆成不同节点:

markdown 复制代码
              query

                ↓

             router

          /          \

         /            \

 mathNode          chatNode

router 负责:

判断应该去哪。


3. Conditional Edge 是什么?

代码:

php 复制代码
.addConditionalEdges(
  "router",
  state => state.route,
  {
    math:"mathNode",
    chat:"chatNode"
  }
)

拆开理解。


第一个参数

arduino 复制代码
"router"

表示:

从哪个节点开始判断。

也就是:

yaml 复制代码
router
  |
  ↓
?

第二个参数

ini 复制代码
state => state.route

这是:

路由函数。

它读取当前 State。

例如:

当前:

css 复制代码
{
 query:"1+2",
 route:"math"
}

执行:

ini 复制代码
state=>state.route

返回:

lua 复制代码
math

第三个参数

css 复制代码
{
 math:"mathNode",
 chat:"chatNode"
}

这是映射关系。

意思:

lua 复制代码
返回 math

↓

进入 mathNode


返回 chat

↓

进入 chatNode

完整流程:

perl 复制代码
router

↓

(state)=>state.route

↓

"math"

↓

mathNode

4. 为什么需要映射表?

你之前问过:

为什么不直接返回节点名?

其实可以。

例如:

javascript 复制代码
const router=(state)=>{

 return {
   route:"mathNode"
 }

}

然后:

perl 复制代码
(state)=>state.route

直接返回:

复制代码
mathNode

也可以。

但是很多项目会分开:

业务状态:

lua 复制代码
math
chat

图节点:

复制代码
mathNode
chatNode

原因:

解耦。

比如以后改名字:

复制代码
mathNode

↓

calculatorAgentNode

业务逻辑不用改。


5. 循环:Agent 为什么不是一次执行?

真实 Agent 经常:

执行 → 检查 → 修改 → 再执行。

例如:

代码生成 Agent:

复制代码
用户需求

↓

生成代码

↓

测试

↓

失败?

↓

修改代码

↓

重新测试

这是循环。

Graph:

markdown 复制代码
       ┌──────────┐
       ↓          |
生成代码 → 测试 ───┘

       ↓

      成功

       ↓

      END

6. LangGraph 如何实现循环?

关键:

Edge 可以指向自己。

例如:

php 复制代码
.addConditionalEdges(
 "check",
 state=>state.success,
 {
   retry:"generate",
   end:END
 }
)

如果:

ini 复制代码
success=false

走:

sql 复制代码
check

↓

generate

重新生成。

如果:

ini 复制代码
success=true

走:

sql 复制代码
END

7. 一个完整重试 Demo

State:

javascript 复制代码
const StateAnnotation = Annotation.Root({

 tries:Annotation({
  reducer:(prev,next)=>next,
  default:()=>0
 }),

 ok:Annotation({
  reducer:(prev,next)=>next,
  default:()=>false
 })

});

节点:

ini 复制代码
const attempt=(state)=>{

 const tries=state.tries+1;

 return {
  tries,
  ok:tries>=3
 }

}

流程:

sql 复制代码
START

↓

attempt

↓

判断ok

↓

 false
 ↓

attempt


true

↓

END

执行:

第一次:

ini 复制代码
tries=1
失败

第二次:

ini 复制代码
tries=2
失败

第三次:

ini 复制代码
tries=3
成功

结束。


8. Conditional Edge 和普通 Edge 区别

普通 Edge Conditional Edge
路径 固定 动态
判断 没有 根据 State
场景 流水线 Agent决策
例子 A→B 成功→结束,失败→重试

9. 到这里 LangGraph 有了 Agent 的味道

前三篇组合起来:

yaml 复制代码
State
 |
 ↓

Node执行任务

 |
 ↓

Edge控制流程

 |
 ↓

Conditional Edge动态选择

 |
 ↓

Loop不断优化

这已经不是简单 Chain:

css 复制代码
A → B → C

而是:

markdown 复制代码
        判断

          ↓

执行 → 检查 → 重试

          ↓

        完成

总结

一句话:

Conditional Edge 让 LangGraph 根据 State 动态选择下一步,Loop 让 Agent 能够反复执行、检查和优化,这也是 Graph 工作流区别于线性 Chain 的核心能力。

相关推荐
信马堂15 小时前
WorkBuddy 接入第三方模型 API 全流程:安装与配置实录
人工智能·大模型·token·ai算力·workbuddy
朝朝辞暮i16 小时前
VLA 系统学习第 4 课:一个 Batch 进入神经网络后,模型到底是怎么“学会”的?
人工智能·python·神经网络·vla
IT古董16 小时前
《FDE前沿部署工程师实战教程》33 - Enterprise AI Observability:从Agent Trace到全链路智能运维
数据库·人工智能
xsd2024111817 小时前
地网腐蚀AI识别算法全解析:从锈蚀图像到地下腐蚀快速定位
人工智能
oooost17 小时前
pytorch学习笔记2(transformer)
人工智能·机器学习
云杂项17 小时前
Exploring Model Inversion Attacks in the Black-box Setting(个人笔记)
人工智能
还卿一钵无情泪17 小时前
Unsloth 微调 构建自己的大模型 没有GPU也能微调
linux·开发语言·人工智能·python·大模型·nlp·unsloth
冬奇Lab18 小时前
LLM 驱动的自动化测试系列(06):移动端自动化(二)——DroidRun/Mobilerun 的角色级模型拆分
人工智能·测试
冬奇Lab18 小时前
一天一个开源项目(第230篇):HandRaw-Style —— 把 327 种手绘风格、165 种排版、36 种配色编号化,让 AI 画图不再每次都飘
人工智能·开源·资讯
罗西的思考19 小时前
从陶哲轩的访谈看:AI 数学研究方法论 & 给其它行业的启示
人工智能