examhub .cc 用最有效率的方法,考取最有價值的認證
Vol. I
本篇導覽 約 27 分鐘

自主任務執行的 Agentic Loop

5,400 字 · 約 27 分鐘閱讀

Agentic loop 是每個自主 Claude 系統的執行心跳。Claude Certified Architect — Foundations(CCA-F)考試任務說明 1.1——「設計並實作用於自主任務執行的 agentic loop」——之所以居於 Domain 1(佔比 27%)的核心位置,是有原因的:考試中 Domain 1 的所有其他 orchestration 模式——從 coordinator-subagent 的扇出架構、session forking 到多步驟交接——都是建構在一個正確設計的 agentic loop 之上的結構性延伸。若你對 loop 的基本原語(primitive)理解有誤,Domain 1 的其餘部分也會跟著偏差。

這份學習筆記涵蓋 CCA-F 考生需要在架構層級設計的 agentic loop 完整面向:感知-推理-行動-觀察循環、stop_reason 欄位的精確語義、必須能夠一眼辨認的四個 stop_reason 值、防止迴圈失控的安全終止條件、tool_result 注入的資料結構、對話歷史成長的管理、循序執行與並行工具呼叫、Agent SDK 的三個迴圈進入點(runstreamprocess)、迴圈內部的錯誤處理分支,以及生產等級的可觀測性設計。最後的考試陷阱章節與六題 FAQ,將每個抽象概念連回四個練習 agentic loop 的考試情境:customer-support-resolution-agent、code-generation-with-claude-code、developer-productivity-with-claude,以及 multi-agent-research-system。

什麼是 Agentic Loop?感知、推理、行動、觀察

Agentic loop 是一種受控的多輪互動模式:Claude 在提出一個行動(通常是 tool_use 區塊)與接收該行動的觀察結果(作為 tool_result 回傳)之間交替迭代,直到滿足終止條件為止。這個迴圈是將單次 LLM 呼叫轉化為自主任務執行引擎的架構單元。沒有 agentic loop,Claude 就只是文字補全;有了 agentic loop,Claude 才是一個 agent。

每位 CCA-F 考生都應內化的正典四階段循環:

  1. 感知(Perception) — Claude 接收訊息(系統提示、使用者任務、先前的 tool result),這些訊息描述了當前的世界狀態。
  2. 推理(Reasoning) — Claude 的前向傳播產生一條 assistant 訊息,內容可能是(a)提出一個 tool_use、(b)給出最終的 end_turn 回答,或(c)觸及結構性停止,例如 max_tokensstop_sequence
  3. 行動(Action) — 若 assistant 訊息包含 tool_use,你的應用程式(客戶端工具)或 Anthropic 平台(伺服器端工具)執行該工具並捕捉輸出。
  4. 觀察(Observation) — 工具輸出以 tool_result 區塊的形式附加到對話中,作為新的 user 訊息,循環回到感知階段。

這個迴圈是明確的(explicit)——驅動 Claude 的 while 迴圈由你的程式碼負責執行。這與傳統聊天機器人的本質差異在於:後者每次回應後對話就結束了。Agentic loop 持續執行,直到 Claude 主動發出 end_turn、你的 guardrail 切斷它,或觸及硬性限制為止。

Agentic loop 是一個受控的迭代過程:Claude 提出工具呼叫,你的應用程式(或平台)執行這些工具,結果以 tool_result 區塊的形式回饋給 Claude,循環重複,直到 Claude 回傳 stop_reason: "end_turn" 或你的終止守衛觸發為止。Agentic loop 是任何自主 Claude agent 的基本執行單元,也是理解 Domain 1 所有任務說明的先決概念。 Source ↗

為什麼 CCA-F 把 Agentic Loop 放在第一位

考試指南將任務 1.1 列為 Domain 1 的基礎,是因為所有後續任務說明(1.2 coordinator-subagent、1.3 spawning、1.4 handoff、1.5 hook、1.6 任務分解、1.7 session 狀態)都預設你已經理解 Claude 在 tool_useend_turn 之間做了什麼。社群通過考試的報告反覆指出「忽略 stop_reason 訊號」是前五大錯誤之一——這種錯誤在考試當天會悄悄損失兩到三道計分題。

Agentic Loop 與單次推論的比較 — 何時選擇哪種架構

並非每次 Claude 呼叫都需要迴圈。生產環境中有很大比例的 Claude 用法仍是單次:分類這段文字、摘要這份文件、起草這封電子郵件。在只需單次呼叫的情況下選擇迴圈,只會多增加延遲、成本和失敗模式,毫無好處;反過來,在需要迴圈時選擇單次呼叫,則保證任務無法完成。

單次推論(Single-Turn Inference)

單次推論是一問一答:一次提示產生一次回應。沒有工具、沒有後續步驟、不需要根據中間結果動態分支。在以下情況使用單次推論:

  • 任務可以用提示中已有的資訊完成。
  • 沒有需要查詢、修改或觀察的外部狀態。
  • 輸出結構事先已知(散文回覆、JSON 物件、分類標籤)。

Agentic Loop

當任務存在認識論上的不確定性時,就必須使用 agentic loop——Claude 在訊息發出的當下無法知道完整答案,必須取得資訊或採取行動才能推進。在以下情況使用 agentic loop:

  • 任務需要讀取檔案、查詢資料庫或呼叫外部 API。
  • 結果取決於中間觀察(下一步根據前一個工具的輸出來決定)。
  • 任務是開放式的(修復這個 bug、研究這個主題、解決這張支援票),步驟數量無法事先預測。

決策捷思法

若把工具從你的設計中移除,Claude 仍然能完成任務,你就不需要 agentic loop。若移除工具讓任務變得不可能,你就需要 agentic loop。

在 CCA-F 的情境題中,「autonomous(自主)」這個字幾乎總是預告一個 agentic loop。「the agent investigates(agent 調查)」、「the agent resolves(agent 解決)」、「the agent iterates until(agent 迭代直到)」、「the agent gathers(agent 蒐集)」這類措辭都表示需要迴圈。單次推論的情境則使用「classify(分類)」、「summarize(摘要)」、「extract(擷取)」或「format(格式化)」這類動詞。 Source ↗

stop_reason 欄位 — 區分 tool_use 與 end_turn

每次 Claude 回應上的 stop_reason 欄位是驅動迴圈的訊號。Agentic loop 在架構上就是一個對 stop_reason 的 switch 陳述式。誤讀這個欄位,是 CCA-F 社群題庫中 Domain 1 出現頻率最高的陷阱。

Switch 陳述式心理模型

while true:
    response = claude.messages.create(messages=history, tools=tools, ...)
    history.append(response)

    if response.stop_reason == "tool_use":
        tool_results = execute_tools(response.content)
        history.append({"role": "user", "content": tool_results})
        continue   # 繼續迭代
    elif response.stop_reason == "end_turn":
        break      # Claude 表示已完成
    elif response.stop_reason == "max_tokens":
        handle_truncation(response)
        break      # 或決定以後續訊息繼續
    elif response.stop_reason == "stop_sequence":
        break      # 設定的停止字串匹配;視為終止

這個骨架值得背下來。大多數真實的 CCA-F agentic loop 題目,測的都是你能否為給定的 stop_reason 值選出正確的分支行為。

stop_reason 是 Claude Messages API 每次回應上的欄位,表示 Claude 為何停止生成。它的值決定了 agentic loop 接下來必須做什麼:tool_use 表示 Claude 正在請求工具執行,迴圈必須繼續;end_turn 表示 Claude 決定任務已完成,迴圈應退出;max_tokensstop_sequence 是需要明確處理的結構性中斷。正確讀取 stop_reason 是每個 agentic loop 的機械核心。 Source ↗

tool_use — 繼續迴圈

stop_reason == "tool_use" 時,Claude 的訊息內容包含一個或多個 tool_use 區塊。每個區塊帶有 nameidinput 物件。你的迴圈必須:

  1. 執行每個 tool_use 區塊(你的客戶端程式碼執行工具,或 Anthropic 平台執行伺服器端工具)。
  2. 將每個結果封裝為帶有對應 tool_use_idtool_result 區塊。
  3. 將一條新的 user 訊息附加到歷史記錄,其 content 為 tool_result 區塊的陣列。
  4. 再次呼叫 Messages API。

看到 tool_use 代表迴圈結束。恰恰相反,tool_use唯一強制要求繼續的 stop_reason

end_turn — 終止迴圈

stop_reason == "end_turn" 時,Claude 在告訴你它已完成當前任務的工作,不再有工具呼叫要發出。最後的 assistant 訊息包含呈現給使用者的答案。end_turn 是 agentic loop 的正常終止路徑(happy path)

tool_useend_turn 是驅動 agentic loop 控制流程的兩個主要 stop_reason 值。tool_use 表示 Claude 請求工具執行,迴圈必須繼續;end_turn 表示 Claude 決定任務已完成,迴圈應退出,最後的 assistant 訊息就是答案。正確的 agentic loop 實作恰好在這個區別上做分支。社群通過報告指出,混淆這兩個值是 CCA-F Domain 1 中最常被錯答的前五大概念之一。 Source ↗

stop_reason 值完整目錄 — tool_use、end_turn、max_tokens、stop_sequence

CCA-F 要求你認識四個 stop_reason 值,並知道每個值對應的正確迴圈反應。

tool_use

Claude 已產生一個或多個 tool_use 區塊。在附加對應的 tool_result 區塊後,迴圈繼續。

end_turn

Claude 決定任務已完成。迴圈退出。最後的 assistant 訊息就是答案。

max_tokens

Claude 在回應途中觸及了設定的 max_tokens 上限,訊息被截斷——可能截在句子中間,甚至截在 tool_use 區塊中間。迴圈中途出現 max_tokens 不是正常完成訊號;它表示你的輸出預算對這個任務來說太小了。典型的處理方式有三種:

  • 提高 max_tokens 並重試。
  • 請 Claude 繼續(附加一條簡短的 user 訊息,例如「請繼續」)。
  • 視為失敗並升級處理。

stop_sequence

Claude 的生成匹配了你在 stop_sequences 參數中傳入的某個字串。這在結構化輸出的工作流程中最常見——你預先要求 Claude 在某個已知分隔符處停止。對該結構化步驟而言,stop_sequence 是終止訊號;但要檢查你的 agentic loop 在更高層面是否應該繼續。

四個 stop_reason 值,每個一句話:

  • tool_use — Claude 想呼叫工具;附加 tool_result 後再次迴圈。
  • end_turn — Claude 完成;退出迴圈。
  • max_tokens — 輸出預算耗盡;回應被截斷;決定延長或中止。
  • stop_sequence — 設定的停止字串匹配;結構化終止。

干擾線索:若某個答案聲稱 end_turn 表示發生錯誤,或 max_tokens 是 agent 正常完成工作的方式,那就是錯的。 Source ↗

迴圈終止條件 — 設計安全退出準則以避免無限迴圈

end_turn 是 Claude 的自我宣告終止訊號,但生產等級的 agentic loop 不能只依賴 Claude 的判斷。你需要設計守衛條件作為縱深防禦。

每個生產迴圈都應實作的五個終止守衛

  1. 迭代上限 — 迴圈輪次的硬性最大值(例如 20 輪)。沒有這個守衛的迴圈,偶爾會永遠跑下去。
  2. 掛鐘超時(Wall-clock timeout) — 整個迴圈的最大經過時間。
  3. Token 預算 — 所有輪次累計的輸入加輸出 token 數,上限為業務定義的值。
  4. 重複狀態偵測 — 若 Claude 連續三次以相同 input 發出相同的 tool_use,代表迴圈卡住了;中止。
  5. 人工升級觸發 — 迴圈主動將控制權交回人類的條件(低置信度、敏感操作、超出範疇的請求)。

為什麼安全退出很重要

Claude 被訓練成樂於助人且有韌性。當任務模糊,或工具回傳無益的錯誤時,Claude 可能會無限嘗試新的工具呼叫。在 CI/CD 環境中,沒有迭代上限的迴圈可以在一夜之間燒光 API 預算。沒有重複狀態偵測的迴圈,可能在兩個等效的工具呼叫之間來回震盪,直到 token 耗盡。

CCA-F 上的每個生產 agentic loop 都必須至少包含迭代上限加上一個額外守衛。考試將「加入迴圈迭代上限」視為基準安全要求;即使設計的其他部分無懈可擊,省略它的情境答案也是錯的。社群通過報告將此列為「差一點卻選錯」的高頻模式。 Source ↗

Tool Result 注入 — 以 tool_result 訊息回饋觀察結果

每次迴圈迭代的觀察階段,在機械上實作為附加一條新的 user 訊息,其 content 是一個 tool_result 區塊的陣列。訊息格式錯誤是考試中常見的實作層級陷阱。

tool_result 區塊的資料結構

每個 tool_result 區塊包含:

  • type: "tool_result"
  • tool_use_id — 對應前一條 assistant 訊息中對應 tool_use 區塊的 id
  • content — 代表工具輸出的字串或內容區塊陣列(文字、圖像)。
  • is_error — 可選布林值;true 表示工具呼叫以 Claude 應當回應的方式失敗了。

一條 user 訊息,多個 tool_result 區塊

當 Claude 在單一 assistant 訊息中發出多個 tool_use 區塊(並行工具呼叫)時,你的下一條 user 訊息必須在同一條訊息中包含所有對應的 tool_result 區塊——每個未回應的 tool_use_id 對應一個區塊。逐一發送或與新的使用者文字交錯,都會違反 API 合約。

錯誤作為結構化訊號

當工具失敗時,回傳 is_error: true,並在 content 中附上簡潔、可行動的錯誤字串。這告訴 Claude 工具呼叫未成功,並給它足夠的上下文來決定是否重試、切換到替代工具,或升級處理。結構化錯誤回應(在 content 中包含明確的 errorCategoryisRetryable 欄位)是 Domain 2 的模式,但它們的消耗發生在 agentic loop 的錯誤處理分支內。

assistant 訊息中的每個 tool_use 區塊,都必須在下一條 user 訊息中以恰好一個 tool_result 區塊(帶有相同的 tool_use_id)來匹配。缺少或不匹配的 ID 要嘛產生 API 錯誤,要嘛讓 Claude 靜默地困惑,重新發出相同的工具呼叫。在 CCA-F 上,任何在 tool_result 上省略 tool_use_id 欄位的答案都是錯的。 Source ↗

對話歷史成長 — 管理跨迴圈迭代累積的上下文

每次迴圈迭代至少附加兩條訊息到對話歷史(assistant 輪次與 user tool_result 輪次)。長時間執行的 agentic loop 因此會累積大量上下文——一個 30 輪迭代、帶有中等工具輸出的迴圈,輕易就能填滿數萬個 token。

歷史增長帶來的三種壓力

  1. 成本 — 每次後續的 API 呼叫,都要在新生成之上,為完整歷史支付輸入 token 的費用。
  2. 延遲 — 輸入處理時間隨上下文長度成比例增加。
  3. 注意力退化 — 超過一定規模後,Claude 會出現「迷失在中間」效應,中段上下文的資訊受到的加權少於首尾內容。

迴圈內部的緩解策略

  • 修剪冗長的工具輸出 — 若工具回傳一份五萬 token 的文件,在存入歷史前先摘要或擷取關鍵內容。
  • 清除已過時的 tool result — 較新的工具結果往往會取代較舊的;上下文編輯功能(Claude 4 的 beta 功能)可以刪除廢棄的結果。
  • 使用 subagent — 將高 token 消耗的子任務委派給擁有獨立隔離上下文的 subagent(涵蓋於任務 1.2 / 1.3)。
  • 壓縮 / 交接(Compaction / handoff) — 在某個檢查點,將迄今為止的迴圈摘要為結構化的狀態 blob,並開始新的 session。

這些技術在上下文管理主題(Domain 5)中有深入說明,但 agentic loop 的架構師必須知道它們的存在,以及何時使用。

迴圈中的並行性 — 循序工具呼叫 vs 並行扇出執行

當 Claude 在單一 assistant 訊息中發出多個 tool_use 區塊時,你有兩種執行選擇。

循序執行(Sequential Execution)

逐一執行每個工具呼叫,等待每個完成後再開始下一個。較簡單。當工具 A 的輸出作為工具 B 的輸入時,必須採用此方式。

並行執行(Parallel Execution)

同時執行所有工具呼叫。較快。當工具呼叫彼此獨立時(不同檔案、不同資料庫查詢、不同搜尋詞),可安全採用。

Claude 何時發出並行工具呼叫

現代 Claude 模型在能夠判斷呼叫彼此獨立時,會積極地並行化工具呼叫。一個查找四個主題的研究 agent,往往會在一條訊息中發出四個 tool_use 區塊。你的應用程式必須準備好並行執行它們,並在下一條 user 訊息中回傳所有四個 tool_result 區塊。

架構層面的含義

Agentic loop 並非嚴格的「每輪一個工具」。單一 assistant 輪次可能包含 N 個 tool_use 區塊,對應的 user 輪次必須包含 N 個匹配的 tool_result 區塊。將並行呼叫串列化成 N 個獨立輪次的實作,會浪費大量延遲,也違反標準模式。

Agent SDK 迴圈原語 — run()、stream() 與 process() 進入點

Claude Agent SDK(前身為 Claude Code SDK)提供自動化的 agentic loop,讓你不必每次都手寫 switch 陳述式。CCA-F 要求認識三個進入點以及各自的使用時機。

run() — 阻塞式全迴圈執行

run() 從頭到尾執行整個 agentic loop 並回傳最終結果。在你需要同步的「給我答案」形式、不需要中間事件時使用。最簡單。適合腳本化任務、批次工作和短暫的整合場景。

stream() — 增量事件串流

stream() 在迴圈推進時產出事件——assistant 文字片段、tool_use 提案、tool_result 附加、迴圈迭代邊界。在需要渲染部分輸出(聊天 UI)、對迴圈中途決策進行埋點,或在 agent 仍在工作時更新使用者介面時使用。

process() — 低階程式化控制

process() 暴露逐訊息的 hook,讓你注入任意的狀態轉換,並支援自訂的 agentic loop 架構(例如,在輪次之間暫停等待外部核准的迴圈)。在 run()stream() 對你的設計過於武斷時才使用。

自動化迴圈 vs 手動迴圈 — 取捨

SDK 的自動化迴圈幫你處理 switch 陳述式、tool_result 的建構和終止條件。代價是降低了對每輪決策的可見性,以及對非常規架構的靈活性。大比例的生產系統使用 run()stream(),從不觸碰 process()。直接對 Messages API 手寫迴圈,適合需要 SDK 隱藏掉的細粒度控制的場景——這在自訂的多 agent orchestrator 中是常見情況。

CCA-F 的情境題經常要求你在 SDK 進入點之間做選擇。決策規則:批次或非互動式工作選 run();有人正在等待增量輸出時選 stream();只有在其他兩者無法表達你所需的迴圈形態時,才選 process()。不問需求就預設選最低階原語,是設計壞味道——考試會扣分。 Source ↗

迴圈內部的錯誤處理 — 工具失敗時的重試、跳過或中止

在生產環境中,工具呼叫持續失敗:網路抖動、速率限制、過期憑證、工具輸入的邏輯錯誤。設計良好的 agentic loop 對每次工具失敗都有三種回應選項。

重試(Retry)

回傳帶有 is_error: truetool_result,並附上表示錯誤是暫時性的訊息(例如:「網路超時——1 秒後重試」)。Claude 通常會重新發出相同或略作調整的 tool_use。當底層條件預期會自行解決時,重試是合適的。

跳過(Skip)

回傳帶有 is_error: truetool_result,並附上表示該特定請求無法完成、但替代方案可能有效的訊息。Claude 接著會嘗試不同的方法。跳過適合特定資源的權限錯誤、特定查詢的格式錯誤輸入,或超出範疇的項目。

中止(Abort)

從應用程式端終止迴圈。適合不可恢復的錯誤(身份驗證完全失效、工具後端完全停機、關鍵守衛條件觸發)。

結構化錯誤分類

在每個 is_error: true 的回應中,搭配結構化的分類(transientbusinesspermissioninternal)和 isRetryable 布林值。這在形式上是 Domain 2 的模式,但其消耗發生在 agentic loop 的錯誤處理分支中。通用的錯誤字串會觸發 Claude 進入長時間的重試風暴;結構化錯誤讓 Claude 能做出正確的路由決策。

將工具錯誤以普通(非錯誤)文字字串回傳、不帶 is_error: true,是最常見的架構錯誤之一。Claude 會將非錯誤的 tool_result 內容視為合法的觀察資料,並可能在憑空捏造的事實上繼續規劃後續行動。請務必用 is_error: true 標記失敗,並保持錯誤訊息可行動化。 Source ↗

迴圈可觀測性 — 記錄 tool_use 和 tool_result 以便除錯

Agentic loop 在沒有埋點的情況下,出了名地難以除錯。每位 CCA-F 考生都應知道生產迴圈的最低可觀測性面向。

每次迭代應記錄的內容

  • 迭代索引 — 這是迴圈的第幾輪。
  • stop_reason — 驅動 switch 陳述式的訊號。
  • 每個 tool_use 區塊 — 工具名稱、輸入參數、tool_use_id。
  • 每個 tool_result 區塊 — tool_use_id、is_error、截斷的內容預覽、延遲。
  • Token 計數 — 每輪的輸入和輸出 token;累計總量。
  • 時間 — 每輪的掛鐘時間;累計掛鐘時間。

為什麼這些全都重要

當 agent 在生產環境中行為異常,第一個診斷動作是「Claude 在每個步驟決定做什麼?」tool_use 串流說的就是這個故事。tool_result 串流揭示了環境是否配合。Token 和時間計數揭示了成本和延遲的病徵。沒有這些資料,每次除錯工作都必須從零開始。

PostToolUse 和 PreToolUse Hook

Agent SDK 暴露了 PreToolUsePostToolUse hook,在每次工具執行前後運行。這是附加日誌、指標和策略檢查的乾淨位置。Hook 正式屬於任務 1.5 的主題,但它們的存在是 agentic loop 可觀測性面向的一部分。

白話說明

抽象的迴圈機制,一旦錨定在考生已經熟悉的具體情境上,就會變得直觀。以下三個類比涵蓋了 agentic loop 的完整面貌。

類比一:辦桌總鋪師 — 感知、推理、行動、觀察

想像一位正在辦桌場合忙碌的總鋪師。一張菜單進來(感知——「12 桌要上紅蟳米糕和白斬雞」)。總鋪師盤算所需(推理——「紅蟳要蒸,米糕要炊,雞要滷,醬料要拼盤」)。接著同時對各攤位下令(行動——這就是 tool_use 區塊)。片刻後各攤位回報進度、送回食材、反映狀況(觀察——這就是 tool_result 區塊)。總鋪師看看回報的情況,決定這道菜是否完成,還是需要再來一個步驟。整場辦桌宴席就是一個 agentic loop。tool_use 是總鋪師喊「蒸台把紅蟳送上來!」;end_turn 是他拍板「這桌上菜!」;max_tokens 是廚房中途鍋具不夠、被迫停工;stop_sequence 是東家說「晚上十一點前一定要收攤」。總鋪師從不會事先把每一道步驟完整寫下來——他一輪一輪地迭代,觀察每個攤位回傳的狀況。這正是 agentic loop 的形狀。

類比二:刑警偵查 — 認識論上的不確定性驅動迴圈

一名刑警接手案件時,手頭資訊有限——一個受害者、一個地點、一條時間線。他不可能一次就偵破案件,因為他還不知道自己不知道什麼。他追蹤一條線索(訊問目擊者、調閱通聯記錄、勘查現場),觀察回傳的結果,更新假設,再追蹤下一條線索。有時線索走到死路(is_error: true),他改換角度(跳過)。有時電話第一次打不通(暫時性失敗),他再打一次(重試)。調查結束於刑警確信已掌握答案(end_turn),或局長因加班費超支而喊停(迭代上限)。刑警不預先規劃每一個步驟;他根據觀察做反應。Agentic loop 就是一場偵查:Claude 是刑警,工具是偵查動作,你的應用程式是提供預算與規則的警察局。

類比三:導航 App 的路線重算 — 單次推論不足的原因

導航 App 說明了為什麼在世界可能改變時,agentic loop 勝過單次推論。一張紙本地圖(單次推論)在出發時給你一條路線,並假設整段行程不會有任何變化。即時導航 App(agentic loop)則在每個步驟重新計算:觀察你的當前位置(感知),決定下一個轉彎(推理),告訴你轉彎(行動),等待確認你是否真的轉了(觀察)。若塞車,它就重新規劃路線。若你錯過一個交流道,它就自動調整。若你抵達目的地,它說「已到達目的地」(end_turn)。若汽油耗盡(max_tokens),不管地圖多好,它都無法繼續導航。紙本地圖適合沒有不確定性的一次性查詢。即時導航 App——agentic loop——適合現實可能在每個步驟給你帶來驚喜的情況。CCA-F 中帶有驚喜的情境,幾乎總是需要迴圈,而不是單次呼叫。

考試當天選用哪個類比

  • 關於四階段循環的題目 → 辦桌總鋪師類比。
  • 關於為什麼需要迴圈的題目 → 刑警偵查類比。
  • 關於 agentic loop vs 單次推論的題目 → 導航 App 類比。

常見考試陷阱

CCA-F Domain 1 持續利用五種與 agentic loop 相關的反覆出現陷阱模式。全部五種都有社群通過報告記錄在案,並以合理的干擾選項形式出現。

陷阱一:把 end_turn 當成錯誤

end_turn 是 agentic loop 的正確、成功終止——它意味著 Claude 決定任務已完成,沒有更多要做的事。干擾答案將 end_turn 框架為「模型放棄了」或「迴圈失敗了」。兩種框架都是錯的。end_turn 是 happy path。

陷阱二:把 max_tokens 當成正常完成

迴圈中途的 max_tokens 是截斷訊號,不是優雅的完成。回應因輸出預算耗盡而被切斷。把 max_tokens 當成 end_turn——例如將截斷的內容作為最終答案回傳給使用者——會產生損壞的輸出。正確的處理方式是延長預算、請 Claude 繼續,或明確以錯誤中止。

陷阱三:tool_result 上缺少 tool_use_id

每個 tool_result 區塊都必須帶有與原始 tool_use 區塊匹配的 tool_use_id。描述 tool_result 注入但沒有 ID 欄位的答案是錯的。沒有 ID,API 會拒絕這條訊息,或 Claude 會因為看不到上一批呼叫已被回應而重複發出相同的工具呼叫。

陷阱四:生產迴圈沒有迭代上限

只在 end_turn 上終止的迴圈,對失控行為沒有任何防護。Agent 偶爾會卡在重複狀態的循環中,在兩個工具呼叫之間來回震盪,直到 token 耗盡或帳單暴增。每個生產 agentic loop 都必須有明確的迭代上限,加上理想情況下的掛鐘超時。省略上限的答案是不安全的。

陷阱五:run() 夠用時卻選 process()

CCA-F 對過度工程化扣分。批次模式的擷取 agent 應使用 run(),而不是 process()。渲染部分輸出的聊天 UI 應使用 stream(),而不是 process()process() 是為其他兩者無法表達的架構而設計的——自訂的暫停與恢復、外部核准閘道、新型的多 agent 形態。不問需求就預設選最低階原語,是設計壞味道。

練習錨點

Agentic loop 的概念在六個 CCA-F 情境中的兩個最集中出現。將以下內容視為情境叢集題的架構骨幹。

Customer-Support-Resolution-Agent 情境

在這個情境中,一個客服 agent 接收進入的工單,透過呼叫知識庫查詢工具、CRM 查詢工具和帳戶狀態工具來調查,並自主解決工單或升級給人工處理。Agentic loop 是骨幹:每次工具呼叫觀察不同的系統,而呼叫的順序無法事先規劃,因為它取決於每次查詢回傳的結果。預期會有題目測試你是否正確地在 stop_reason 上做分支,是否用 is_error: true 標記無法連線的後端,以及是否實作了迭代上限加上人工升級觸發。

Developer-Productivity-With-Claude 情境

在這個情境中,一名開發者使用 SDK 驅動的 agent 在大型程式碼庫上執行自主任務——bug 調查、多檔案重構、測試撰寫。Agent 在一個可能延伸至數十輪迭代的長迴圈中呼叫 Read、Grep、Glob、Edit 和 Bash 工具。預期會有題目測試 tool_result 注入的資料結構、訊息歷史管理(何時壓縮、何時 spawn subagent)、並行工具呼叫處理(Claude 會頻繁地扇出讀取多個檔案),以及正確的 SDK 進入點(腳本化批次用 run(),IDE UI 用 stream())。Multi-agent-research-system 情境也會練習 agentic loop,但主要重心轉移到任務 1.2(coordinator-subagent orchestration)。

FAQ — Agentic Loop 前六大問題

在 Claude 的語境下,agentic loop 究竟是什麼?

Agentic loop 是一個受控的迭代過程:反覆呼叫 Claude Messages API,將工具執行結果以 tool_result 訊息回饋,直到 Claude 回傳 stop_reason: "end_turn"(自然終止)或你的守衛條件觸發(迭代上限、超時、token 預算)。迴圈是單次聊天機器人與自主 agent 之間的結構差異。CCA-F Domain 1 幾乎全部圍繞著把這個迴圈做對,而所有後續的 Domain 1 模式(多 agent orchestration、subagent spawning、handoff)都是建構在它之上的延伸。

tool_use 和 end_turn 作為 stop_reason 值有什麼差異?

tool_use 表示 Claude 提出了一個或多個工具呼叫,正在等待你的應用程式(或平台)執行它們並回傳 tool_result 區塊;迴圈必須繼續。end_turn 表示 Claude 決定任務已完成,不再有進一步的行動要採取;迴圈退出,最後的 assistant 訊息就是答案。混淆這兩個值,是被引用最多的 CCA-F Domain 1 錯誤。正確的迴圈在機械上就是對 stop_reason 的 switch 陳述式:tool_use 繼續,end_turn 終止。

迴圈中途出現 max_tokens 的 stop_reason 該如何處理?

max_tokens 表示 Claude 的回應因觸及輸出預算上限而被截斷。這不是正常完成。三種回應選項:(1)提高 max_tokens 並重試上一次呼叫;(2)附加一條簡短的使用者「請繼續」訊息,讓 Claude 在下一輪完成;(3)若你的業務邏輯無法容忍截斷,以明確的錯誤中止迴圈。把 max_tokens 當成 end_turn——將截斷的內容作為最終答案回傳給使用者——是常見的架構 bug,在 CCA-F 上有直接考題。

何時應使用 Agent SDK 的 run() 而非 stream() 或 process()?

批次、非互動式、腳本化的 agent 執行,你需要單一「給我最終結果」的回傳值時,使用 run()。有人正在觀看且你需要呈現增量輸出時——聊天 UI、即時儀表板、IDE 整合——使用 stream()。只有在其他兩者無法表達你的迴圈形態時,才使用 process()——自訂的暫停與恢復模式、迴圈中途的外部核准閘道、非常規的多 agent orchestration。考試獎勵選擇最符合需求的最簡單原語;出於追求靈活性而預設選 process() 是設計壞味道。

如何防止 agentic loop 永遠跑下去?

至少實作兩個守衛:(1)硬性迭代上限(典型值 15–30 輪),無論 stop_reason 是什麼都強制退出迴圈;(2)從掛鐘超時、累計 token 預算、重複狀態偵測或人工升級觸發清單中再選一個額外守衛。單純依賴 end_turn 是不夠的,因為 Claude 偶爾會卡在等效工具呼叫之間震盪。CCA-F 將「加入迭代上限」視為基準安全要求;即使設計的其他部分無懈可擊,省略它的情境答案也是錯的。

如何在 agentic loop 內部將工具錯誤回饋給 Claude?

回傳 tool_result 區塊,其中 tool_use_id 匹配原始 tool_useis_error: true,以及在 content 中附上簡潔、可行動的錯誤訊息。理想情況下,錯誤訊息包含結構化的分類(transient、business、permission、internal)和 isRetryable 提示,讓 Claude 能決定是否重試、嘗試替代方案,或升級處理。不帶 is_error: true、以普通字串回傳工具失敗,是最糟糕的反模式——Claude 會將內容視為合法的觀察資料,並可能在憑空捏造的事實上規劃後續行動。

延伸閱讀

Related ExamHub topics: Multi-Agent Orchestration with Coordinator-Subagent Patterns, Task Decomposition Strategies, Session State, Resumption, and Forking, Agent SDK Hooks for Tool Call Interception.

官方資料來源