Day 024|条件路由:让 Agent 根据结果选择下一步
系列100 天系统学习 AI Agent 开发当前阶段LangChain 与 LangGraph 工程化今日目标条件路由可以根据工具结果、置信度、用户权限或错误类型决定流程分支。真正让流程像 Agent 的不是节点而是岔路口检索到充分证据时回答问题含糊时追问工具暂时超时可以再试一次用户无权限则立即终止。节点本身只是做事条件路由才把观察结果变成下一步。这里也最容易失控。有人会写“confidence 0.8 就回答”仿佛 0.8 是天然真理。可不同检索器的分数不可直接比较相似度也不等于答案可靠。阈值必须从自己的标注数据校准而且不能单独承担权限和安全决策。今天要实现的路由规则否是可重试且未重试不可重试/预算用尽无错误充分不足且问题可补充知识库无资料检索或工具结果用户有权限终止并审计工具是否报错重试一次失败并解释证据是否充分生成带引用回答追问一个关键字段拒答并说明范围注意顺序权限判断在置信度之前。再“相关”的片段只要用户无权访问就不能被用来回答。路由输入要结构化fromdataclassesimportdataclassfromenumimportEnumclassNextStep(str,Enum):ANSWERanswerASK_USERask_userRETRY_TOOLretry_toolFAILfailREJECTrejectdataclass(frozenTrue)classRouteState:has_permission:booltool_error_kind:str|Noneattempts:intevidence_complete:boolmissing_user_fields:tuple[str,...]defchoose_next(state:RouteState)-NextStep:ifnotstate.has_permission:returnNextStep.REJECTifstate.tool_error_kindretryable:returnNextStep.RETRY_TOOLifstate.attempts1elseNextStep.FAILifstate.tool_error_kind:returnNextStep.FAILifstate.evidence_complete:returnNextStep.ANSWERifstate.missing_user_fields:returnNextStep.ASK_USERreturnNextStep.FAIL这段代码故意没有 similarity_score。第一版用“evidence_complete”这个经过证据检查的布尔值更容易测试。以后如果加入分数应同时考虑来源权威、版本匹配、证据覆盖和重排结果而不是只看向量距离。“证据充分”如何定义以部署问题为例用户要环境和命令检索结果只覆盖命令即使相似度很高也不完整。可以先将需求拆为 evidence_points{required_points:[环境要求,安装命令],covered_points:[安装命令],evidence_complete:false,missing_points:[环境要求]}这时系统可继续检索、追问版本或回答“现有资料只确认了命令环境要求暂无依据”。不要把“低置信度”当成一句笼统提示。路由测试表场景输入状态期望下一步高质量证据且有权限completetrueanswer缺产品版本missing_fields[version]ask_user首次短暂超时retryable, attempts0retry_tool第二次仍超时retryable, attempts1fail参数非法validation_errorfail不重试无权限permissionfalsereject无资料且无可追问项completefalsefail/unsupported真实接 LangGraph 时条件边的 API 写法要按官方文档核对上面的 RouteState 与纯函数可以先独立测试再映射到图节点名。三种失败模式分支条件重叠。同时缺权限又工具超时如果判断顺序不固定可能错误重试敏感工具。返回任意字符串。模型生成不存在的节点名图运行到未知位置。无默认出口。新增错误类型没有匹配分支任务卡在 running。每个路由都应有穷尽的枚举和兜底失败状态返工还要有总预算。下一篇做 checkpoint 时路由结果与 attempts 必须被持久化否则恢复后可能再次获得一次重试机会。面试官会追问条件路由应该交给规则还是模型能由确定字段判断的就用规则权限、金额阈值、错误类型、schema 是否通过、最大轮数。只有语义分类或开放任务才让模型参与而且模型输出仍要落到有限枚举。例如客服路由可以分两层代码先拦截无权限与高风险动作模型再在 faq、order_query、complaint 三类意图中选择低置信度进入 ask_user。这样模型不会越过硬边界规则也不用穷举全部语言表达。测试时不能只覆盖“正确分支”还要覆盖路由震荡同一任务在两个节点之间来回跳。给 state 增加 route_history 与 step_budget一旦重复模式超过阈值就终止并输出诊断而不是无限消耗 Token。