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