調(diào)用工具從規(guī)劃執(zhí)行到終止條件)
Agent 為什么會循環(huán)調(diào)用工具從規(guī)劃、執(zhí)行到終止條件碼海尋道 · 大模型、智能體與 RAG 工程組件系列第 39 篇Agent 一直調(diào)用搜索、反復重試同一個 API或者在兩個工具之間來回跳轉(zhuǎn)通常不是模型“突然失控”而是系統(tǒng)沒有為循環(huán)定義狀態(tài)、進展判斷和明確的停止條件。一、Agent 為什么天然會循環(huán)Agent 的基本模式就是思考 → 調(diào)用工具 → 觀察結(jié)果 → 再思考只要模型認為信息還不足或者工具結(jié)果沒有明確表示成功它就可能繼續(xù)調(diào)用。以下情況尤其容易循環(huán)工具返回空結(jié)果但沒有明確狀態(tài)模型無法判斷任務(wù)是否完成錯誤被包裝成普通文本每一輪都把同樣的上下文重新傳入沒有最大步數(shù)、時間和成本上限。二、先給工具結(jié)果定義狀態(tài)不要只返回一段字符串{result:沒有找到}更好的結(jié)果結(jié)構(gòu)是{status:no_result,items:[],retryable:false,next_action:ask_user_for_more_context}模型和控制器才能區(qū)分“沒有數(shù)據(jù)”“暫時失敗”和“參數(shù)錯誤”。三、必須設(shè)置硬性上限MAX_STEPS8MAX_TOOL_CALLS12MAX_RUNTIME_SECONDS60MAX_COST_CENTS30達到任意上限時Agent 應(yīng)停止并返回可解釋的狀態(tài)例如“未能在規(guī)定時間內(nèi)完成請縮小查詢范圍”。硬上限是最后一道保險不應(yīng)只依賴 Prompt 里的自然語言提醒。這些上限必須由服務(wù)端運行時強制執(zhí)行并按租戶、用戶、任務(wù)類型設(shè)置預(yù)算。除了步數(shù)和耗時還應(yīng)限制模型 Token、工具調(diào)用總數(shù)、單個工具調(diào)用次數(shù)、并發(fā)分支數(shù)和費用預(yù)算耗盡時進入明確的budget_exhausted狀態(tài)而不是繼續(xù)把錯誤交給模型。四、檢測重復調(diào)用保存最近的工具調(diào)用指紋fingerprinthash_json({name:tool_name,arguments:normalized_arguments,state_version:state_version,})iffingerprintinrecent_calls:return{status:duplicate_call,retryable:False,message:相同工具和參數(shù)已經(jīng)調(diào)用過,}重復調(diào)用不一定永遠錯誤例如查詢實時庫存可能需要刷新。但這類工具應(yīng)明確允許刷新次數(shù)和時間間隔。對于有副作用的工具重復檢測還不夠必須把idempotency_key傳給下游服務(wù)并在數(shù)據(jù)庫或業(yè)務(wù)服務(wù)中保證同一任務(wù)不會重復扣款、發(fā)貨或刪除。重試前要區(qū)分“請求未到達”“執(zhí)行結(jié)果未知”和“已明確失敗”三種狀態(tài)。五、重試要區(qū)分錯誤類型可以重試網(wǎng)絡(luò)超時臨時 429上游短暫 5xx連接池暫時耗盡。不應(yīng)自動重試參數(shù)校驗失敗權(quán)限拒絕資源不存在SQL 語義錯誤用戶沒有提供必要信息。重試應(yīng)使用指數(shù)退避和最大次數(shù)不能讓 Agent 自己決定無限重試。六、規(guī)劃和執(zhí)行要分開一個更容易控制的結(jié)構(gòu)Planner生成有限步驟計劃 ↓ Executor執(zhí)行當前步驟 ↓ Validator檢查結(jié)果是否滿足條件 ↓ 結(jié)束 / 修正計劃 / 轉(zhuǎn)人工Planner 不應(yīng)直接擁有所有寫操作權(quán)限Executor 也不應(yīng)擅自改變?nèi)蝿?wù)目標。在調(diào)用有副作用的工具前建議先持久化一次 Checkpoint記錄目標、參數(shù)、狀態(tài)版本和審批狀態(tài)工具返回后再寫入結(jié)果。這樣進程崩潰或人工暫停時可以判斷是否需要恢復、查詢下游執(zhí)行狀態(tài)避免把一次未知結(jié)果當成失敗而重復執(zhí)行。七、如何判斷“有進展”每輪執(zhí)行后更新明確的狀態(tài){goal:找到合同付款日期,completed:[確認合同 ID,讀取合同正文],remaining:[定位付款條款],evidence:[doc-001:v3:chunk-08],last_action:search_contract_clause}如果連續(xù)兩輪沒有新增證據(jù)、沒有改變狀態(tài)或沒有縮小問題范圍應(yīng)停止循環(huán)并請求用戶補充信息。八、終止條件應(yīng)分層設(shè)計成功終止目標字段齊全、證據(jù)滿足閾值、用戶確認完成。安全終止需要寫入、付款、刪除或越權(quán)操作時暫停等待審批。失敗終止達到重試、步數(shù)、時間或成本上限或者遇到不可恢復錯誤。追問終止缺少訂單號、日期、租戶或其他關(guān)鍵參數(shù)向用戶提問而不是繼續(xù)猜。九、LangGraph 中的循環(huán)控制思路LangGraph 用節(jié)點和條件邊表達循環(huán)可以在狀態(tài)中記錄steps、tool_calls和status通過條件邊決定繼續(xù)或結(jié)束call_model ├── 有 tool_call → run_tool → call_model ├── 已完成 → END ├── 需要審批 → interrupt └── 超過限制 → fail持久化 Checkpoint 讓暫停和恢復成為可管理的狀態(tài)而不是依賴進程內(nèi)變量。十、監(jiān)控循環(huán)異常重點監(jiān)控平均和最大工具調(diào)用次數(shù)相同工具重復調(diào)用率單次運行耗時和 Token達到最大步數(shù)的比例因權(quán)限和參數(shù)錯誤重試的比例人工中斷和用戶放棄率。結(jié)語Agent 循環(huán)本身不是問題失去邊界的循環(huán)才是問題。通過結(jié)構(gòu)化工具結(jié)果、錯誤分類、重復檢測、最大步數(shù)、進展狀態(tài)和分層終止條件可以把 Agent 從“不斷嘗試”變成可控的執(zhí)行系統(tǒng)。下一篇將把這些原則應(yīng)用到數(shù)據(jù)庫 Agent討論如何防止誤刪、SQL 注入和越權(quán)查詢。參考資料LangGraph 官方文檔Graph APILangGraph 官方文檔Recursion LimitLangGraph 官方文檔Interrupts本文為“碼海尋道”原創(chuàng)技術(shù)文章。循環(huán)限制、重試和成本上限應(yīng)在服務(wù)端強制執(zhí)行不能只寫在 Prompt 中。