想象你走进一座繁忙的快递分拣中心:传送带源源不断地送来包裹,每个包裹上贴着一张标签。分拣员看一眼标签,如果写着“上海”,就拉下左边的道岔,让包裹滑向上海线;如果写着“北京”,就推向右边的滑槽。这个看似简单的动作,让不同包裹各归其位,也让整个中心从“一条直线送到头”变成了一张能自动分流的网络。 在 LangGraph 状态图中,条件边(Conditional Edge)就是这位分拣员。普通的边像固定传送带:上一站结束,包裹只能去下一站;而条件边会先读取当前状态(包裹标签),再决定下一步该去哪个节点(哪条滑槽)。它让 Agent 不再机械地按固定顺序执行,而是能根据中间结果选择不同分支,构建出真正的非线性控制流。无论是客服分流、多步推理,还是安全审核,这套“看状态、选分支”的机制都是高级 Agent 工作流的心脏。记住这句话:条件边不是魔法,而是一个读状态、回名字的分拣函数。

岗位关联

对 AI 从业者而言,条件边是让 Agent 从“玩具 Demo”走向“生产级任务编排”的分水岭。掌握它,你就能用几十行代码设计出会自己绕路、会提前终止、会循环重试的智能工作流。

目录
  1. 可视化演示
  2. 条件边定义
  3. 状态字段路由
  4. 路由函数编写
  5. 终止条件END
  6. 动态分支构建
  7. 普通边对比
  8. 调试技巧
  9. 应用场景
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示LangGraph条件边的路由机制、多步推理工作流及条件边与普通边的对比。通过状态图节点、路由函数和动态分支直观呈现非线性控制流。

本节配有交互动效(进入视口后自动加载,约 3KB)。

条件边路由机制 Agent节点输出状态后,路由函数评估状态字段值 路由函数返回目标节点名,实现动态分支选择 三个工具节点根据路由结果执行不同处理路径 router(state) -> "T1" | "T2" | "T3" 条件边通过路由函数实现基于状态的动态控制流。

条件边定义

快递分拣中心里最忙碌的岗位不是搬包裹的工人,而是站在岔道口的分拣员。传送带把包裹送到脚边,他只看一眼标签,就决定把包裹推向左边的滑槽还是右边的滑槽。这个“看一眼、推一下”的动作,让整条流水线从一条死板的直线变成了一张能自动分流的网。

在 LangGraph 状态图中,分拣员就是条件边。图里的“节点”是处理包裹的工作台,比如大模型调用、代码检查、数据库查询;图里的“边”是包裹走过的传送带。普通边是固定传送带,只要上一步结束,包裹必然去下一站。条件边则不同:它会在运行时调一个路由函数,把当前状态交过去,然后根据返回结果决定下一步走进哪个节点。

这个机制构成了 Agent 工作流中的非线性控制流:流程不再是一条直线,而是能分叉、能回头、能提前结束的网状结构。你可以把它理解成一个带传感器的道岔——包裹重了就送去加急线,轻了就送去普通线,一切都由“读状态”完成。

条件边并不神秘:它只是在节点与节点之间加了一道“读标签、选滑槽”的闸门。理解这一点,后面的状态字段、路由函数、END 终止符都会顺理成章。

next=froute(state)\text{next} = f_{\text{route}}(\text{state})
如果把 state 比作包裹上累积贴满的标签,那么 f_route 就是分拣员,next 就是被他选中的那条滑槽。
  1. state(当前状态)整个图运行时的共享状态包,相当于包裹上贴着的所有标签。
    state\text{state}
  2. f_route(路由函数)分拣员手里的判断逻辑,读取 state 后返回一个字符串。
    froutef_{\text{route}}
  3. next(下一节点)LangGraph 拿到字符串后,把它当成下一个要执行的节点名字。
    next\text{next}

状态字段路由

分拣员从来不会把整个包裹拆开检查,他只需要看标签上的目的地字段。在 LangGraph 里,条件边同样只看状态字典中的某个字段。这个字段可能是大模型刚刚写出的判断结果,比如一个节点用 LLM 判断用户意图后,把 "intent": "refund" 写进状态;下一个条件边就只读 state["intent"],然后决定去退款流程还是人工客服。

这种“字段即标签”的设计让路由变得清晰:节点负责生产字段,条件边负责消费字段。生产字段的可以是 LLM,也可以是普通 Python 函数、工具返回结果、用户输入。关键是,字段必须先被写入状态,条件边才能读到它。如果上一个节点忘了写字段,路由函数就会像分拣员看到一张空白标签一样懵住,通常抛出一个 KeyError。

字段的值可以是字符串、布尔值,甚至数字。LangGraph 不关心你存了什么,它只负责把你给的字段交给路由函数。于是,中间结果驱动分支变成了现实:Agent 先做一次判断,把判断结果写进状态,再让条件边决定下一步是继续搜索、直接回答,还是换个工具重试。

字段路由让“模型判断结果”和“流程走向”解耦。模型只需要负责把一个判断写进状态,流程该往哪走,由条件边这张地图说了算。

next=mapping[state[field]]\text{next} = \text{mapping}[\text{state}[\text{field}]]
先按字段名从状态里取值,再拿着这个值去路由表里查下一站,就像按目的地查全国铁路换乘表。
  1. state[field]用字段名从状态字典中取出当前值,等价于分拣员读标签上的“目的地”一栏。
    state[field]\text{state}[\text{field}]
  2. mapping一个把字段值映射到节点名字的字典,例如 {"refund": "退款节点", "human": "人工客服"}。
    mapping\text{mapping}
  3. next查表得到的下一节点名,LangGraph 会把它当作下一步的执行目标。
    next\text{next}

路由函数编写

分拣员上岗前要背熟一套规则:看到“易碎”走慢速线,看到“加急”走快速线,看到“生鲜”走冷链线。这些规则就是路由函数。在 LangGraph 中,路由函数是一个普通的 Python 函数,输入是当前完整状态,输出是一个表示下一节点名称的字符串。

比如你可以写一个函数:如果状态里 category 是 "math",就返回 "solve_math";否则返回 "general_answer"。LangGraph 支持两种写法:一是让函数直接返回节点名字;二是让函数返回一个“路由键”,再用一个可选的映射表把键翻译成节点名字。第二种写法更适合当函数返回多个键、需要统一管理路由表的时候。

编写路由函数的核心原则是正确性:它必须对所有可能的状态值都有明确的去处。如果某天 category 变成了 "unknown",而路由表里没有这个键,程序就会直接报错。所以成熟的路由函数通常会写一个默认分支,就像分拣员遇到不认识的地址时,会先把包裹送去“问题件处理区”。

路由函数不需要访问什么隐藏魔法,它就是纯逻辑:读状态、算结果、返回字符串。让它保持简单,工作流才容易调试,也容易测试。

froute:S→N∪{END}f_{\text{route}}: \mathcal{S} \to N \cup \{\text{END}\}
路由函数是一个从状态集合 S 到节点名集合 N 或 END 的映射:给它任意状态,它必须还你一个去处。
  1. S(状态集合)所有可能状态构成的集合,也就是“包裹可能带有的所有标签组合”。
    S\mathcal{S}
  2. N(节点名集合)图中所有可执行节点的名字集合,比如 node_a、node_b。
    NN
  3. END(终止标记)一个特殊符号,表示流程结束。函数返回它,图就停止运行。
    END\text{END}

终止条件END

一条分拣线如果永远没有出口,包裹就会在传送带上打转,最后堆积成山。为了避免这种情况,分拣中心一定会有一个“装车出口”。在 LangGraph 中,这个出口就是 END。

条件边负责分流,但也必须负责喊停。当你希望流程走完时,就让路由函数返回字符串 "END"。LangGraph 识别到这个特殊节点名后,会立即停止当前图的执行,把最终状态返回给调用方。这个设计让循环成为可能:一个工作流可以不断回到某个节点重试,但只要条件边里有分支通向 END,流程最终就能收敛。

如果没有 END,一个循环图就会永远运行下去,就像分拣员不停把包裹送回同一道传送带,却永远不装车。所以在设计循环时必须反复确认:所有可能的路径上,是否至少有一个条件分支最终指向 END。这相当于给工作流装了一个安全出口。

掌握 END,你才真正掌握了循环图的“刹车片”。条件边负责灵活,END 负责收场,两者配合才能构建可靠的工作流。

froute(state)=ENDf_{\text{route}}(\text{state}) = \text{END}
当路由函数返回 END,当前图运行到此为止,不再继续往后找边。
  1. f_route(state)在当前节点执行完后,LangGraph 调用路由函数。
    froute(state)f_{\text{route}}(\text{state})
  2. =这个等号表示“返回结果等于”,是函数返回值上的相等。
    ==
  3. ENDLangGraph 预置的终止节点标识,不是真正的处理节点,而是一块“停止牌”。
    END\text{END}

动态分支构建

真实的快递分拣中心不是只有一个岔道口。包裹可能先被分到“同城线”和“跨城线”,同城线内又被分成“文件类”和“包裹类”,遇到地址不清的还会被送回人工复核台。这种层层分岔、甚至循环回头的结构,就是动态分支构建。

在 LangGraph 中,你可以把多个条件边像积木一样拼起来:节点 A 读完状态后指向 B 或 C;B 处理完后又可能通过条件边回到 A,或者走向 END。这样就能构造出“重试三次仍失败则转人工”的循环,也能构造出“先生成草稿,再判断是否安全,不安全就重新生成”的审核循环。每一步的判断都基于当时的实时状态,因此每个循环都是动态的。

这就是非线性控制流的真正威力:流程不再是写死在代码里的线性 Chain,而是由状态驱动的行为网络。同一个图,面对不同输入,会走出完全不同的路径。复杂工作流由此诞生:可以拆解问题、并行处理、反思重试、逐步验证。

动态分支是把 Agent 从“单线程背台词”升级为“随机应变的现场调度”的关键。多分支、嵌套路由、循环回溯,归根结底都是同一个条件边机制的组合应用。

next={NodeB,if state[flag]=1NodeC,if state[flag]=0END,otherwise\text{next} = \begin{cases}\text{NodeB}, & \text{if } \text{state}[\text{flag}] = 1 \\\text{NodeC}, & \text{if } \text{state}[\text{flag}] = 0 \\\text{END}, & \text{otherwise}\end{cases}
一个条件边可以像分线器一样,把包裹送到多条不同方向的分支;如果不满足任何分支,则默认结束。
  1. state[flag] = 1当状态字段 flag 等于 1 时,走 NodeB 分支。
    state[flag]=1\text{state}[\text{flag}] = 1
  2. state[flag] = 0当 flag 等于 0 时,走 NodeC 分支。
    state[flag]=0\text{state}[\text{flag}] = 0
  3. otherwise其他所有情况统一送回 END,保证函数总有返回值。
    otherwise\text{otherwise}

普通边对比

分拣中心里有一种永远不变的传送带:从供包台到扫描仪,再从上包口到下包口,所有包裹都走同一条路。这是最可靠的路径,也是普通边。普通边适合那些不管输入是什么都必须执行的步骤,比如加载配置文件、调用基础模型、记录日志。

普通边的特点是编译时就固定了:A 的下一个节点永远是 B,不存在第二种可能。条件边则把选择推迟到运行时,让“包裹到了那个路口再看标签决定去向”。二者互补,共同构成了完整的状态图。一味的普通边会让工作流僵化成线性链,一味的条件边则会让图复杂到难以维护。

用图论的语言看,一张状态图是节点和两类边的集合:普通边提供骨架,条件边提供灵活。普通边保证主干稳定,条件边在关键位置打开岔道口,让 Agent 能根据中间结果随机应变。这张混合图既能像流水线一样稳定执行必要步骤,又能像智能交通系统一样动态调度车流。

普通边和条件边不是对立关系,而是分工关系。最好的工作流不会全用普通边,也不会全用条件边,而是在“必须做”和“看情况做”之间找到平衡。

G=(N,Efixed∪Econditional)G = (N, E_{\text{fixed}} \cup E_{\text{conditional}})
图 G 由节点集合 N、固定边集合和条件边候选集合共同构成;条件边在运行时才从中选出真正生效的一条。
  1. N(节点集合)所有处理节点的集合,等同于分拣中心的各个工位。
    NN
  2. E_fixed(固定边集合)无条件跳转的边,A 后永远跟 B。
    EfixedE_{\text{fixed}}
  3. E_conditional(条件边集合)带候选分支的边,只有运行时才知道走哪条。
    EconditionalE_{\text{conditional}}
  4. ∪(并集)两类边一起存在于同一张图中。
    ∪\cup

调试技巧

当分拣员把本该去上海的包裹推去了广州,主管第一件事不是骂人,而是查看当时包裹的标签和分拣员看到的路由表。调试条件边也是一样:你要同时看到“状态”和“路由结果”,才能知道问题出在输入还是判断逻辑。

最直接的技巧是在条件边执行前后打印状态快照。比如在节点 A 结束时打印 state,再打印路由函数返回的下一节点名。如果状态里 intent 是 "refund",路由却返回了 "technical",那问题大概率在路由函数或映射表;如果 intent 本身就是 None,那问题在产生字段的上游节点。

边界值测试同样重要。路由函数可能对 "yes" 返回正常,但遇到 True 或 1 就崩溃。你应该像测试普通函数一样,为路由函数准备典型值、空值、异常值。可视化追踪也是工程利器:画出图,标出每一次实际走过的边,像快递物流轨迹一样回放流程,很快就能定位到是哪一道岔打错了方向。

条件边本身是个确定性函数,所以它出的问题通常都能通过“看输入、看输出”定位。学会给每次分流留痕,你就能从“玄学调参”走向“工程化调试”。

record=(state,froute(state))\text{record} = (\text{state}, f_{\text{route}}(\text{state}))
调试时把状态快照和路由返回值打包成一条记录,就等于给每个包裹拍下了分拣瞬间的现场照片。
  1. state(快照)当前状态在路由调用那一刻的完整拷贝。
    state\text{state}
  2. f_route(state)(路由结果)同一时刻路由函数返回的下一节点名。
    froute(state)f_{\text{route}}(\text{state})
  3. record(记录)两者组合成一条可回放、可打印的日志。
    record\text{record}

应用场景

当一家快递公司把分拣员从“凭感觉扔包裹”升级成“扫码读标签、系统自动分路”,整体效率会立刻上升。条件边对 AI 工作流的意义也是如此:它让 Agent 根据任务的实际状态,走到最合适的处理分支上。

在客服场景中,用户消息先经过意图识别节点,把结果写进 state["intent"],条件边再决定走退款、售后、技术还是人工客服。在多步推理场景中,Agent 先判断任务需要计算还是需要查资料,条件边把它路由到计算器工具或搜索工具,避免让一个 LLM 硬扛所有事。在安全审核场景中,生成内容先过审核节点,条件边根据审核结果决定直接返回还是进入重写流程,这比生成后一刀切拦截可靠得多。

条件边带来的不仅是功能,更是质量与可靠性。每个任务都被送到最适合它的下一站,而不是被迫走一条固定路线。就像包裹被准确送入对应城市线路,Agent 的成功率会在一次次正确路由中稳步上升。

应用场景千变万化,底层的分拣逻辑始终一致:读状态、选分支、走下去。条件边是最朴素也最强大的流程决策机制,把 Agent 从一个“死板执行者”变成了“会看路的智能工作者”。

agent_accuracy=correct_taskstotal_tasks\text{agent\_accuracy} = \frac{\text{correct\_tasks}}{\text{total\_tasks}}
在任务总量中,被条件边正确路由并完成的任务占比越高,Agent 整体的准确率就越高。
  1. total_tasks(总任务数)Agent 处理过的全部请求数量。
    total_tasks\text{total\_tasks}
  2. correct_tasks(正确任务数)其中路由合理、结果正确的任务数量。
    correct_tasks\text{correct\_tasks}
  3. 比值(准确率)正确任务占总任务的比例,用来衡量条件边把路带对的能力。
    correct_taskstotal_tasks\frac{\text{correct\_tasks}}{\text{total\_tasks}}

AI 应用场景

客服工单分诊

阶段:工作流编排与路由

解决的问题:传统客服系统把所有工单都丢进同一个队列,退款、技术故障、投诉混在一起,人工处理效率低。AI 先识别意图,再通过条件边把不同工单路由到对应处理分支,让专业节点处理专业问题。

具体案例:某电商客服机器人先用 LLM 判断用户消息属于“退款”“技术故障”还是“人工投诉”,并把结果写入状态字段。条件边读取该字段后,让退款工单进入自动退款流程,让技术工单进入排查手册节点,让投诉工单直接升级到人工专员。

多步推理与工具选择

阶段:Agent 循环执行

解决的问题:单次大模型调用无法完成多步计算和知识检索,而把所有工具都塞进一个提示词会让模型困惑。条件边可以根据中间判断,把任务动态路由到计算器、搜索引擎或数据库查询节点。

具体案例:一个数学解题 Agent 先判断题目是否包含数值计算;如果包含,就路由到计算器节点;如果包含需要查证的事实,就路由到搜索节点;如果两者都不需要,就直接进入答案输出节点。流程每次运行都会根据当前状态走不同路径。

内容安全审核保险丝

阶段:安全审核与后处理

解决的问题:生成式 AI 不能保证每次输出都安全,一刀切拒绝又会误伤正常请求。条件边可以在生成节点后增加一个审核分流:安全内容直接放行,风险内容进入人工复核或重新生成节点。

具体案例:某内容平台的工作流先生成文案,再由安全模型输出 pass 或 block 到状态字段。条件边读到 pass 就路由到发布节点,读到 block 则路由到改写节点;改写后仍未通过时返回 END,避免死循环。

Python 演示

python63 行
class TinyGraph:    def __init__(self):        self.nodes = {}        self.conditional_edges = {}     def add_node(self, name, fn):        self.nodes[name] = fn     def add_conditional_edges(self, source, router, mapping):        self.conditional_edges[source] = (router, mapping)     def run(self, start, state):        current = start        while current != "END":            state = self.nodes[current](state)            if current in self.conditional_edges:                router, mapping = self.conditional_edges[current]                key = router(state)                current = mapping[key]            else:                raise RuntimeError("no conditional edge from " + current)        return state  def classify(state):    text = state["query"].lower()    if any(c in text for c in "1234567890"):        state["category"] = "math"    else:        state["category"] = "general"    return state  def solve_math(state):    state["answer"] = "need calculator tool"    return state  def answer_general(state):    state["answer"] = "search knowledge base"    return state  def route_after_classify(state):    return state["category"]  def main():    graph = TinyGraph()    graph.add_node("classify", classify)    graph.add_node("solve_math", solve_math)    graph.add_node("answer_general", answer_general)    graph.add_conditional_edges(        "classify",        route_after_classify,        {"math": "solve_math", "general": "answer_general"},    )    result = graph.run("classify", {"query": "calculate 3*4"})    print(result["category"], "->", result["answer"])  if __name__ == "__main__":    main()
目的:用 40 行代码实现一个简化版 LangGraph 条件边机制,演示“节点更新状态 → 路由函数读状态 → 映射表选下一节点”的完整流程。
  1. def add_conditional_edges(self, source, router, mapping):在图上登记一条条件边:从哪个节点出发、用哪个路由函数、映射到哪些下一节点。
  2. state = self.nodes[current](state)执行当前节点,节点接收状态并返回更新后的状态。
  3. key = router(state)模拟 LangGraph 执行阶段:把当前状态交给路由函数,得到分支键。
  4. current = mapping[key]拿着分支键查路由表,得到真正的下一个节点名;如果键不存在会抛 KeyError。
  5. state["category"] = "math"节点把模型判断结果写进状态字段,供后续条件边读取。
  6. graph.add_conditional_edges("classify", route_after_classify, ...)组装图:从 classify 节点出发,按 state["category"] 选择下一站。

常见误区

误区我一直以为条件边是自带“智能”的,只要连上两个节点,它就会自动根据用户问题选择走哪边,不需要我写任何逻辑。

正解条件边本身只是一条可编程的传送带闸门,它并不知道语义是什么。真正做判断的是路由函数,这个函数读取状态字段,经过你自己的逻辑后返回一个节点名字。如果路由函数只是 return state["x"],那它做的判断就只是“取字段”,并没有理解任何语义。

为何常见:因为“条件边”听起来像是模型行为,而且很多教程只展示它连接了两个分支,没强调中间那个路由函数才是大脑。

误区我以为条件边返回的应该是下一个节点的对象或函数引用,这样程序才知道该执行哪段代码。

正解在 LangGraph 中,路由函数通常返回的是节点名字符串。框架内部维护着一张“名字 → 节点函数”的注册表,拿到字符串后再去查表执行。这也是为什么映射表可以先把路由结果翻译成节点名,再由框架统一调度。

为何常见:很多语言里函数是一等公民,容易让人以为图框架也直接传递函数指针;其实字符串名字更方便序列化、调试和可视化。

误区我觉得条件边和图结构一样,一旦代码写好,能走哪些分支就已经固定了,不是真正动态的。

正解分支的候选集合是编译时确定的,但实际选择哪条分支是运行时才决定的。条件边在每次执行时都会读取最新的状态,而状态会随节点执行不断变化。同一个条件边,面对不同输入,可能走出完全不同的路线,这正是非线性控制流的来源。

为何常见:初学者常常把“图结构”和“图执行”混为一谈,误以为画好的流程图就等于写死的剧本,忽略了运行时状态这个变量。

误区我猜条件边能让流程自动停下来,所以只要循环路径上有条件边,图就一定能结束。

正解条件边只决定“下一步去哪”,并不保证“一定有出口”。如果每个条件分支最终都回到起点,图就会无限循环。必须在某个分支上返回 END 或走向无循环的终止节点,流程才能收敛。条件边提供的是灵活性,停止牌要你自己放。

为何常见:因为条件边给人一种“会思考、会判断”的错觉,忘记它还只是传送带上的一个岔道口,不能替代终点站。

误区我以为条件边读的状态字段必须是大模型输出的,所以每次路由前都必须调用一次 LLM。

正解状态字段可以来自任何节点:普通 Python 函数、工具调用结果、用户输入、规则引擎,甚至上一个条件边写入的标记。LLM 只是其中一种“标签来源”。很多高效工作流会用规则先做粗分流,只有规则不确定时才调用 LLM,这样既快又省成本。

为何常见:因为条件边常出现在 LLM Agent 教程里,很多人就把“状态字段”和大模型输出画了等号,忽略了它只是普通字典里的一个值。

面试题

Q1. 条件边在 LangGraph 中的核心作用是?

单选题 · easy

  • A.按状态值选下一节点← 正确答案
  • B.按随机数选下一节点
  • C.按节点颜色选下一节点
  • D.按编译时间选下一节点

答案:A。条件边通过读取当前状态字段来决定下一节点,就像分拣员看包裹标签选择滑槽。随机数、节点颜色、编译时间都不是 LangGraph 的条件边决策依据。

Q2. 条件路由函数通常返回什么?

单选题 · easy

  • A.下一个节点名称← 正确答案
  • B.模型损失数值
  • C.用户输入文本
  • D.节点权重向量

答案:A。LangGraph 的路由函数返回字符串形式的节点名,框架再根据名字查找并执行对应节点。损失、文本、权重都不是路由函数的输出类型。

Q3. 普通边与条件边的主要区别是?

单选题 · mid

  • A.普通边固定条件边动态← 正确答案
  • B.普通边动态条件边固定
  • C.普通边条件边都固定
  • D.普通边条件边无区别

答案:A。普通边是固定传送带,A 后必然到 B;条件边在运行时根据状态从候选分支中选择一条。两者在流动性和可预测性上正好相反。

Q4. 以下哪些能力可以通过条件边实现?

多选题 · mid

  • A.多分支路由← 正确答案
  • B.循环回溯流程← 正确答案
  • C.提前终止流程← 正确答案
  • D.修改模型参数

答案:ABC。条件边选择分支可实现多分支;分支回到上游节点可形成循环回溯;返回 END 可实现提前终止。条件边只负责流程走向,不修改模型参数。

Q5. LangGraph 中 END 的作用是?

单选题 · easy

  • A.标记流程终止← 正确答案
  • B.表示模型报错
  • C.代表最后一个层
  • D.触发重新编译

答案:A。END 是特殊终止节点,路由函数返回它时流程结束。它不是错误、不是网络层,更不会触发编译。

Q6. 路由函数里返回 END 会发生什么?

单选题 · hard

  • A.当前图运行停止← 正确答案
  • B.当前图进入死循环
  • C.当前图自动重试
  • D.当前图抛出异常

答案:A。LangGraph 识别到 END 后停止执行,并把最终状态返回调用方。返回 END 不是异常路径,而是正式终止协议。

Q7. 调试条件边时,哪些做法最有效?

多选题 · hard

  • A.打印状态快照← 正确答案
  • B.记录路由返回值← 正确答案
  • C.测试边界字段值← 正确答案
  • D.删除条件边调试

答案:ABC。状态快照能看到输入,路由返回值能看到输出,边界值测试能覆盖异常输入。删除条件边虽然能绕过问题,但无法定位根因,反而破坏图结构。

Q8. add_conditional_edges 的映射表作用是什么?

单选题 · mid

  • A.把路由键映射到节点← 正确答案
  • B.把节点映射到损失
  • C.把模型映射到数据
  • D.把状态映射到梯度

答案:A。当路由函数返回的是短键而不是节点名时,映射表负责把这些键翻译成真正的节点名,相当于分拣中心的“线号对照表”。

Q9. 以下哪些场景适合使用条件边?

多选题 · mid

  • A.客服工单分诊← 正确答案
  • B.多步推理选工具← 正确答案
  • C.内容安全审核← 正确答案
  • D.静态页面生成

答案:ABC。客服分流、工具选择、安全审核都需要根据中间状态动态决定下一步。静态页面生成是固定流水线,不需要条件边介入。

Q10. 用条件边实现循环时,下列哪项是必要的?

单选题 · extreme

  • A.至少一分支可到 END← 正确答案
  • B.循环中禁用条件边
  • C.循环节点只执行一次
  • D.循环必须依赖普通边

答案:A。循环要能终止,必须至少有一条分支通向 END 或终止路径。否则条件边会把流程不断送回起点,造成真正意义上的死循环。