結(jié)果選擇下一步)
系列100 天系統(tǒng)學(xué)習(xí) AI Agent 開發(fā)當(dāng)前階段LangChain 與 LangGraph 工程化今日目標(biāo)條件路由可以根據(jù)工具結(jié)果、置信度、用戶權(quán)限或錯誤類型決定流程分支。真正讓流程像 Agent 的不是節(jié)點而是岔路口檢索到充分證據(jù)時回答問題含糊時追問工具暫時超時可以再試一次用戶無權(quán)限則立即終止。節(jié)點本身只是做事條件路由才把觀察結(jié)果變成下一步。這里也最容易失控。有人會寫“confidence 0.8 就回答”仿佛 0.8 是天然真理??刹煌瑱z索器的分?jǐn)?shù)不可直接比較相似度也不等于答案可靠。閾值必須從自己的標(biāo)注數(shù)據(jù)校準(zhǔn)而且不能單獨承擔(dān)權(quán)限和安全決策。今天要實現(xiàn)的路由規(guī)則否是可重試且未重試不可重試/預(yù)算用盡無錯誤充分不足且問題可補充知識庫無資料檢索或工具結(jié)果用戶有權(quán)限終止并審計工具是否報錯重試一次失敗并解釋證據(jù)是否充分生成帶引用回答追問一個關(guān)鍵字段拒答并說明范圍注意順序權(quán)限判斷在置信度之前。再“相關(guān)”的片段只要用戶無權(quán)訪問就不能被用來回答。路由輸入要結(jié)構(gòu)化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”這個經(jīng)過證據(jù)檢查的布爾值更容易測試。以后如果加入分?jǐn)?shù)應(yīng)同時考慮來源權(quán)威、版本匹配、證據(jù)覆蓋和重排結(jié)果而不是只看向量距離。“證據(jù)充分”如何定義以部署問題為例用戶要環(huán)境和命令檢索結(jié)果只覆蓋命令即使相似度很高也不完整。可以先將需求拆為 evidence_points{required_points:[環(huán)境要求,安裝命令],covered_points:[安裝命令],evidence_complete:false,missing_points:[環(huán)境要求]}這時系統(tǒng)可繼續(xù)檢索、追問版本或回答“現(xiàn)有資料只確認(rèn)了命令環(huán)境要求暫無依據(jù)”。不要把“低置信度”當(dāng)成一句籠統(tǒng)提示。路由測試表場景輸入狀態(tài)期望下一步高質(zhì)量證據(jù)且有權(quán)限completetrueanswer缺產(chǎn)品版本missing_fields[version]ask_user首次短暫超時retryable, attempts0retry_tool第二次仍超時retryable, attempts1fail參數(shù)非法validation_errorfail不重試無權(quán)限permissionfalsereject無資料且無可追問項completefalsefail/unsupported真實接 LangGraph 時條件邊的 API 寫法要按官方文檔核對上面的 RouteState 與純函數(shù)可以先獨立測試再映射到圖節(jié)點名。三種失敗模式分支條件重疊。同時缺權(quán)限又工具超時如果判斷順序不固定可能錯誤重試敏感工具。返回任意字符串。模型生成不存在的節(jié)點名圖運行到未知位置。無默認(rèn)出口。新增錯誤類型沒有匹配分支任務(wù)卡在 running。每個路由都應(yīng)有窮盡的枚舉和兜底失敗狀態(tài)返工還要有總預(yù)算。下一篇做 checkpoint 時路由結(jié)果與 attempts 必須被持久化否則恢復(fù)后可能再次獲得一次重試機會。面試官會追問條件路由應(yīng)該交給規(guī)則還是模型能由確定字段判斷的就用規(guī)則權(quán)限、金額閾值、錯誤類型、schema 是否通過、最大輪數(shù)。只有語義分類或開放任務(wù)才讓模型參與而且模型輸出仍要落到有限枚舉。例如客服路由可以分兩層代碼先攔截?zé)o權(quán)限與高風(fēng)險動作模型再在 faq、order_query、complaint 三類意圖中選擇低置信度進入 ask_user。這樣模型不會越過硬邊界規(guī)則也不用窮舉全部語言表達。測試時不能只覆蓋“正確分支”還要覆蓋路由震蕩同一任務(wù)在兩個節(jié)點之間來回跳。給 state 增加 route_history 與 step_budget一旦重復(fù)模式超過閾值就終止并輸出診斷而不是無限消耗 Token。