news 2026/9/30 2:45:11

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangGraph控制流:条件边、循环与并行(二)

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

一、条件边:让图学会“分岔”

固定边只能走一条路,但很多场景需要根据数据决定下一步:

  • 用户意图是“退款”还是“咨询”?走不同分支

  • 工具调用成功还是失败?走不同处理

  • 内容审核通过还是拒绝?走不同出口

2. 基本用法

条件边由三部分组成:源节点 + 路由函数 + 映射表。

from langgraph.graph import StateGraph, START, END def router(state) -> str: """路由函数:读取 state,返回一个字符串""" if state["score"] >= 60: return "pass" else: return "fail" builder.add_conditional_edges( "check_node", # 从哪个节点出发 router, # 用哪个函数决定去向 { "pass": "pass_node", # 返回值 → 真实节点 "fail": "fail_node" } )

3. 执行流程

4. 简化写法

如果路由函数直接返回真实节点名,映射表可以省略:

def router(state): return "pass_node" if state["score"] >= 60 else "fail_node" builder.add_conditional_edges("check_node", router)

5. 路由函数可以返回列表(并行分发)

如果返回的是节点名列表,LangGraph 会并行执行这些节点:

def router(state): return ["branch_a", "branch_b"] # 两个分支并行执行

6. 路由函数可以返回 END

def router(state): if state["done"]: return END # 直接结束 return "continue_node"

二、循环:让图“转起来”

LangGraph 的图是允许循环的,这是它比普通工作流引擎强大的地方。

1. 最简单的循环:节点连回自己

builder.add_node("agent", agent_node) builder.add_edge("agent", "agent") # 自己连自己

但这样会无限循环,必须配合条件边来终止。

2. 用条件边实现循环

最经典的 Agent 循环模式:

def should_continue(state) -> str: """判断是否继续循环""" messages = state["messages"] last_message = messages[-1] # 如果还有工具调用,继续 if last_message.tool_calls: return "continue" # 否则结束 return "end" builder.add_node("agent", agent_node) builder.add_node("tools", tool_node) builder.add_edge(START, "agent") builder.add_conditional_edges( "agent", should_continue, { "continue": "tools", # 有工具调用 → 去执行工具 "end": END # 没有 → 结束 } ) builder.add_edge("tools", "agent") # 工具执行完 → 回到 agent

3. 循环流程图

这个循环就是 ReAct 模式的核心:Agent 思考 → 调用工具 → 观察结果 → 继续思考,直到不再需要工具。

4. 防止死循环

LangGraph 提供了recursion_limit参数来限制最大迭代次数:

graph.invoke( {"messages": []}, config={"recursion_limit": 25} # 最多执行 25 步 )

超过限制会抛出GraphRecursionError。

三、并行:让图“分头行动”

1. 静态并行(多个边指向多个节点)

最直接的方式:从一个节点出发,连多条边到不同节点。

builder.add_edge("start_node", "branch_a") builder.add_edge("start_node", "branch_b") builder.add_edge("start_node", "branch_c")

三个分支会并行执行,都完成后才进入merge_node。

2. 用 Send 实现动态并行(Map-Reduce)

静态并行需要提前知道有几个分支。如果分支数量是动态的,就要用Send。

from langgraph.types import Send def dispatch(state): """根据状态动态生成子任务""" return [ Send("process_item", {"item": item}) for item in state["items"] ] builder.add_conditional_edges("split_node", dispatch, ["process_item"])

执行流程:

3. Send 与普通边的区别

特性普通边Send
分支数量固定动态
子任务状态共享全局 State每个子任务独立 State
典型场景固定多分支Map-Reduce

4. 并行分支的结果合并

多个分支同时更新 State 时,必须用 reducer 避免冲突:

class MyState(TypedDict): results: Annotated[list, add] # 多个分支的返回会追加到同一个列表

如果不用add,后执行的分支会覆盖先执行的结果。

四、三种控制流的组合

真实业务往往是三者组合使用:

  • 条件边:意图识别分流

  • 并行:多个子任务同时处理

  • 循环:结果不满意时回到起点重试

注意

坑点说明解决
死循环循环没有终止条件设置recursion_limit
并行覆盖多个分支同时写同一个字段用Annotated+ reducer
条件边不生效路由函数返回值与映射表不匹配检查返回值是否在映射表中
Send 子任务丢失上下文Send 只传 state,不继承 runtime在 state 中显式复制所需字段
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 2:45:07

把对象存储桶暴露到公网之前:预签名、阻断、限流的检查清单

桶一旦能从公网访问,风险模型就变了:URL 会被爬虫扫到、会被转发到不该去的地方、出网带宽会因为别人的请求被打满。事后补救远不如上线前把该配的配好。这篇文章按"决定公开什么 → 控制谁能访问 → 限制能做什么"的顺序过一遍关键配置&#…

作者头像 李华
网站建设 2026/9/30 2:44:10

在生成式 AI 浪潮中,OpenAI 的 ChatCompletion(聊天补全)接口无疑是整个生态的基石。作为 GPT-3.5-turbo、GPT-4 等对话模型的核心调用对象

在生成式 AI 浪潮中,OpenAI 的 ChatCompletion(聊天补全)接口无疑是整个生态的基石。作为 GPT-3.5-turbo、GPT-4 等对话模型的核心调用对象,它定义了一套标准化的消息交互范式。随着 OpenAI Python SDK 的迭代,新版 SD…

作者头像 李华
网站建设 2026/9/30 2:43:34

小白程序员必看!3个月速成AI工程师,轻松拿下Offer+收藏!

本文提供了一条为期三个月的AI学习路径,帮助零基础者快速成为能上手干活的AI工程师。路径分为三步:首先强化Python基础和API调用能力;其次攻克LangChain、LlamaIndex等核心框架及Agent、模型微调、RAG等关键技能;最后通过实际项目…

作者头像 李华
网站建设 2026/9/30 2:43:17

别被高薪冲昏头脑:普通人如何安全入局AI大模型赛道?

近期AI岗位需求激增,薪资高企,吸引许多人转行。但高薪岗位往往要求算法、底层开发等背景,仅靠短期培训难以胜任。文章建议:不要裸辞转行,可利用业余时间尝试项目;优先将AI作为提升本职工作的工具&#xff1…

作者头像 李华