iT邦幫忙

2026 iThome 鐵人賽

DAY 12
0
自我挑戰組

AI Agent 從零開始系列 第 12 篇

Agent Loop——Agent 為什麼會一直工作?

  • 分享至 

  • xImage
  •  

Agent 會「一直工作(無窮迴圈 / Runaway Loop)」是 Agent 開發中最常見且危險的現象之一。

從底層機制來看,Agent 的本質就是一個 while True 的條件循環。只要沒有滿足「終止條件」,它就會不斷重複 思考 (Thought) $\rightarrow$ 行動 (Action) $\rightarrow$ 觀察 (Observation) 的循環。

Agent 陷入無窮迴圈的主要原因,可以歸納為以下 5 大核心機制問題:


1. 工具回傳的錯誤沒有給予「明確終止訊號」

當 Agent 呼叫外部 API 或執行程式碼失敗時(例如 HTTP 404、SQL 語法錯誤、網頁載入失敗),如果工具只回傳了無效資訊,LLM 會誤以為是自己參數給錯或方法不對,因而進入「嘗試 $\rightarrow$ 失敗 $\rightarrow$ 改參數再試 $\rightarrow$ 又失敗」的死循環。

  • 案例:Agent 想爬取 [https://example.com/page](https://example.com/page),但該頁面需要登入。
  • 現象:Agent 看到「請先登入」的網頁內容後,嘗試重新發出請求、換 Header、改 URL,永遠無法達成目的,卻也永遠不放棄。

2. 意圖邊界模糊(Goal Instability & Over-Planning)

如果給 Agent 的目標太寬泛或沒有邊界(例如:「請幫我研究市場上所有的 AI 工具」),Agent 在每一輪獲得新 Observation 後,都會「觸類旁通」產生新的子任務。

  • 現象:Agent 查了 A 工具 $\rightarrow$ 發現 A 工具用了 B 技術 $\rightarrow$ 決定去查 B 技術 $\rightarrow$ 發現 B 技術有 C 論文 $\rightarrow$ 決定讀 C 論文……目標不斷膨脹(Goal Drift),永遠無法到達「任務已完成」的評估點。

3. 上下文長度爆炸與「短期記憶喪失」(Context Window Truncation)

當 Agent 跑了十幾輪之後,對話歷史(Context)會變得極長。如果系統使用了「滑動視窗(Sliding Window)」或自動裁切舊訊息:

  • 現象:Agent 忘記了自己前幾輪已經嘗試過這個方法且失敗了。它會不斷重複呼叫同一個 Tool、帶入一模一樣的參數(如同得了短期失憶症),無限循環。

4. System Prompt 未定義「停機/放棄條件」

LLM 預設的指令原則是「竭盡所能完成使用者交付的任務」。如果沒有在 System Prompt 中明確賦予它「無法完成時,請主動放棄並說明原因」的權限,它就會持續嘗試直到耗盡 Token。


5. 多工具相依性引發的「狀態震盪(Oscillation)」

在多工具 Agent 中,當 Tool A 的輸出會影響 Tool B,而 Tool B 的輸出又成為 Tool A 的輸入時,容易產生狀態邏輯死結。

  • 案例:
  1. Tool A(語法檢查器):提示「程式碼第 5 行有錯,請改成 X」。
  2. Agent 改成 X 之後,呼叫 Tool B(測試執行器)。
  3. Tool B 提示「執行失敗,請改回 Y」。
  4. Agent 改回 Y,又觸發 Tool A 報錯,兩者相互拉扯無窮無盡。

💡 如何防止 Agent 無限工作?(工程最佳實踐)

在生產環境(Production)中,必須建立以下 五大護欄(Guardrails):

1. 硬性最大步驟限制 (Max Execution Steps / Timeouts)

最簡單也最有效的防線:在 Agent Loop 加上上限限制。

MAX_STEPS = 10
for step in range(MAX_STEPS):
    # Agent 推理與執行 ...
    if step == MAX_STEPS - 1:
        return "⚠️ 已達到最大嘗試次數,任務中斷。"

2. 工具呼叫去重與重複檢測 (Loop/Duplicate Detection)

記錄 Agent 歷史呼叫的 (tool_name, tool_args) 雜湊值。若發現連續 3 次呼叫完全相同的工具與參數,強制中斷並注入警告訊息給 LLM。

3. 錯誤重試上限 (Max Retry Limit for Errors)

對單一工具的 Error 回傳次數設定上限(例如最多失敗 3 次)。超過上限時,直接告知 LLM:「該工具目前不可用,請更換其他策略或放棄該子目標。」

4. 人類介入機制 (Human-in-the-Loop Interruption)

針對耗時、高代價或重複超過特定輪數的任務,觸發 Pause 狀態,透過 UI 詢問使用者:「Agent 已執行 8 個步驟,是否繼續執行?」

5. 提示詞寫明「放棄與拒絕」規則 (Prompt Engineering Guardrails)

在 System Prompt 中加入:

"如果所需資訊無法獲取、工具連續失敗,或目標無法達成,請立即終止 Tool Call,直接輸出目前的進度與無法完成的原因,切勿嘗試無效的重複呼叫。"


上一篇
打造「研究助理 Agent」
下一篇
Agent State——Agent 到底記得什麼?
系列文
AI Agent 從零開始 共 18 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言