核心组件详解

边的路由逻辑

详解各类边的实现,包括条件边、动态路由及循环控制

📚 学习目标

学完这篇文章后,你将能够:

  • 区分普通边与条件边
  • 编写条件路由函数实现动态分支
  • 使用映射对象解耦路由逻辑与节点名称
  • 理解图中的循环结构及其在 Agent 中的应用

前置知识

在开始学习之前,建议先阅读:

你需要了解:

  • JavaScript switch 语句或 if-else 逻辑
  • 状态机基本概念

1️⃣ 边的类型

边连接节点,控制流向。

1. 普通边 (Normal Edge)

最简单的连接,A 做完B 做。

// 执行完 node_a 后,立即执行 node_b
graph.addEdge("node_a", "node_b");

2. 条件边 (Conditional Edge)

根据上一节点的输出(即当前状态),决定下一节点。这是 Agent 自主决策的关键。

// 语法:addConditionalEdges(sourceNode, routingFunction, pathMap?)
graph.addConditionalEdges("check_node", routeLogic);

3. 入口与出口

  • addEdge(START, "first_node"):定义起点。
  • addEdge("last_node", END):定义终点。

2️⃣ 编写路由函数

路由函数接收当前状态,返回下一个节点的名称

// 路由逻辑
const routeLogic = (state: typeof StateAnnotation.State) => {
  if (state.isHappy) {
    return "happy_path"; // 返回节点名称
  } else {
    return "sad_path";
  }
};

// 注册
graph.addConditionalEdges("sentiment_analysis", routeLogic);

使用 Path Map(推荐)

为了解耦代码,建议使用第三个参数 pathMap。这样路由函数返回逻辑名称(如 "continue"),而不是硬编码的节点名。

const shouldContinue = (state: State) => {
  return state.messages.length > 10 ? "stop" : "continue";
};

graph.addConditionalEdges(
  "model_node", 
  shouldContinue, 
  {
    // 逻辑名称 : 实际节点名称
    "continue": "model_node", // 循环!
    "stop": END
  }
);

3️⃣ 常见路由模式

模式 1:基于工具调用的路由

这是 Tool Calling Agent 的核心模式。

function routeTools(state: typeof ToolStateAnnotation.State) {
  const lastMessage = state.messages[state.messages.length - 1];
  
  // 检查最后一条消息是否有工具调用请求
  if (lastMessage?.tool_calls?.length) {
    return "tools"; // 路由到工具执行节点
  }
  return END; // 否则结束
}

模式 2:人机交互(HIL)路由

审批流常用模式。

function routeApproval(state: State) {
  if (state.approvalStatus === "approved") {
    return "deploy";
  } else if (state.approvalStatus === "rejected") {
    return "notify_rejection";
  }
  return "human_review"; // 默认等待
}

4️⃣ 循环结构

LangGraph 原生支持循环(Graph 中的 Cycle),这在 Agent 中非常常见(例如:思考-行动-观察-思考...)。

[!WARNING] 递归限制:为了防止死循环,LangGraph 设置了默认的递归深度限制(通常是 25)。你可以通过配置修改它: graph.compile().invoke(inputs, { recursionLimit: 50 })


💡 练习题

  1. 分析题:在不使用 Path Map 的情况下,如果我重命名了一个节点,需要修改哪些地方?使用 Path Map 有什么好处?
  2. 设计题:设计一个“多级客服路由”,先判断用户等级(VIP/普通),VIP 用户直接转人工,普通用户先经过关键词分类(退款/咨询),再分流到不同节点。用伪代码写出 addConditionalEdges 的逻辑。

📚 参考资源

官方文档


✅ 总结

本章要点

  • 普通边构建线性流,条件边构建逻辑流。
  • 路由函数是 Agent 的“大脑”决策层。
  • Path Map 提供了更好的代码组织方式。
  • 只有有了边,分散的节点才能协同工作,组成强大的 Agent。

下一步:所有组件都学完了!下一章《架构模式》我们将把它们组合起来,构建真正实用的 Agent 架构。

登录以继续阅读

解锁完整文档、代码示例及更多高级功能。

立即登录

On this page