Agent 會「一直工作(無窮迴圈 / Runaway Loop)」是 Agent 開發中最常見且危險的現象之一。
從底層機制來看,Agent 的本質就是一個 while True 的條件循環。只要沒有滿足「終止條件」,它就會不斷重複 思考 (Thought) $\rightarrow$ 行動 (Action) $\rightarrow$ 觀察 (Observation) 的循環。
Agent 陷入無窮迴圈的主要原因,可以歸納為以下 5 大核心機制問題:
當 Agent 呼叫外部 API 或執行程式碼失敗時(例如 HTTP 404、SQL 語法錯誤、網頁載入失敗),如果工具只回傳了無效資訊,LLM 會誤以為是自己參數給錯或方法不對,因而進入「嘗試 $\rightarrow$ 失敗 $\rightarrow$ 改參數再試 $\rightarrow$ 又失敗」的死循環。
[https://example.com/page](https://example.com/page),但該頁面需要登入。如果給 Agent 的目標太寬泛或沒有邊界(例如:「請幫我研究市場上所有的 AI 工具」),Agent 在每一輪獲得新 Observation 後,都會「觸類旁通」產生新的子任務。
當 Agent 跑了十幾輪之後,對話歷史(Context)會變得極長。如果系統使用了「滑動視窗(Sliding Window)」或自動裁切舊訊息:
LLM 預設的指令原則是「竭盡所能完成使用者交付的任務」。如果沒有在 System Prompt 中明確賦予它「無法完成時,請主動放棄並說明原因」的權限,它就會持續嘗試直到耗盡 Token。
在多工具 Agent 中,當 Tool A 的輸出會影響 Tool B,而 Tool B 的輸出又成為 Tool A 的輸入時,容易產生狀態邏輯死結。
在生產環境(Production)中,必須建立以下 五大護欄(Guardrails):
最簡單也最有效的防線:在 Agent Loop 加上上限限制。
MAX_STEPS = 10
for step in range(MAX_STEPS):
# Agent 推理與執行 ...
if step == MAX_STEPS - 1:
return "⚠️ 已達到最大嘗試次數,任務中斷。"
記錄 Agent 歷史呼叫的 (tool_name, tool_args) 雜湊值。若發現連續 3 次呼叫完全相同的工具與參數,強制中斷並注入警告訊息給 LLM。
對單一工具的 Error 回傳次數設定上限(例如最多失敗 3 次)。超過上限時,直接告知 LLM:「該工具目前不可用,請更換其他策略或放棄該子目標。」
針對耗時、高代價或重複超過特定輪數的任務,觸發 Pause 狀態,透過 UI 詢問使用者:「Agent 已執行 8 個步驟,是否繼續執行?」
在 System Prompt 中加入:
"如果所需資訊無法獲取、工具連續失敗,或目標無法達成,請立即終止 Tool Call,直接輸出目前的進度與無法完成的原因,切勿嘗試無效的重複呼叫。"