深入浅出 LangGraph —— 第5章:条件边与动态路由

16 大模型学习——LangGraph1 LangGraph 是一个基于LangChain构建的扩展。LangGraph 是一个用于构建具有状态和多参与者应用程序的 LLM 库,它允许创建具有循环的图,这在大多数智能体架构中是必需的。LangGraph提供了对应用程序流程和状态的细粒度控制,这对于创建可靠的智能体至关重要,并且LangGraph 还内置了包括持久化对话,支持高级的人机交互和记忆功能。 阅读详情

📖 本章学习目标

  • ✅ 掌握条件边(Conditional Edges)的完整用法
  • ✅ 理解路由函数的设计原则与最佳实践
  • ✅ 学会使用 Send API 实现动态并行分发
  • ✅ 能够设计基于 LLM 输出的智能路由
  • ✅ 掌握多分支合并的状态处理技巧
  • ✅ 避免常见的路由陷阱和性能问题

一、从静态到动态:为什么需要条件边

1、静态路由的局限

上一章我们用 addEdge 构建的图,执行路径是编译时确定的,永远走同一条路。但真实的 Agent 需要根据情况"灵活应变":

现实场景举例:

  • 用户问了一个需要联网搜索的问题 → 触发搜索节点
  • 用户问了一个可以直接回答的问题 → 跳过搜索,直接回答
  • LLM 的回复需要调用工具 → 执行工具节点
  • LLM 的回复不需要工具 → 直接返回给用户

这些场景都需要运行时决策——只有程序真正执行到这一步,才能知道该走哪条路。

静态路由 addEdge

START

节点A

节点B

END

动态路由 addConditionalEdges

简单

复杂

需搜索

START

分类节点

简单回复

深度分析

搜索+回复

END

静态路由像地铁线路——固定站点,固定路线。动态路由像打车——根据目的地实时选择最优路线。

2、条件边的工作机制

'search'

'answer'

'error'

节点A
执行完毕

路由函数
读取 State
返回字符串

搜索节点

回答节点

错误处理节点

汇总节点

__end__

关键点是路由函数,它是一个纯函数,读取 State,返回字符串(下一节点名),不做任何副作用。

路由函数的签名:

// 基本签名
function router(state: StateType): string;

// 多目标签名(并行)
function router(state: StateType): string[];

// Send API 签名(动态并行)
function router(state: StateType): Send[];

二、条件边基础用法

1、简单二选一路由

步骤1:定义状态
import * as dotenv from 'dotenv';
dotenv.config();

import { Annotation, StateGraph } from '@langchain/langgraph';
import { ChatOpenAI } from '@langchain/openai';
import { HumanMessage } from '@langchain/core/messages';

const RouterState = Annotation.Root({
  userInput: Annotation<string>(),
  classification: Annotation<'simple' | 'complex' | ''>({
    default: () => '',
  }), // 分类
  answer: Annotation<string>(),
});

type RouterStateType = typeof RouterState.State;
步骤2:定义路由函数
// 路由函数:读 State,返回节点名字符串
function routeByComplexity(state: RouterStateType): string {
  return state.classification === 'complex' ? 'complexNode' : 'simpleNode';
}

路由函数签名(state: StateType) => string,返回值必须是已注册节点的名称,或 ‘end’。它是纯函数,不应该有副作用(不调用 API 等),在这里是根据classification字段决定路由。

步骤3:定义节点函数
// 初始化模型
const model = new ChatOpenAI({ model: 'gpt-4o-mini' });

// 分类节点:用 LLM 判断问题复杂度
async function classifyNode(state: RouterStateType) {
  const response = await model.invoke([
    new HumanMessage(
      `判断以下问题的复杂度,只回答 'simple' 或 'complex':\n${state.userInput}`
    ),
  ]);
  const classification = (response.content as string).trim().toLowerCase();
  return { classification: classification as 'simple' | 'complex' };
}

// 简单问题节点
async function simpleNode(state: RouterStateType) {
  const response = await model.invoke([new HumanMessage(state.userInput)]);
  return { answer: response.content as string };
}

// 复杂问题节点
async function complexNode(state: RouterStateType) {
  const response = await model.invoke([
    new HumanMessage(`请深度分析并详细回答:${state.userInput}`),
  ]);
  return { answer: response.content as string };
}
步骤4:构建图
const graph = new StateGraph(RouterState)
  .addNode('classify', classifyNode)
  .addNode('simpleNode', simpleNode)
  .addNode('complexNode', complexNode)
  .addEdge('__start__', 'classify')
  // 条件边:classify 执行后调用路由函数
  .addConditionalEdges('classify', routeByComplexity)
  .addEdge('simpleNode', '__end__')
  .addEdge('complexNode', '__end__')
  .compile();

使用addConditionalEdges定义条件边,接受源节点和路由函数作为参数。LangGraph 会自动扫描路由函数的所有可能返回值,并根据返回值执行对应的节点。

运行测试:

const result = await graph.invoke({
  userInput: '1+1等于几?',
});

console.log(result.answer);
// 输出: 2 (走 simpleNode)

const result2 = await graph.invoke({
  userInput: '请分析量子计算对未来密码学的影响',
});

console.log(result2.answer);
// 输出: 长篇深度分析 (走 complexNode)

2、多目标路由(一对多)

路由函数可以返回字符串数组,同时触发多个节点(并行执行):

function routeToMultiple(state: RouterStateType): string[] {
  const targets: string[] = [];
  
  if (state.userInput.includes('价格')) targets.push('priceNode');
  if (state.userInput.includes('评价')) targets.push('reviewNode');
  if (state.userInput.includes('库存')) targets.push('stockNode');
  
  // 至少触发一个
  return targets.length > 0 ? targets : ['generalNode'];
}

路由函数返回字符串数组后,LangGraph 并行执行所有目标节点。并行节点执行完成后,它们的状态更新会按 Reducer 规则合并,适用于"一个问题需要从多个维度同时处理"的场景。

示例:

  • 用户输入:“这款手机的价格和评价怎么样?”
  • 路由返回:['priceNode', 'reviewNode']
  • 两个节点并行执行,结果合并到State中

并行执行示意图:

分类节点

路由函数

价格节点

评价节点

汇总节点

__end__


三、Send API:动态并行分发

1、Send API 的使用场景

addConditionalEdges 适合"路由到固定的几个节点"。但如果你需要根据运行时的数据动态创建多个并行任务(比如对每个搜索关键词都起一个并行节点),就需要 Send API。

规划节点
生成子任务列表

Send API
为每个子任务
动态创建实例

处理子任务1

处理子任务2

处理子任务3

汇总节点

__end__

对比两种并行方式:

特性多目标路由Send API
并行数量固定(编译时确定)动态(运行时决定)
适用场景少数固定分支批量处理(Map-Reduce)
状态隔离共享同一State每个实例独立State
返回值类型string[]Send[]

2、Send API 实现动态并行

步骤1:定义主图和子任务状态
import { Annotation, StateGraph, Send } from '@langchain/langgraph';

// 主图的状态
const ParallelState = Annotation.Root({
  topic: Annotation<string>(),
  subTopics: Annotation<string[]>({ default: () => [] }),
  results: Annotation<string[]>({
    reducer: (c, u) => [...c, ...u],
    default: () => [],
  }),
});

// 子任务的状态(每个并行任务独享)
const SubTaskState = Annotation.Root({
  subTopic: Annotation<string>(),
  result: Annotation<string>(),
});

代码解读:

  • ParallelState:主图状态,包含主题、子主题列表、结果列表
  • SubTaskState:子任务状态,每个并行实例独立拥有
  • results使用追加Reducer,累积所有子任务的结果
  • Send API会为每个子任务创建独立的SubTaskState实例
步骤2:定义规划节点
const model = new ChatOpenAI({ model: 'gpt-4o-mini' });

// 规划节点:生成子话题列表
async function planNode(state: typeof ParallelState.State) {
  const response = await model.invoke([
    new HumanMessage(`把"${state.topic}"分解为3个子话题,每行一个`),
  ]);
  const subTopics = (response.content as string)
    .split('\n')
    .filter(s => s.trim());
  return { subTopics };
}
步骤3:定义Send路由函数
// Send API 路由函数:为每个子话题创建一个并行任务
function dispatchSubTasks(state: typeof ParallelState.State): Send[] {
  return state.subTopics.map(
    subTopic => new Send('processSubTask', { subTopic })
  );
}

代码解读:

  • Send(节点名, 初始状态):动态创建一个节点执行实例
  • 返回 Send[] 数组:有几个元素就并行执行几个实例
  • 每个实例有独立的状态,结果通过 Reducer 合并回主图的 State
  • 这是 Map-Reduce 模式在 LangGraph 中的标准实现

工作流程:

    1. planNode生成3个子话题
    1. dispatchSubTasks创建3个Send对象
    1. LangGraph并行执行3个processSubTask实例
    1. 每个实例返回result,自动合并到主图的results数组
步骤4:定义子任务和汇总节点
// 子任务处理节点
async function processSubTask(state: typeof SubTaskState.State) {
  const response = await model.invoke([
    new HumanMessage(`请简要介绍:${state.subTopic}`),
  ]);
  return { result: response.content as string };
}

// 汇总节点
async function aggregateNode(state: typeof ParallelState.State) {
  const summary = state.results.join('\n\n---\n\n');
  console.log('所有子话题结果已汇总,共', state.results.length, '条');
  return {};
}

代码解读:

  • processSubTask:接收子话题,生成简介,返回result
  • aggregateNode:将所有结果拼接为完整报告
  • 返回{}:不更新任何字段,只做日志记录
  • results字段通过Reducer自动累积,无需手动合并
步骤5:构建图
const parallelGraph = new StateGraph(ParallelState)
  .addNode('plan', planNode)
  .addNode('processSubTask', processSubTask)
  .addNode('aggregate', aggregateNode)
  .addEdge('__start__', 'plan')
  // Send API:plan 后动态分发子任务
  .addConditionalEdges('plan', dispatchSubTasks)
  .addEdge('processSubTask', 'aggregate')
  .addEdge('aggregate', '__end__')
  .compile();

运行测试:

const result = await parallelGraph.invoke({
  topic: '人工智能的应用领域',
});

console.log(result.results);
// 输出: [
//   "人工智能在医疗领域的应用...",
//   "人工智能在金融领域的应用...",
//   "人工智能在教育领域的应用..."
// ]

四、基于 LLM 的智能路由

1、让 LLM 决定路由

最强大的路由方式是让 LLM 自己决定走哪条路——这是构建智能 Agent 的核心模式:

import { z } from 'zod';

// 用结构化输出让 LLM 返回路由决策
const RouteSchema = z.object({
  destination: z.enum(['search', 'calculate', 'answer', 'clarify']),
  reason: z.string(),
});

const routerModel = model.withStructuredOutput(RouteSchema);

async function llmRouterNode(state: typeof RouterState.State) {
  const decision = await routerModel.invoke([
    new HumanMessage(
      `分析用户问题,决定最合适的处理方式:\n` +
      `- search:需要搜索外部信息\n` +
      `- calculate:需要数学计算\n` +
      `- answer:可以直接回答\n` +
      `- clarify:问题不清晰,需要追问\n\n` +
      `用户问题:${state.userInput}`
    ),
  ]);
  return { classification: decision.destination };
}

代码解读:

  • withStructuredOutput(schema):强制 LLM 返回符合 Zod schema 的 JSON
  • z.enum([...]):限定 LLM 只能返回枚举中的值,防止幻觉导致路由出错
  • reason 字段让 LLM 解释决策原因,便于调试
  • 这种模式让路由具备了"理解能力"而不仅仅是规则匹配

优势:

  1. 语义理解:能识别"帮我算一下"=“calculate”
  2. 灵活性:新增路由只需修改enum,无需重写规则
  3. 可解释性:reason字段说明决策依据

路由函数配合LLM节点:

function smartRouter(state: typeof RouterState.State): string {
  switch (state.classification) {
    case 'search': return 'searchNode';
    case 'calculate': return 'calculateNode';
    case 'answer': return 'answerNode';
    case 'clarify': return 'clarifyNode';
    default: return 'answerNode'; // 兜底
  }
}

2、Tool Calling 风格路由

LangGraph 内置了工具调用的路由支持(第6章详细介绍),预览核心模式:

import { tool } from '@langchain/core/tools';
import { ToolNode } from '@langchain/langgraph/prebuilt';

const searchTool = tool(
  async ({ query }) => `搜索"${query}"的结果...`,
  { 
    name: 'search', 
    description: '搜索网络信息', 
    schema: z.object({ query: z.string() }) 
  }
);

// ToolNode 自动处理工具调用的执行和结果返回
const toolNode = new ToolNode([searchTool]);

// 内置路由函数:检查最后一条消息是否包含工具调用
import { MessagesAnnotation } from '@langchain/langgraph';

function shouldCallTool(state: typeof MessagesAnnotation.State): string {
  const lastMessage = state.messages[state.messages.length - 1];
  if ('tool_calls' in lastMessage && lastMessage.tool_calls?.length) {
    return 'tools';  // 有工具调用 → 执行工具
  }
  return '__end__'; // 无工具调用 → 结束
}

代码解读:

  • ToolNode:LangGraph 预构建的工具执行节点,自动解析 tool_calls
  • shouldCallTool:标准的工具路由函数,检查 LLM 是否想调用工具
  • 'tool_calls' in lastMessage:检查消息中是否存在工具调用字段

工作流程:

  1. LLM节点生成带tool_calls的消息
  2. shouldCallTool检测到tool_calls,路由到tools节点
  3. ToolNode执行工具,返回结果
  4. 结果追加到messages,回到LLM节点继续推理

五、最佳实践和踩坑指南

💡 实践 1:路由函数保持纯粹

❌ 不好的做法:

// 路由函数里调用 API —— 副作用,难以测试和追踪
async function badRouter(state: StateType) {
  const result = await fetch('https://api.example.com/classify');
  return result.ok ? 'nodeA' : 'nodeB';
}

✅ 推荐做法:

// 路由函数只读 State,判断逻辑放在专门的节点里
function goodRouter(state: StateType): string {
  return state.classification === 'A' ? 'nodeA' : 'nodeB';
}

原因:路由函数有副作用会导致图的行为不可预测,也无法在 LangSmith 中被正确追踪。

💡 实践 2:处理"兜底"路由

function safeRouter(state: StateType): string {
  const validTargets = ['nodeA', 'nodeB', 'nodeC'];
  const target = computeTarget(state);
  
  if (!validTargets.includes(target)) {
    console.warn('意外的路由目标:', target, ',使用兜底节点');
    return 'fallbackNode'; // 兜底处理
  }
  
  return target;
}

原因:防止LLM幻觉或代码Bug导致路由到不存在的节点。

💡 实践 3:使用常量定义节点名

❌ 不好的做法:

function router(state: StateType): string {
  return 'serachNode'; // 拼写错误!应该是'searchNode'
}

✅ 推荐做法:

// 定义节点名常量
const NODES = {
  SEARCH: 'searchNode',
  CALCULATE: 'calculateNode',
  ANSWER: 'answerNode',
} as const;

function router(state: StateType): string {
  return NODES.SEARCH; // TypeScript 会检查拼写
}

原因:避免拼写错误导致的运行时错误,TypeScript提供编译时检查。

⚠️ 常见问题

问题现象解决方案
路由函数返回不存在的节点名运行时 Node not found 错误使用常量枚举定义节点名,避免拼写错误
Send API 返回空数组图直接跳到 __end__,不经过后续节点确保 Send 数组至少有一个元素,或添加兜底逻辑
并行节点的 State 合并冲突某些字段数据丢失为并行写入的字段设计追加 Reducer,而非覆盖
忘记为条件边目标节点添加出边某些节点执行后图挂起每个目标节点必须有出边连到下一节点或 __end__
路由函数有副作用行为不可预测,难以调试路由函数必须是纯函数,只做判断不做操作
循环路由无限执行程序卡死设置最大迭代次数或明确的终止条件

📝 本章小结

核心知识点回顾

知识点关键要点应用场景
条件边addConditionalEdges(node, routerFn)分支逻辑、根据状态选路
多目标路由路由函数返回字符串数组同时触发多个并行节点
Send APInew Send(nodeName, state) 动态分发Map-Reduce 批量并行处理
LLM 路由withStructuredOutput 约束返回值智能分类、意图识别
纯函数原则路由函数无副作用保证可预测性和可测试性
兜底策略处理意外路由目标提高系统鲁棒性

🎯 动手练习

练习 1:情感分析路由

  • 目标:根据用户消息的情感(正面/负面/中性)路由到不同的回复节点
  • 要求:
    1. 使用 LLM 分析情感,用 withStructuredOutput 约束输出
    2. 定义三种情感对应的回复节点
    3. 每种情感使用不同风格的回复语气
  • 验收标准:
    • 正面消息→热情回复
    • 负面消息→同理心回复
    • 中性消息→专业回复

练习 2:批量文章摘要

  • 目标:给定5篇文章列表,用 Send API 并行生成每篇的摘要
  • 要求:
    1. 实现 plan(生成文章列表)→ 并行 summarize → aggregate(汇总)
    2. 每篇文章摘要不超过100字
    3. 最终汇总为完整报告
  • 验收标准:
    • 5个摘要并行生成
    • 最终汇总到一个字段中
    • 总耗时接近单篇摘要时间(证明并行生效)

练习 3:带重试的路由

  • 目标:LLM 生成的内容质量不佳时,路由回生成节点重试(最多3次)
  • 要求:
    1. State 中记录重试次数 retryCount
    2. 节点用 Command 控制重试流程
    3. 超过3次后跳转到错误节点
  • 验收标准:
    • 低质量内容自动触发重试
    • 最多重试3次
    • 超限后优雅降级到错误处理节点

练习 4:智能客服路由系统

  • 目标:结合本章和第17章知识,实现完整的客服路由
  • 要求:
    1. 意图识别节点(订单/退款/FAQ/投诉)
    2. 根据意图路由到对应处理节点
    3. 低置信度转人工
    4. 使用常量定义节点名
  • 验收标准:
    • 4种意图正确路由
    • 置信度<0.7转人工
    • 无拼写错误和运行时异常

📚 延伸阅读


下一章:第6章 —— 工具调用与 Tool Node

决策与循环:LangGraph构建条件执行和带循环的图 本文深入探讨LangGraph中的两种流程控制方法:条件边和循环图,以增强AI Agent的决策与迭代能力。条件边通过路由函数实现动态路径选择,模拟if-else逻辑;循环图则通过条件边形成回路,支持迭代优化。文章通过加法/减法选择器和随机数生成器两个实例,分别展示了条件判断和循环执行的实现方式,包括状态定义、节点构建和路由逻辑。这些技术赋予AI Agent自主决策和持续优化的能力,使其能够灵活应对复杂任务。文末提供完整代码示例供读者参考实践。 阅读详情

相关推荐

LangGraph 边(Edge)机制完全指南

Q: 条件边选择了未连接的节点怎么办?A: 会从节点入口重新执行所有边逻辑。Q: 中断后边的执行会怎样?

Cheer_RIO的博客 1148

LangGraph从入门到精通(二)——条件边与循环流程实现工具调用

例如下方左右有两个并行运行流程,其中左侧的两个并行节点均有连接到 END 节点,右侧的只有一个,但是最终结果是一模一样的,只要不把 状态 看成是 传递,而是整个图的全局变量,每个节点执行的都是 修改 操作即可。• path_map:可选参数,类型为一个字典,用于表示 返回的path和 节点名称 的映射关系,如果不设置的话,path 的返回值应该是 节点名称。• then:可选参数,在执行 path 节点之后统一选择节点,通过该设置就不需要为后续的每一个节点都设置一个统一的关联节点。普通边 可以直接使用。

swpucwf的博客 1201

深度解析LangGraph:从入门到动态工作流,彻底搞懂它与LangChain的爱恨情仇(含节点/边/状态管理/条件路由核心源码)

本文将带你深入剖析 LangChain与LangGraph的血缘关系与本质区别,揭秘LangGraph如何通过StateGraph和Message Passing机制,实现对复杂业务流程的精准控制。我们将重点解析条件边(Conditional Edges)、状态聚合(Reducers)以及动态节点调度(Send API)等核心机制,并结合文档中的Pydantic Schema与TypedDict实战代码,手把手教你构建一个工业级的动态智能体。

专注AI与大模型技术,深耕NLP、RAG、Agent开发,分享Python机器学习与深度学习实战经验,助力技术成长。 773

LangGraph之条件边

在 LangGraph 中,是用于在图(graph)中根据节点的输出动态决定下一步应执行哪个节点的一种机制。它通过方法添加到图中。

asdurt的博客 614

LangGraph实战进阶:巧用条件边与循环构建高效工具调用链

本文深入探讨了LangGraph中条件边与循环流程的实战应用,通过智能路由函数和循环状态管理,构建高效工具调用链。文章结合财报分析等实际案例,展示了如何利用条件边动态决策、循环流程处理多步骤任务,并提供了性能优化与调试技巧,帮助开发者提升AI工作流的执行效率与稳定性。

weixin_29224529的博客 590

LangGraph多Agent系统构建指南:从状态管理到动态路由实战

多Agent系统是一种分布式人工智能范式,其核心原理在于通过多个具备特定能力的智能体(Agent)协同工作,以解决单一智能体难以处理的复杂任务。该技术通过专业化分工、信息共享与协调机制,实现了系统在可扩展性、鲁棒性以及处理复杂工作流方面的显著价值。在工程实践中,多Agent系统广泛应用于自动化客服、智能内容生成、复杂决策支持等场景。本文聚焦于利用LangGraph框架构建此类系统,深入探讨其核心三要素——状态(State)、节点(Node)与边(Edge)的设计与实现。其中,状态管理作为团队共享工作区,确保

weixin_33755649的博客 382

LangGraph条件边与工具调用

上一章我们简要介绍了Agent开发框架LangGraph的特点,并基于LangGraph实现了一个简易的应用程序,也即聊天框架。本章节的内容我们介绍LangGraph中的条件边,介绍如何控制对话流程,并讲解简单的工具调用,完善我们的应用程序。在本章节中,我们介绍了如何构造1-n、n-1、n-n的边,并在流程图中引入了工具调用。完整的代码和实验效果如上,大家也快来入手试试吧~下一节,我们介绍如何通过中断来获取外部输入或调整我们的对话流程。

wwx0622的博客 3126

11.9 LangGraph双剑合璧:条件边+固定边实战,效率飙升300%维护成本降60%!

LangGraph 中的边(Edges)是控制工作流走向的核心机制,分为固定边和条件边。固定边用于线性流程,如数据处理流水线,通过 add_edge 方法实现。条件边则基于状态判断实现动态路由,支持函数式和表达式两种判断模式,通过 add_conditional_edge 方法实现。这两种边的组合应用可以构建多分支工作流,如客户支持 Agent 系统,通过状态路由实现智能决策。调试和优化策略包括状态快照调试、条件分支覆盖率检查、性能优化和常见错误处理,确保系统的稳定性和高效性。通过合理使用 LangGrap

yonggeit的博客 3742

LangGraph系列5:条件分支与动态路由——构建智能AI工作流的决策引擎

条件分支与动态路由将静态工作流提升为情境感知的智能系统。通过本章的深度解析,我们看到了如何让AI代理像人类专家一样,基于上下文做出实时决策。核心设计原则状态驱动:路由决策应完全基于共享状态,避免隐藏依赖单一职责:每个条件函数只负责一个维度的判断容错设计:始终提供默认分支,确保工作流不会“卡死”可观测性:记录路由决策日志,便于调试优化对于开发者而言,掌握条件边机制意味着能够构建真正自适应、可扩展的AI系统。正如人类智慧体现在面对不确定性时的灵活应对,AI工作流的成熟度也取决于其动态路由能力。开放问题。

沛哥儿的专栏 1133

11.6 LangGraph边控制全解析:5种核心模式+50个避坑案例,轻松搞定动态路由与循环死锁!

LangGraph 的边系统设计灵活,支持五种核心流程控制模式:固定边、条件边、循环边、动态边和并行边,适用于复杂业务场景。条件边通过状态判断矩阵实现智能路由,支持多级嵌套条件;循环边通过自引用边实现智能重试机制,并内置熔断保护策略;动态边结合 LLM 实时决策实现自适应工作流。生产环境中,优先级控制、熔断机制和调试技巧是关键。典型错误包括循环死锁、条件冲突、状态污染和动态边性能瓶颈,需采取相应措施避免。

yonggeit的博客 3034

LangGraph核心概念详解,节点、边、状态、条件边

上一篇用一个例子展示了LangGraph的能力。这一篇我们把核心概念拆开讲清楚。LangGraph的四个核心概念是节点、边、状态、条件边。理解了这四个,LangGraph就入门了。

白话机器学习 179

LangGraph图中条件边的示例简析

让工作流能够根据运行时状态做出决策将决策逻辑和执行逻辑分离支持复杂的业务流程控制是构建智能代理、决策系统等应用的基础在你的代码中,条件边实现了根据输入值的大小选择不同处理路径的逻辑,这是构建灵活工作流的关键。

夏天又到了的专栏 622

告别“静态组件”:Adobe XD的堆栈+状态,打造“活”的响应式UI

今天,我想分享一套能彻底告别这种“笨方法”的、Adobe XD中的进阶技巧,通过组合使用“堆栈”、“内边距”和“组件状态”,去构建一个能自动适应内容、真正“活”起来的智能响应式组件。

Kingsdesigner的博客 761

Graph-Engineering-第10章第48节-LangGraph实战③-动态路由与条件边

并行解决了"同一件事发N份",但客服系统每天面对的是"不同的事派不同的人"。这一节我们搭一个意图识别→专家分派的智能客服路由系统,重点掰扯两个东西:条件边到底怎么写才优雅,以及"规则路由 vs LLM路由"这两条路线的终极选择。

226

7系列ZYNQ硬件调试:Vitis无法识别ARM DAP的排查与解决

本文详细分析了Xilinx 7系列ZYNQ芯片在Vitis开发环境中无法识别ARM DAP的常见问题及解决方案。从硬件设计检查(电源系统、时钟电路)、JTAG连接诊断到软件环境排查,提供了全面的调试指南。特别针对ARM DAP初始化失败的情况,给出了实用的排查步骤和预防措施,帮助开发者快速定位和解决类似问题。

weixin_33737134的博客 514

CATIA CAA 二次开发去除面内开孔

测试模型: 代码说明:以下代码在拓扑级去除Face的内部loop,更改后的Body通过oispBody参数输出。主要使用CATSmartBodyDuplicator拓扑操作实现 HRESULT CAAStarterCmd::RemoveHoleOnFace(CATBody_var &ispBody,CATBody_var &oispBody){ CATLISTP(CATCell)olistFace; ispBody->GetAllCells(olistFace,2); CATF

weixin_45445751的博客 2265

LangGraph条件边:从状态机到AI应用动态路由的核心机制

在软件工程中,状态机和工作流是管理复杂业务流程的经典范式,其核心在于将状态转移逻辑抽象为可配置的规则。条件边作为这一范式的关键构件,实现了路由决策与业务执行的解耦,通过将‘在何种条件下前往哪个节点’的逻辑独立为纯函数,显著提升了系统的可维护性和可测试性。在AI应用开发领域,大模型输出的非确定性和用户意图的模糊性,使得基于硬编码if-else的传统路由方式难以应对。LangGraph框架中的Conditional Edge机制,正是为解决此痛点而生。它允许开发者基于完整的、可共享的应用状态(而非局部变量)进行

weixin_34037173的博客 407

Error: dependent ‘..\..\..\..\Qt\5.15.2\msvc2019\include\QtWidgets\QMainWindow‘ does not exist.

核心问题:修改 Build 目录为源码子目录后,MSVC 编译报错,本质是变量设置异常,导致 qmake 生成多余回溯路径;临时解决:在 .pro 文件添加;最优解决:将上述配置写入 Qt 的 msvc 对应 qmake.conf 全局文件,一劳永逸;禁止 qmake 计算路径时向上回溯,避免生成异常路径。

mumufan05的专栏 878

万字长文吃透 LangGraph 核心用法:边、节点、路由与流程控制全解析前言

LangGraph 作为 LangChain 生态中用于构建有状态、多节点工作流的核心库,凭借其灵活的节点编排、动态路由和状态管理能力,成为构建复杂 AI Agent 的首选工具。本文基于实战代码,系统拆解 LangGraph 的核心概念与用法,涵盖普通边、条件边、入口点、Command、RuntimeContext、Send(Map-Reduce)等关键特性,从基础到进阶,手把手带你掌握 LangGraph 的核心玩法。特性核心用途关键 API / 语法适用场景普通边固定流程路径。

实战怎么玩,你就怎么学 851

f2fs学习笔记 - 3. F2FS文件系统布局

目录1.前言2.F2FS布局说明2.1. super block(block 0x0 ~ block 0x1ff)2.2 CP(block 0x200 ~ block 0x5ff)cp page1nat journalsit journaldata summarycurrent hot node summarycurrent warm node summarycurrent cold node summarycp page22nd checkpoint2.3 SIT(block 0x600 ~ block

HZero 4645

从大疆智图到Cesium:3D Tiles模型加载与Web三维场景构建实战

本文详细介绍了如何利用大疆智图生成3D Tiles数据,并通过Cesium在Web端实现高效加载与三维场景构建。从大疆智图参数设置到Cesium环境配置,再到3D Tiles性能调优与高级功能实现,提供了一套完整的实战指南,帮助开发者快速掌握3D Tiles模型加载与Web三维场景构建技术。

weixin_30520015的博客 1285

【工作流的常见模式】LangGraph 常用模式:路由模式(条件分支)

LangGraph 常用模式:条件分支(Conditional Routing)前两篇聊了「提示链」(一步一步走)和「并行化」(多任务一起上)今天讲一个更“聪明”的模式:条件分支(路由模式) 它让 AI 不再是闷头按流程走,而是会根据当前情况,自己决定下一步去哪我们需要三个字段:input:用户输入decision:模型分类结果(售前/售后/技术)output:最终回复input: str条件分支模式是构建 Agent(智能体) 的关键一步。

zhai0104的博客 779

FPGA资料分享——FPGA开发板入手指南

FPGA学习,开发板怎么选,看这里,就一个通透

weixin_51627076的博客 7297

LangGraph控制流:条件边、循环与并行(二)

上篇文章中介绍的图是“一条直线走到底”,但真实业务往往需要。这一篇涵盖了 LangGraph 怎么实现这三种控制流。

梦想不只是梦与想的博客 445

万字长文,YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务

YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务

Coding... 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

LangGraph的条件分支:基于状态的动态路由设计

需求点具体描述状态驱动所有路由决策完全基于当前工作流的全局状态,不需要手动传递参数声明式配置路由逻辑和节点执行逻辑完全解耦,新增分支不需要修改节点代码支持循环允许路由跳转到之前已经执行过的节点,实现反思、重试等循环逻辑可观测可调试所有路由决策都有日志可查,可以清楚看到每一步决策的依据和结果边界防护内置死循环检测、非法路由拦截等能力,避免出现线上故障而LangGraph的条件分支能力,刚好完美满足了所有这些需求。动态路由的核心是“状态驱动、逻辑解耦”,彻底解决了硬编码分支的维护难题。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 204

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: 深入浅出 LangGraph —— 第4章:状态管理深入:如何设计State
下一篇: 深入浅出 LangGraph —— 第6章:工具调用与ToolNode
FrontAI
博客等级 码龄1年 61粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值