前面幾天我們一直在讓 Agent 變得更完整,從 Tool Selection、Memory、RAG,到最近的多步驟任務,Agent 已經可以自己決定要使用哪些 Tool,甚至連續執行多個步驟。
不過 Agent 並不是可以無限執行的,當 Agent 執行的步驟越來越多,就會開始遇到一些實際上的限制,像是 Token、Context,以及執行次數。
所以今天就來看看這些限制,並在目前的 Agent Loop 中加入一個簡單的執行次數上限。
在使用 LLM 時,文字並不是直接以「一句話」的方式計算,而是會被拆成許多 Token。
例如我們輸入請幫我計算 10 + 20 模型在處理這段文字時,就會消耗一定數量的 Token,而 Agent 的情況又更複雜,因為除了使用者輸入之外,還可能包含:
因此,當 Agent 執行的步驟越多,通常也代表需要處理更多 Token,Token 越多,不只可能增加成本,也可能受到模型本身的使用限制。
如果把 Token 想成「文字的單位」,那 Context 就可以理解成模型這一次能夠看到的上下文,例如我們前面的 Agent Memory,就是把之前的對話內容加入 Context,讓模型可以知道前面發生過什麼。
但是 Context 並不是無限的,假設 Agent 執行了一個很複雜的任務:
使用者
↓
Agent
↓
Tool 1
↓
Tool 2
↓
Tool 3
↓
Tool 4
↓
Tool 5
每一次 Tool 執行,都可能產生新的結果,如果這些結果全部保留下來,Context 就會越來越大,所以實際設計 Agent 時,通常需要考慮:
哪些資訊真的需要保留?
而不是把所有執行過的內容全部塞回模型。
除了 Token 和 Context 之外,前面做 Agent Loop 時其實還有另一個問題,我們之前的 Agent Loop 大概是:
LLM
↓
需要 Tool?
↓
呼叫 Tool
↓
取得結果
↓
再交給 LLM
↓
需要 Tool?
↓
繼續執行
如果 Agent 一直認為「還需要下一個 Tool」,就可能不斷執行下去,這不只會浪費 Token,也可能讓 API 被大量呼叫,因此實際上的 Agent 通常會設定一個最大執行次數。
這次不需要新增 MCP Server,我們直接修改前面做過的 Agent Loop,先設定一個最大執行次數:
MAX_STEPS = 5
接著在 Agent Loop 中限制最多只能執行 5 次:
MAX_STEPS = 5
for step in range(MAX_STEPS):
# Agent 執行
...
如果 Agent 在 5 次內完成任務,就可以正常結束;如果還沒完成,就會在達到上限後停止,也可以在迴圈結束後加入提示:
print("已達到最大執行次數,停止 Agent。")
這樣就算 Agent 判斷錯誤,一直想繼續呼叫 Tool,也不會讓它無限制執行。
我們可以使用前面做過的多步驟任務來測試,為了方便測試我們把 MAX_STEPS 設得很小,這裡我先把 MAX_STEPS 設成 1 和 4 來測試。

可以看到這裡 Agent 就只能執行一次,接著我們換成測試四的情況

可以看出這裡它用到write_file之後就被迫暫停了,所以這時候如果任務需要多個步驟,就可能在完成之前被迫停止。
這也可以看出執行次數限制的作用:
不是讓 Agent 做得越少越好,而是避免 Agent 在出錯或陷入循環時無限制執行。
今天沒有再增加新的 MCP Tool,而是回頭看看 Agent 在實際使用時會遇到的限制,我們簡單認識了三個常見問題:
最後我們在 Agent Loop 中加入 MAX_STEPS,讓 Agent 有一個最大的執行次數,這看起來只是很簡單的限制,但對實際的 Agent 來說,這類控制其實很重要。