前面几篇用条件边完成了大量路由逻辑。
ReAct Agent 的工具循环、质量门控的重试循环,核心都是 addConditionalEdges。
条件边能力上没问题,但用多了会发现一个不太方便的地方:路由逻辑和节点逻辑是分开的。
比如前面的重试循环:
01import type { GraphNode, ConditionalEdgeRouter } from '@langchain/langgraph'0203// 验证节点:检查草稿质量,把结果写入状态04const validate: GraphNode<typeof State> = (state) => {05if (state.draft.length >= 30) {06return { isValid: true, feedback: '' }07}08return { isValid: false, feedback: '草稿太短' }09}1011// 路由函数:读取验证结果,决定下一步12const checkResult: ConditionalEdgeRouter<typeof State, 'generate'> = (state) => {13if (state.isValid) return END14if (state.retryCount >= 3) return END15return 'generate'16}
validate 节点已经知道草稿合不合格了,但它没法直接说「下一步去哪」。它只能先把 isValid 写入状态,然后等条件边的路由函数再去读这个字段。
做同一个决策,代码分散在两个地方。
当图变复杂以后,这种分离会越来越明显:
Command 就是用来解决这件事的:让节点直接说「我要更新这些状态,并且下一步走到那个节点」。