
系列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。