跳至主要內容

bounded AI agent loop orchestration state machine

實作

Agent 迴圈與任務協調:進度、預算與停止條件

實作外部狀態機,加入預算、檢查點、重複偵測、終止狀態與唯讀研究工作的轉交人工資料包。

難度
進階
預估時間
150 分鐘
更新日期
2026-10-02
文案複核
speak-human-tw
兩輪
本課內容
  1. 01先把定義說清楚
  2. 02現場情境
  3. 03實作範例
  4. 04照著做,每一步都有檢查點
  5. 05實務脈絡
  6. 06動手實作
  7. 07故障診間
  8. 08正式上線前的邊界
  9. 09資料來源與主張限制

這一課會完成什麼

  • 迴圈狀態與狀態轉移規則不得藏在對話文字
  • 用確定性的程式碼執行步驟、時間、成本、重試與外部操作預算
  • 從已記錄觀察紀錄偵測重複操作與沒有進度
  • 保存檢查點;每個非成功終止狀態都產出可用轉交人工資料包

開始前先準備

  • • 模組 02 到 05 的實作產出
  • • 能用模擬時鐘與注入的工具失敗測非同步程式碼

先把定義說清楚

迴圈與任務協調

Agent 迴圈每輪從應用程式狀態組成模型脈絡,請模型提出一個有型別的下一步。程式驗證權限與預算後執行工具、保存觀察結果,再由狀態機決定如何往下走。模型能在允許的範圍內換路徑,完成條件與停止權仍由程式掌握。這一層也要偵測重複操作、限制重試,並在中斷時保存檢查點,讓接手的人知道已完成什麼、還缺什麼,以及能否安全恢復。

單次模型呼叫能避開的風險,到了迴圈會集中出現:假設一路累積、操作重複、成本成長、進度停住,以及中斷後留下 partial 操作效果。多跑一輪不代表多一分價值。

對話紀錄能告訴操作人員模型說了什麼,卻不能可靠回答哪些工作已完成、哪個上限停掉執行、恢復是否安全。這些答案必須落在明確狀態、操作台帳與停止原因。

現場情境

Northstar evidence loop

具名合成情境,沿用模組 00 的 Northstar。工具觀察紀錄、成本、上限與執行軌跡都是測試資料,不是正式環境量測。

負責人
你要實作季度競爭對手治理研究的唯讀迴圈。
要做的決策
在模型選擇的讀取操作外面定義狀態機與確定性的停止規則。
目前狀態
模型可透過模擬工具搜尋已核准的領域、讀證據,並把競爭對手標成已涵蓋或缺漏。原型直接問模型是否完成;呼叫含糊時就一直重試,沒有機器可讀的終止原因。
預期成果
成功時交完成證據台帳;預算、逾時、沒有進展、工具重試用盡、規則拒絕與需要審查的各有可恢復的或終止資料包。

限制條件

  • • 最多 8 個模型步驟、90 秒、USD 1.00 估算可變成本;每個工具最多 2 次暫時故障重試。
  • • 沒有寫入、發布、對外聯絡、登入或無限制的瀏覽。
  • • 4 個競爭對手各需要 2 筆目前證據,或 1 個明確證據缺口,才算完成。
  • • 已標準化的操作連續 2 次相同,且觀察紀錄沒改變,就觸發 non_progress。

實作範例

第 3 次相同搜尋不執行,直接停止花費

證據類型: 具名模擬情境

模型為競爭對手 Orion 呼叫 search_domain,query 是「enterprise governance」(企業治理)。工具連續 2 次回相同的 2 個不相關 URL;模型第 3 次又提出相同呼叫,沒有改查詢、來源或計畫。

協調器雜湊已驗證的操作,對照最近觀察紀錄摘要值。第 2 組未變配對出現後,狀態在第 3 次派送執行前轉為 non_progress。轉交人工資料包包含目標、涵蓋表、嘗試的查詢、2 次觀察紀錄、剩餘預算與操作人員可選動作。

測試資料證明程式庫工具只跑 2 次,第 3 個請求沒有執行,成本費用核算同時停止,停止原因可由程式讀取。這個啟發式判準不能抓出所有只換句話說的反覆打轉的推理。

主張限制

雜湊比較能抓完全相同或標準化後相同的動作,未必抓得到換句話說的相同意圖。費用估算也可能落後供應商帳單。長時間工作另需持久佇列、租約、並行控制與完整復原設計。

做法

照著做,每一步都有檢查點

有上限的研究 agent 狀態機,包含決定、驗證、執行、觀察、檢查點、完成、沒有進展、逾時、預算、規則、工具失敗與人工審查。

現場情境

在模型選擇的讀取操作外面定義狀態機與確定性的停止規則。

  1. 01定義狀態與必須成立的條件
  2. 02包住決策呼叫
  3. 03執行前後都保存檢查點

驗收條件

一個決策路徑可變,但上限、證據要求、狀態、復原與終止行為都確定性的、可檢查的動態調整的讀取迴圈。

這張圖要幫你看懂什麼用由版本控制管理的確定性的狀態機與附註解的順序執行軌跡,清楚標出狀態、防護、檢查點、重試與停止原因。
  1. 01

    定義狀態與必須成立的條件

    列出可變狀態、合法轉移、完成所需證據與停止原因。由程式檢查預算和權限,把這些規則留在下一步操作提示詞外,避免模型自行改動上限。

    檢查點 · 每個狀態轉移只有 1 個程式碼負責人;4 筆涵蓋程度紀錄未全數通過前不能 completed。

  2. 02

    包住決策呼叫

    把目前狀態摘要交給轉接層,只取 1 個有型別的操作。派送執行前驗工具 name、參數、權限與剩餘預算。

    檢查點 · Unknown 或禁止操作轉 policy_denied,永遠不進工具實作。

  3. 03

    執行前後都保存檢查點

    執行前保存操作計畫與冪等鍵,帶期限及有限重試呼叫工具。完成後再保存觀察、成本與證據涵蓋的變化,讓中斷後能按正式紀錄接續。

    檢查點 · 中斷測試資料可恢復,既不丟觀察紀錄,也不重做 completed 操作。

  4. 04

    偵測沒有進展

    標準化操作/觀察紀錄摘要值。兩者都重複才增加 unchangedPairs;新證據或計畫改變就歸零。

    檢查點 · Orion 測試資料只做 2 次搜尋,擋下第 3 次完全相同的派送執行,終止於 non_progress。

  5. 05

    每種停止都序列化

    資料包包含目標、停止原因、completed 工作、缺漏證據、嘗試的操作、上一個錯誤、版本、支出估算與安全可選動作。

    檢查點 · 成功與 6 個非成功測試資料都足以讓操作人員關閉、修改或恢復,不必讀原始推理。

實務脈絡

展示版之後

G1

實作拆解

控制器每輪依序讀狀態、檢查停止條件、取得有型別操作、驗規則及預算、預留操作額度、執行、保存觀察,再更新涵蓋程度。各步完成與否由程式判定。狀態轉移記下起點、終點、原因、版本與時間,非法轉移直接拒絕。操作人員便能判斷目前卡在決策、執行或等待審查,程序崩潰後也找得到接續檢查點。

控制器同時限制 maxSteps 為 8、總時間 90 秒、USD 1.00、每個工具最多 2 次暫時故障重試,以及資料大小和操作次數。派送前先預留最壞情況下可接受的費用;額度不足就回 budget_exhausted。執行後把估算與供應商回報用量對帳,差距過大就調估算器。這些數值只適用 Northstar 合成案例,其他服務要另訂上限。

沒有進展的偵測,要一起比較標準化操作與觀察結果。同一查詢找到新證據時不該停;查詢換字卻反覆拿到無關 URL,則需檢查證據涵蓋是否增加。每種停止都附轉交人工資料包,列完成與缺漏工作、最後有效檢查點、剩餘預算、近期錯誤及允許選項,讓值班人員能結案、修訂或恢復。

G2

營運檢查

為每個終止原因寫一個操作手冊條目。完成要說明證據覆蓋如何驗證;沒有進展要列重複動作與仍缺的證據;預算用盡要附已花估值與未完成範圍;逾時要指出最後安全檢查點;工具用盡要列嘗試次數與最後錯誤;政策拒絕要保留被拒動作但不暴露秘密;需要審查則建立有期限的待辦。這些資料由狀態與事件組成,不要再請模型自由摘要。值班人員看封包就能決定關閉、縮小問題、補權限或從檢查點恢復。

測試迴圈時,成功案例反而只占一小部分。要在每次持久化前後注入程序中斷,讓工具回逾時、格式錯誤、相同結果與暫時故障,並讓模型提出未知工具、超額動作或重複查詢。每個案例檢查實際工具次數、費用保留、狀態版本、終止原因與恢復後的效果數量。若某個失敗只能靠閱讀模型長篇輸出才看懂,就補事件欄位;若恢復是否安全仍取決於猜測,表示效果帳本或冪等設計不足,不能用更多重試補救。

G3

驗證與上線

動作驗證器要用狀態而非只有格式做判斷。相同搜尋在第一輪可能合理,已有兩筆相同觀察後就該被視為沒有進展;某個讀取工具在一般狀態允許,接近費用上限時則應拒絕。驗證結果保存允許或拒絕原因、估計成本與當下版本,模型收到精簡錯誤,操作員可從追蹤看到完整政策。如此才能在規則更新後重播舊案例,確認決定是因何改變。

工具重試由控制器執行,模型只看到最終觀察。每次嘗試沿用同一邏輯動作識別碼,另有嘗試序號;逾時後若完成狀態未知,先查效果帳本或服務端結果,再決定是否重送。對只讀搜尋仍要限制重試,避免故障時造成後端壓力與費用放大。兩次暫時錯誤用盡後,終止為工具耗盡並提供可恢復檢查點,不再讓模型換句話繼續試。

覆蓋狀態要比自然語言進度更嚴格。四個競爭者各有目前證據識別碼、來源日期、缺口旗標與驗證結果;新增段落只有通過權限、時效與引用檢查才算進展。模型說『已完成 Orion』不會改狀態。當四筆紀錄都各有兩份有效證據,或一個明確缺口,控制器才能完成。這也讓升級封包直接顯示哪一格缺資料,而不是請值班人員從摘要猜。

上線前用固定時鐘把邊界一次踩完:第八步前成功、第八步仍缺證據、九十秒剛到、費用預留將超過一美元、第三次相同動作、禁止工具、兩次暫時錯誤,以及人工審查中斷。每個案例檢查沒有超限呼叫、狀態只遷移一次、費用與證據不遺失、封包內容足夠。邊界條件若只有大於或小於寫錯,正式流量就可能多執行一個昂貴或未授權動作。

G4

補強練習

每個工具另設單次與整個執行的呼叫上限。搜尋工具即使每次都換查詢,總次數到上限仍停止;讀取工具若反覆打同一來源,先查快取與證據帳本。這能抓到文字不同、實際工作卻重複的迴圈。

租約與並行控制要避免兩個工作程序同時恢復同一工作。取得租約時記擁有者與到期時間,狀態更新檢查版本;失去租約的程序不能再寫觀察或效果。測試在租約交接邊界讓兩個程序競爭,最後只能有一條合法遷移。

追蹤畫面按狀態遷移排列,不用把模型全文當時間線。每一列顯示步數、選定動作、驗證結果、工具結果、覆蓋增量、費用與剩餘預算。操作員一眼就能找到第一次沒有進展的位置,再決定改查詢、補來源或關閉。

模型或工具版本改變後,七種終止固定資料全部重跑。成功率變高仍要檢查非進展、預算與政策案例沒有退化;若新模型比較會換句話繞過重複雜湊,就新增語意覆蓋檢查,不能移除原本停止規則。

G5

交付前最後檢查

完成狀態也要產出稽核封包,列四個對象的證據或缺口、最終花費、工具次數與版本。成功不能免除可追溯性;否則團隊只看得到失敗為何停,卻無法證明成功確實符合事前完成條件。

G6

延伸實作

營運報表按終止原因追蹤數量與後續處置。沒有進展增加時,抽查查詢與來源;預算用盡增加時,拆模型、工具與重試;政策拒絕增加時,確認是攻擊、提示退化或新需求超出範圍;需要審查增加時,檢查證據是否足以讓人決定。每個原因都連到一個可以修的元件。若團隊只看完成率,控制器成功擋住的危險行為可能被誤認成品質下降,真正的重複與浪費也會藏在成功結果裡。

動手實作

建立 Northstar 迴圈控制器

把模擬下一步操作轉接層接到搜尋/讀取測試資料,證明成功、沒有進展、逾時、預算用盡、規則拒絕與重試次數用盡都有正確結果。

準備項目

  • • 沿用模組 03 的正式可信的工作與操作效果。
  • • 離線測試使用模擬時鐘與確定性的成本估算器。
  • • 工具維持唯讀,每個操作先過允許清單。
  • • 完成版在工具執行前後都要保存狀態。

本課產出

有型別的狀態機、迴圈控制器、模擬操作轉接層、2 個讀取工具、預算費用核算、repetition 偵測器、檢查點儲存區、7 個終止測試資料與轉交人工序列化器。

起始模板: Bounded loop state machine

TypeScript
type Terminal = "completed" | "non_progress" | "budget_exhausted" | "timed_out" | "tool_exhausted" | "policy_denied" | "review_required";
type LoopState = {
  runId: string;
  status: "ready" | "deciding" | "executing" | Terminal;
  step: number;
  startedAtMs: number;
  estimatedCostUsd: number;
  coverage: Record<string, { evidenceIds: string[]; gap: boolean }>;
  lastActionHash: string | null;
  lastObservationHash: string | null;
  unchangedPairs: number;
};

const limits = { maxSteps: 8, maxWallMs: 90_000, maxCostUsd: 1.00, maxRetries: 2 } as const;

function shouldStop(s: LoopState, nowMs: number): Terminal | null {
  if (Object.values(s.coverage).every((x) => x.gap || x.evidenceIds.length >= 2)) return "completed";
  if (s.unchangedPairs >= 2) return "non_progress";
  if (s.step >= limits.maxSteps || s.estimatedCostUsd >= limits.maxCostUsd) return "budget_exhausted";
  if (nowMs - s.startedAtMs >= limits.maxWallMs) return "timed_out";
  return null;
}

預期結果

一個決策路徑可變,但上限、證據要求、狀態、復原與終止行為都確定性的、可檢查的動態調整的讀取迴圈。

留給下一課

保留迴圈狀態、終止分類規則、轉交人工資料包與執行軌跡測試資料;模組 07 會用它當單 Agent 基準版本。

驗收條件

  1. 017 個終止測試資料都在已設定的步驟與時間上限內結束。
  2. 02禁止或超出預算的操作都不能進工具實作。
  3. 03重複查詢測試在 2 組未變配對後,阻止第 3 次完全相同的操作。
  4. 04每個檢查點都能恢復 1 次,不重複 completed 操作效果,也不丟成本/證據狀態。

常見故障

故障診間

F1Agent 一直搜尋,證據涵蓋程度卻沒增加。
先檢查
按回合比較已標準化的操作、觀察紀錄摘要值、新增涵蓋程度、查詢變更與剩餘預算。
可能原因
完成/沒有進展留給模型判斷,或迴圈沒記可量測的變化量。
修復方式
定義證據層級進度,擋未變操作與觀察配對,帶著目前缺口轉交人工。
下次怎麼避免
每個工具保留沒有進展測試資料與最大操作次數。
F2程序程序崩潰後恢復,工具呼叫又執行一次。
先檢查
查已規劃的/completed 操作效果、冪等鍵、租約與檢查點順序。
可能原因
Acknowledgement 後才存觀察紀錄,或根本沒有執行台帳。
修復方式
使用可持久保存的已規劃的/completed 操作效果,工具要冪等或可結果核對。
下次怎麼避免
在每個持久保存邊界注入程序崩潰,斷言只產生 1 個邏輯操作效果。
F3步驟少於 8,執行成本仍超過上限。
先檢查
逐步驟拆輸入、輸出、工具、重試、快取與平行呼叫成本,確認估算落後。
可能原因
預算只算回合,或派送執行後才檢查支出。
修復方式
執行前先預留估算成本;可能超過剩餘上限就拒絕。
下次怎麼避免
每種操作設上界限,執行後對帳估算與已計費成本。
F4操作人員只拿到失敗的,看不出安全的下一步。
先檢查
檢查停止原因、上一個合法檢查點、completed 操作效果、缺漏證據、錯誤與已授權操作。
可能原因
失敗處理只顧紀錄,沒有設計營運接續。
修復方式
序列化結構化轉交人工資料包,逐一映射結束、修訂或恢復可選動作。
下次怎麼避免
上線準備測試請實際值班人員角色審失敗資料包。

展示版之後

正式上線前的邊界

  1. 01目標、進度、核准、操作效果、預算與終止狀態存可持久保存的應用程式狀態。
  2. 02每個提議的操作都驗工具、參數、身分、規則與剩餘預算。
  3. 03設定最多步驟、總經過時間、可變成本、重試、操作次數與傳送資料大小。
  4. 04已規劃的/completed 操作效果用穩定冪等鍵檢查點。
  5. 05偵測重複操作、未變觀察紀錄、反覆打轉的委派與驗證持續反覆修改。
  6. 06執行軌跡包含狀態轉移、模型呼叫、已驗證的操作、工具結果、成本與停止原因。
  7. 07提供有人值守的轉交人工路徑、結構化脈絡與安全接續選擇。
  8. 08演練程序崩潰、逾時、供應商服務中斷、規則拒絕、預算用盡與人工故障切換。

證據類型

資料來源與主張限制

資料來源只支撐本課標示的主張,不代表換一個系統也會得到相同結果。

  1. [1]
    打造有效的 agent

    Anthropic · 官方文件 · 2026-08-20

    workflow 與 agent 的定義 · 架構模式 · 成本與控制的取捨
  2. [2]
    Orchestration and handoffs

    OpenAI · 官方文件 · 2026-08-20

    handoff · 把 agent 當成工具 · single-agent 基準
  3. [3]
    Guardrails 與人工審查

    OpenAI · 官方文件 · 2026-08-20

    審核中斷 · 可恢復狀態 · 工具層 guardrail
  4. [4]
    評測 agent workflow

    OpenAI · 官方文件 · 2026-08-20

    trace grading · 資料集 · 可重複的 eval 執行

延伸的 Tenten 資源

實作準備進正式環境時

帶著實作證據來,不用從空白摘要開始。

有效的實作審查,起點應該是任務測試資料、權限地圖、執行軌跡、評測報告、失敗案例與成本上限。Tenten 可以根據這些資料檢查整合與營運缺口,不必把課程裡已經證明過的決策全部重開。