LangGraph 02:路由、循环、并发与 Command

2026-09-01
9834 分钟
...

1、本篇任务:让控制流明确、有限且可预测

上一课的图会在输入非法时继续查询。本课增加四类控制:条件路由决定走哪条边;循环允许有限重试;并发加速多个独立检索;Command 将状态更新与跳转绑定。

2、条件路由用于确定性业务判断

from typing import Literal

def route_after_validate(state: RefundState) -> Literal["load", "reject"]:
    return "reject" if state.get("errors") else "load"

builder.add_conditional_edges(
    "validate",
    route_after_validate,
    {"load": "load_order", "reject": "abstain"},
)

权限、金额、订单状态、重试次数等确定性条件用代码。模型只在“用户意图是什么、证据如何概括”这类语义任务中提供结构化枚举,路由函数再根据枚举跳转。

3、循环必须先写退出条件

检索不足时可以改写 query 再检索,但循环至少有四个出口:证据足够;达到最大尝试;deadline/token 预算耗尽;遇到不可重试错误。

def after_grade(state) -> Literal["answer", "rewrite", "abstain"]:
    if state["evidence_score"] >= 0.8:
        return "answer"
    if state["attempt"] >= 2 or state["budget_remaining"] <= 0:
        return "abstain"
    return "rewrite"

recursion limit 是最后保险,不是业务设计。若触发它,说明状态机退出条件有问题,应记录当前 step 和 state 摘要。

4、Command 绑定更新和跳转

当一个节点既要修改 state 又要决定目的地时,用 Command 可避免边读取旧值:

from langgraph.types import Command

def grade(state) -> Command:
    score = grade_evidence(state["evidence"])
    if score >= 0.8:
        return Command(update={"evidence_score": score}, goto="answer")
    if state["attempt"] >= 2:
        return Command(update={"evidence_score": score}, goto="abstain")
    return Command(update={"evidence_score": score, "attempt": state["attempt"] + 1}, goto="rewrite")

TypeScript 对应 new Command({ update: {...}, goto: "answer" })。节点返回类型最好列出所有可能目的地,帮助类型检查和代码审阅。

5、静态并发与 fan-in

订单和政策相互独立,可从同一节点分别连边并行执行;它们都结束后,汇总节点进入下一 super-step。

prepare ─┬→ load_order ───┐
         ├→ search_policy ├→ mergegrade
         └→ search_faq ───┘

并行分支不要共同覆盖单值字段。各分支写自己的字段,或写带 reducer 的 evidence;最终由 merge/grade 单独写 decision。

6、动态 fan-out 与 Send

来源数量在运行时才知道时,用 Send 创建工作单元:

from langgraph.types import Send

def create_research_jobs(state):
    return [
        Send("research_one", {"source_id": source_id, "question": state["question"]})
        for source_id in state["candidate_sources"][:5]
    ]

def research_one(state):
    return {"evidence": [lookup(state["source_id"], state["question"])]}

TypeScript 使用 new Send("researchOne", {...})。要限制 fan-out 数量、总并发、单任务超时和返回大小。并行完成顺序不确定,最终需要按 source ID 或分数排序,不能依赖 reducer 接收顺序。

7、副作用不能随意并发和重试

检索、读取和纯计算通常可重试;退款、发信、建工单必须用 action ID 幂等,并考虑补偿。两个分支不能同时修改同一订单。图负责调度,业务数据库负责事务和唯一约束。

8、本篇测试

  1. 输入非法时任何查询节点都没有被调用。
  2. 证据第二次仍不足时进入 abstain,不会第三次循环。
  3. 三个来源以不同延迟完成,最终排序和结论仍一致。
  4. 一个来源超时,其余结果可降级汇总。
  5. 动态来源超过五个时只派发五个任务。

下一课为这张图加入 checkpoint 和 interrupt,使审批可以跨请求等待并安全恢复。

官方阅读:Use Graph APIGraph API Command/Send

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
AI2026-09-01
Deep Agents 01:何为 Agent Harness,以及如何开始
1、本篇任务:完成一份多步骤、带证据的技术调研 普通客服 Agent 的问题短、工具少、输出即时。技术调研或编码任务会持续很久,产生计划、搜索结果、文件和中间结论。Deep Agents 在 LangChain/LangGraph 之上预装规划、虚拟文件系统、上下文压缩和子 Agent,适合这类开放任务。 本课让 Agent 比较两种向量数据库,并交付一份可验证报告。 2、什么时候需要 Deep Agent 满足以下两项以上再考虑:任务...
学习
AI2026-09-01
Deep Agents 02:子 Agent、虚拟文件系统与长期记忆
1、本篇任务:让主管只看结论,让子 Agent 处理细节 技术调研会产生几十次搜索和大量文件。如果全部进入主管上下文,真正的目标会被噪音淹没。本课用两个子 Agent: 收集证据, 检查结论;主管负责计划与最终合成。 2、什么时候委派,什么时候直接调用工具 适合委派:子任务有多步;需要专门提示或工具;会产生大量中间结果;只需返回有限结论。不适合:一步查询;主管需要全部中间上下文;协调成本超过任务本身。 3、配置专门子 Agent Pyt...
学习
AI2026-09-01
Deep Agents 03:生产化、Sandbox、权限与上线验收
1、本篇任务:让 Deep Agent 在隔离环境中分析代码 只读研究 Agent 风险有限;编码 Agent 需要读写文件、安装依赖和执行测试。本课不讲如何让模型写更漂亮的代码,只讲执行环境、权限、恢复和上线验收。 2、先做威胁模型 资产包括源代码、用户文件、云凭证、生产网络和发布权限;攻击入口包括用户消息、仓库内容、网页、依赖包、MCP 返回和命令输出。 Prompt injection 不是靠一句 system prompt 解决...
学习
AI2026-09-01
LangChain 01:全景、原理与学习路线
1、本篇学完要得到什么 这一篇只解决三个问题:LangChain 到底负责什么;它与 LangGraph、Deep Agents、LangSmith 是什么关系;后面应按什么顺序学习。 贯穿整套课程的项目是“退款政策与订单助手”。它最终能够:回答知识库中的退款规则;查询当前用户的订单;生成结构化答复;对真正的退款操作进行人工审批;断线后恢复;通过评测后发布。 先记住一句话: 模型负责理解与生成,应用负责数据、权限、状态和副作用。 如果把...
学习
AI2026-09-01
LangChain 02:模型、消息与结构化输出
1、本篇任务:让模型输出成为程序可以依赖的合同 上一课只证明 Agent 能运行。本课暂时不接业务工具,只完成一个“客服分诊器”:输入用户问题,输出意图、紧急程度、是否需要人工和给用户的答复。 本课的核心不是学更多模型参数,而是理解三层合同:消息决定模型看到了什么;schema 决定程序期待什么;业务校验决定结果是否真的可用。 2、消息不是一段字符串,而是一条执行记录 一次工具型对话通常包含四种消息: | 类型 | 由谁产生 | 作用...
学习
AI2026-09-01
LangChain 03:工具与 Agent——从函数到可控行动
1、本篇任务:让 Agent 安全地读取订单 上一课得到结构化分诊结果,但模型不知道真实订单。本课增加一个只读工具 ,走通完整 Agent 循环,并把模型、工具包装和领域服务的责任分开。 完成后,用户问“我的 A100 发货了吗”,Agent 会选择工具;工具只按当前登录用户查询;模型基于工具结果回答。它仍然不能退款,因为我们没有提供写工具。 2、工具的本质是受 schema 约束的应用函数 一个好工具需要:稳定名称、清楚描述、窄输入...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录