一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

用 LangGraph 条件路由和循环实现 Agent 动态决策

时间:2026-09-14 10:30:01 编辑:袖梨 来源:一聚教程网

线性工作流适合步骤明确的业务,但当同一个 Agent 需要处理不同类型的请求,或在执行失败后自动修正并重试时,固定的 A 到 B 路径就不够用了。LangGraph 通过条件路由读取当前 State 来选择节点,再借助循环把检查、重试与结束条件组织进图中,从而让执行流程具备动态决策能力。

前两篇我们解决了:

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

但是目前的流程:

START

↓

Node A

↓

Node B

↓

END

还是固定路线。

而真实 Agent 最大的特点:

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

这就是 Conditional Edge 和 Loop。


1. 普通 Edge:固定流程

先回顾:

.addEdge("A", "B")

表示:

A
|
↓
B

无论发生什么:

永远走 B。

例如:

用户登录

↓

查询用户信息

↓

返回结果

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

但是 Agent 不一样。


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

例如:

用户输入:

帮我计算 1+2

和:

介绍一下 LangGraph

处理方式完全不同。

如果只有一个 Agent:

用户问题

↓

LLM自己判断

↓

选择工具

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

另一种方式:

拆成不同节点:

              query

                ↓

             router

          /          

         /            

 mathNode          chatNode

router 负责:

判断应该去哪。


3. Conditional Edge 是什么?

代码:

.addConditionalEdges(
  "router",
  state => state.route,
  {
    math:"mathNode",
    chat:"chatNode"
  }
)

拆开理解。


第一个参数

"router"

表示:

从哪个节点开始判断。

也就是:

router
  |
  ↓
?

第二个参数

state => state.route

这是:

路由函数。

它读取当前 State。

例如:

当前:

{
 query:"1+2",
 route:"math"
}

执行:

state=>state.route

返回:

math

第三个参数

{
 math:"mathNode",
 chat:"chatNode"
}

这是映射关系。

意思:

返回 math

↓

进入 mathNode


返回 chat

↓

进入 chatNode

完整流程:

router

↓

(state)=>state.route

↓

"math"

↓

mathNode

4. 为什么需要映射表?

你之前问过:

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

其实可以。

例如:

const router=(state)=>{

 return {
   route:"mathNode"
 }

}

然后:

(state)=>state.route

直接返回:

mathNode

也可以。

但是很多项目会分开:

业务状态:

math
chat

图节点:

mathNode
chatNode

原因:

解耦。

比如以后改名字:

mathNode

↓

calculatorAgentNode

业务逻辑不用改。


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

真实 Agent 经常:

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

例如:

代码生成 Agent:

用户需求

↓

生成代码

↓

测试

↓

失败?

↓

修改代码

↓

重新测试

这是循环。

Graph:

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

       ↓

      成功

       ↓

      END

6. LangGraph 如何实现循环?

关键:

Edge 可以指向自己。

例如:

.addConditionalEdges(
 "check",
 state=>state.success,
 {
   retry:"generate",
   end:END
 }
)

如果:

success=false

走:

check

↓

generate

重新生成。

如果:

success=true

走:

END

7. 一个完整重试 Demo

State:

const StateAnnotation = Annotation.Root({

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

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

});

节点:

const attempt=(state)=>{

 const tries=state.tries+1;

 return {
  tries,
  ok:tries>=3
 }

}

流程:

START

↓

attempt

↓

判断ok

↓

 false
 ↓

attempt


true

↓

END

执行:

第一次:

tries=1
失败

第二次:

tries=2
失败

第三次:

tries=3
成功

结束。


8. Conditional Edge 和普通 Edge 区别

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

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

前三篇组合起来:

State
 |
 ↓

Node执行任务

 |
 ↓

Edge控制流程

 |
 ↓

Conditional Edge动态选择

 |
 ↓

Loop不断优化

这已经不是简单 Chain:

A → B → C

而是:

        判断

          ↓

执行 → 检查 → 重试

          ↓

        完成

总结

一句话:

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

热门栏目