跳至主要內容
代理與自主

實務中的代理迴圈:ReAct、工具與失敗模式

作者
Huang Tzu LinFounder
發布日期
閱讀時間
約 19 分鐘
更新於
目錄
  1. 01本文不是什麼
  2. 02最小營運迴圈
  3. 03受限範例:建立完整行程表
  4. 04ReAct 作為參考模式,而非教條
  5. 05工具是介面合約
  6. 06觀察是環境回饋
  7. 07規劃器-執行器拆分及其適用時機
  8. 08重試是策略,不是反射
  9. 09提報和停止條件是設計的一部分
  10. 10代理迴圈中常見的失敗模式
  11. 無效的工具引數
  12. 錯誤的工具選擇
  13. 工具結果解析錯誤
  14. 過早合成
  15. 無新資訊的重複迴圈
  16. 缺失的提報
  17. 複合錯誤
  18. 11營運設計的實用指南
  19. 12為什麼這比代理品牌更重要
  20. 13橋樑:當基本 RAG 不再足夠
  21. 14來源附註

多數關於 agent 的工程討論,太早亮出 agent 這個詞,卻太晚才談營運迴圈。其實實務上真正重要的設計問題很簡單:模型一旦能執行不止一步,系統怎麼決定下一步做什麼?能呼叫哪些工具?可以從結果推斷什麼?又該在何時停下來?

這才是從架構概念走向營運代理設計的關鍵轉變。一個有用的迴圈不需要什麼宏大的自主性理論,它需要的是一個受限循環——檢視當前狀態、選擇下一個動作、觀察結果,然後決定要繼續、提報還是停止。迴圈定義模糊,系統就會以模糊的方式壞掉;迴圈定義明確,系統就能測試。

本文聚焦在這個迴圈。我們會用 OptiVerse Travel 的旅遊規劃 Copilot 作為貫穿範例,並緊貼正式環境的關注點:工具合約(tool contract)、觀察處理、重試行為、提報規則和失敗模式。這裡的目標是營運迴圈設計,不涉及更廣泛的系統治理或可稽核性。

第五篇建立了自主性光譜(autonomy spectrum),也引入核准邊界(approval boundary)作為設計概念。本文把那套框架付諸實踐:一旦系統具備受限的模型引導控制,執行時期的迴圈長什麼樣子?它又怎麼失敗?

互動圖解

重點代理迴圈只有在「有邊界」時才有用。停止條件不是事後補上的安全措施,它就是設計本身。

  1. 檢視任務狀態

    目標是什麼、已經做了什麼、上一次回傳什麼?從真正的任務狀態讀取,而不是從一份越來越長、每次都要重新推導的逐字稿。

  2. 選擇下一個動作

    從白名單中選出一個工具呼叫與參數。每次迭代只做一個動作,軌跡才讀得懂、每個決策才歸屬得清楚。

  3. 呼叫核准工具

    對白名單執行。模型只能指名工具,不能憑空生出工具。任何有真實後果的動作,執行前一律停下來等核准。

  4. 觀察結構化結果

    把結果——包含錯誤——以固定格式記錄下來。錯誤是要拿來推理的觀察,不是可以吞掉的例外。

  5. 驗證或修正

    這一步有讓目標前進嗎?依任務定義驗證,而不是依模型自己的信心,然後更新狀態。

  6. 停止或上報每次迭代都檢查

    每一輪都要問:完成了嗎、預算用完了嗎、卡住了嗎?三者皆非才繼續迴圈。這個節點正是「代理」與「失控程序」的分界。

停止條件

  • 目標達成

    符合任務定義並通過驗證。回傳結果與完整軌跡。

  • 預算用盡

    達到迭代上限、token 預算或時間限制。誠實回報進度並停止,而不是繼續花錢。

  • 沒有進展

    連續 N 次迭代狀態沒有前進。重複是上報的訊號,不是「再試一次看看」的理由。

  • 需要核准

    下一個動作超過影響門檻。暫停、呈現計畫、等待人來決定。

這個迴圈要攔下的失效模式

  • 來回打轉

    同樣兩個動作無限交替。要靠跨多次迭代的「無進展偵測」抓到,單步檢查看不出來。

  • 目標漂移

    代理開始最佳化自己發明的子目標,悄悄放棄原任務。要靠每輪都對照原始定義驗證才抓得到。

  • 吞掉錯誤

    工具失敗,模型用文字繞過失敗,迴圈就建立在虛構上繼續跑。要靠把錯誤變成必須處理的結構化觀察來攔下。

  • 無聲的範圍擴張

    每個動作單獨看都低於核准門檻,加總起來卻遠遠超過。要靠累計影響編列預算,而不只看單次動作。

這不代表
  • 代理迴圈可以在沒有明確停止規則的情況下運行。
有用的代理迴圈不是自由發揮,而是有明確停止條件的行動、觀察與修正循環。

本文不是什麼

這不是一篇討論「何時選代理、何時選工作流程」的文章——那個決策框架在第五篇已經涵蓋了。也不是關於進階基礎化(grounding)或工作記憶(working memory)的文章,那些留到第七篇。更不是完整的正式環境治理或可稽核性討論,那屬於第十篇。本文聚焦的是營運機制:迴圈結構、工具合約(tool contract)、觀察處理、重試策略和停止條件。

最小營運迴圈

多數代理式系統的核心是一個簡單的模式:

  1. 檢視當前任務狀態(task state)

  2. 選擇下一個動作

  3. 透過工具或受控生成步驟執行

  4. 觀察結果

  5. 修改計畫或停止

這就是推理-行動-觀察迴圈(reason-act-observe loop)的實務核心。模型不是什麼神奇的自主工作者——它參與的是一個與外部環境互動的受控循環。這個環境包括工具、檢索到的文件、驗證檢查和明確的系統狀態。

為什麼這個迴圈重要?因為每一步都會改變下一步的走法。單次回應的助理只能從當前上下文產出答案。迴圈系統就不同了——它可以收集證據、偵測缺口、調整路徑,也可以判斷自己不該繼續。

話說回來,這不代表每個系統都該做成代理式。許多正式環境的任務用確定性流程處理反而更好。但當完成任務的路徑取決於中間觀察時,固定工作流程就開始力不從心了。這正是代理迴圈(agent loop)派上用場的地方。

受限範例:建立完整行程表

來看 OptiVerse Travel Copilot 的一個具體任務:

建立一個 10 天的日本無障礙行程,適合櫻花季——四口之家、輪椅使用者、$13K–$15K 預算(JPN-2026-0417)。

為什麼這適合代理迴圈?因為系統無法事先知道哪些航班、飯店或鐵路選項是可用的。它可能得檢查航班庫存、檢視飯店無障礙詳情、驗證鐵路通票涵蓋範圍,然後判斷計畫是否夠完整,可以呈現給客戶。

迴圈的受限版本大致如下:

  1. 搜尋偏好出發日期飛往東京的航班可用性。

  2. 審查回傳的選項——偏好日期是否已售罄?無障礙座位是否不可用?

  3. 如果偏好日期售罄,擴大搜尋至鄰近日期,檢查價格和無障礙契合度。

  4. 將可行的航班日期與目標城市輪椅無障礙房間的飯店可用性比對。

  5. 飯店日期與調整後的航班衝突?調整飯店區段,重新驗證可用性。

  6. 檢查 JR Pass 對計畫新幹線路段的涵蓋範圍——Nozomi 不包含在基本 JR Pass 中(2023 年 10 月起可另購補充票,但會增加費用),因此系統預設切換至 Hikari 或 Sakura 列車服務並調整轉乘時間,同時將 Nozomi 補充票標記為替代方案供顧問參考。

  7. 重新檢查總預算是否符合 $13K–$15K 限制。證據充足就呈現修訂後的行程表,附上取捨說明。在允許的搜尋次數之後計畫仍超預算或有未解決衝突?停止並提報。

讓它成為代理迴圈的關鍵,不是步驟數量,而是下一步取決於前一步的環境回饋。系統不是在照劇本走,而是在受限任務內做修正。

ReAct 作為參考模式,而非教條

ReAct 模式是一個有用的參考框架。它的核心貢獻在於展示:模型生成的明確推理軌跡——以文字形式呈現——當與工具使用交錯時能改善動作品質。論文證明,模型在每個動作前先生成推理步驟,表現優於不加解釋就行動。至於與「光推理不行動」相比,結果並不一致:在 HotpotQA 上,單獨的 ReAct 分數低於思維鏈(chain-of-thought)提示,論文最強的結果來自兩者結合。這個發現把代理討論從單次提示推向了與外部環境的結構化互動。

關鍵在於推理與行動的交錯,不在於品牌。正式環境的系統不需要暴露冗長的思維鏈,也不需要模仿研究示範。真正需要的是同樣的結構紀律:

  • 模型應該有一組有限的允許動作

  • 每個動作應該產出結構化的觀察

  • 觀察應該更新任務狀態(task state)

  • 迴圈應該有明確的停止條件

有些系統裡,推理步驟是簡短的隱藏規劃狀態。另一些系統裡,它是明確的規劃器-執行器拆分——一個元件提議步驟,另一個在更嚴格的控制下執行。兩種都可以理解為推理-行動-觀察系統。

工具是介面合約

工具使用常被描述成模型「可以存取」搜尋 API、資料庫或程式執行器。這種說法太籠統了。更精確地說,工具是介面合約(interface contract)。

對代理迴圈(agent loop)而言,工具合約(tool contract)通常包括:

  • 工具名稱

  • 工具何時應該被使用的描述

  • 輸入 schema

  • 有效引數的約束

  • 結果格式

  • 錯誤格式

  • 迭代或權限限制

這些欄位不是行政瑣事——它們直接影響行為。工具描述寫得模糊,工具選擇就跟著模糊。Schema 太薄弱,呼叫就容易格式錯誤。結果格式不一致,觀察處理就變得脆弱。

假設旅遊 Copilot 有一個航班搜尋工具:

json
{
  "name": "search_flights",
  "description": "Search available flights by origin, destination, date range, and accessibility requirements.",
  "input_schema": {
    "type": "object",
    "properties": {
      "query": { "type": "string" },
      "date_range": { "type": "string" },
      "accessibility": { "type": "string", "enum": ["wheelchair", "none"] },
      "max_results": { "type": "integer", "minimum": 1, "maximum": 10 }
    },
    "required": ["query", "date_range"]
  }
}

即使是這麼小的 schema,也編入了重要的營運邊界。它告訴模型工具的用途、預期的欄位,以及單次呼叫允許的搜尋範圍。max_results 不受約束的話,迴圈可能浪費時間拉取太多選項。accessibility 沒有文件記載的話,模型可能隨意推測工具不接受的欄位值。

輸出端也一樣。如果工具有時回傳原始文字、有時回傳 JSON 物件、有時回傳模糊的錯誤字串,迴圈就很難控制。觀察處理在工具輸出跟工具輸入同樣結構化時效果最好。

觀察是環境回饋

observe(觀察)步驟是許多解釋開始變模糊的地方。觀察不是什麼神秘的內省——它就是環境回饋。

在營運系統中,觀察可能是:

  • 成功的工具結果

  • 驗證失敗

  • 缺少的欄位

  • 逾時

  • 存取控制拒絕

  • 低於門檻值的可用性信心分數

  • 未找到相符的航班或飯店的訊號

每一種結果都應該以不同方式影響下一步。

航班搜尋在鄰近日期回傳幾個可行選項?下一步可能是驗證飯店可用性。目標日期範圍回傳零結果?迴圈可能擴大一次搜尋視窗。飯店無障礙檢查回傳不完整的房間資料?迴圈可能換一間物件重試,或轉交真人顧問處理。合作夥伴預訂 API 的存取被拒絕?迴圈不該繼續用同一個被禁止請求的微小變體反覆嘗試。

所以觀察處理是系統設計的一部分,不只是提示工程的事。迴圈需要有策略地解讀不同類別的結果,否則模型只能從模糊的證據中自行臨場發揮恢復行為。

規劃器-執行器拆分及其適用時機

單一迴圈對緊湊的任務可能就夠了,但有些系統把規劃和執行分開會更好。在規劃器-執行器模式中,一個元件決定下一個子任務,另一個元件在更嚴格的控制下執行。

以旅遊 Copilot 為例,規劃器可能產出:

  1. 搜尋目標週飛往東京的航班,過濾輪椅無障礙座位

  2. 驗證符合日期區間內京都和東京的飯店可用性及無障礙設施

  3. 檢查計畫新幹線路段的 JR Pass 鐵路涵蓋範圍——預設使用 Hikari 或 Sakura 列車服務(Nozomi 需在基本通票外另購補充票)

  4. 僅在航班、飯店和鐵路全部符合 $13K–$15K 預算和無障礙約束時才進行合成

執行器接著透過工具執行每一步,紀錄觀察結果。這種拆分可以提高清晰度——執行元件不需要每一輪都重新想出整個策略,只要完成下一個受限的動作就好。

不過代價是複雜性。規劃器-執行器系統多了一層介面、多了一個狀態表示,也多了一個錯誤可能累積的地方。許多團隊太早加入這種分離。更穩健的做法是從最小迴圈開始,只在任務結構明確受益時才拆分角色。

重試是策略,不是反射

工具一旦進入迴圈,故障就是家常便飯。預訂 API 可能逾時、飯店可用性檢查可能對某間物件失敗、工具呼叫可能因為模型傳了錯誤的欄位而被拒絕。設計問題不在於故障會不會發生,而在於哪種故障值得重試。

重試應該有選擇性,而且有上限。

旅遊 Copilot 的一個合理策略:

  • 工具呼叫因格式錯誤的引數失敗,且修正很明顯?重試一次

  • 原始航班搜尋在偏好日期回傳零結果?用更寬的日期區間重試一次

  • 工具報告 no availability(無可用性)?不要無限重試

  • 存取拒絕的操作?不要重試,除非工作流程包含人類核准路徑

  • 重複嘗試不再帶來新資訊?停止重試

你可能會想:多搜幾次不是更認真嗎?其實不然。重複的工具使用可能製造勤奮的假象,實際上卻在累積錯誤和成本。一個搜了五次、每次微調日期範圍卻從來沒改過約束條件的迴圈,不是在推理,是在拖延。

有些代理系統會在失敗步驟後加入反思性修正。當失敗中包含可據以行動的回饋時,這是有用的。但恢復迴圈仍然需要設限。一個總是想「再修正一次」的系統,可能會無止境地飄移。

提報和停止條件是設計的一部分

實用的迴圈不只需要成功路徑,也需要明確的出口。

三個最重要的出口:

  • complete(完成):任務有足夠的證據來產出請求的輸出

  • abstain(拒答):任務無法用可用的證據和權限可靠地完成

  • escalate(提報):任務需要人類審查、核准或解讀

這些結果應該在設計階段就規劃好,不是到最後一刻才臨時拼湊。

旅遊 Copilot 的停止條件可能包括:

  • 航班、無障礙飯店和鐵路選項全部在預算和日期區間內對齊?停止並合成

  • 搜尋預算用盡後仍找不到可行的航班和飯店組合?停止並拒答

  • 飯店無障礙資料模糊或矛盾,無法僅靠工具查詢解決?提報

  • 任務需要發出預訂、對客戶信用卡收費或覆蓋旅遊警示?提報

  • 迴圈超過最大工具呼叫次數或延遲預算?停止

值得注意的是,這些條件結合了證據充足性、風險和營運預算。系統不只可能因為出錯而失敗,也可能因為花太久、成本太高或超越權限邊界而失敗。

代理迴圈中常見的失敗模式

一旦引入迴圈,故障就從孤立變成連鎖的。一個錯誤的觀察可能扭曲下一個動作,一套薄弱的重試策略可能產出代價高昂的螺旋。以下是幾個最常見的失敗模式:

無效的工具引數

模型用錯誤的欄位名稱、錯誤的型別或不可能的參數組合來呼叫工具。嚴格的 schema 有幫助,但無法完全消除問題。系統仍然需要引數驗證,以及驗證失敗時的明確回應路徑。

錯誤的工具選擇

迴圈在該查飯店可用性的時候卻去搜航班,或在驗證基本航班是否可預訂之前就去查鐵路涵蓋範圍。這通常源於工具描述寫得不好,或提示詞過度強調行動而非證據收集。

工具結果解析錯誤

即使工具呼叫是正確的,觀察被錯誤解析也會在下游出問題。比如迴圈把空陣列誤讀為硬故障,或忽略結果中的可用性信心分數,下一步就可能走偏。

過早合成

這是最具破壞性的失敗模式之一。迴圈只收集了部分證據就急著生成一份漂亮的行程表——任務其實還沒有充分的基礎化。輸出看起來完成了,底層的證據軌跡卻薄弱或前後不一致。

無新資訊的重複迴圈

系統一直搜尋、重新檢查或調整日期,但狀態沒有任何有意義的改變。浪費 token、增加延遲,還可能誤導人以為迴圈正在「努力工作」。

缺失的提報

迴圈遇到模糊性或權限邊界,卻沒有正式的路徑來移交控制權。結果就是它一直嘗試解決一個應該交給人類審查的任務。

複合錯誤

航班搜尋或飯店驗證中的早期錯誤,一路傳播到規劃和合成階段。因為後續步驟依賴先前的觀察,迴圈系統可能把一個小錯誤放大成一份具有誤導性的最終行程表。

這些失敗模式不是反對代理迴圈(agent loop)的論點,而是支持紀律化迴圈設計的論點。

營運設計的實用指南

如果你正在從代理概念走向實作,幾條設計規則就能幫上不少忙。

第一,保持動作空間小。模型只該有實際需要的工具。多餘的工具只會增加模糊性和出錯的可能性。

第二,讓工具 schema 嚴格、輸出結構化。介面應該在執行前後都容易驗證。

第三,把觀察以明確的任務狀態(task state)儲存,別讓模型從原始對話中重建歷史。這讓迴圈更容易檢視,也減少意外的偏移。

第四,區分可恢復的故障和終端故障。格式錯誤的引數或許值得重試一次。存取控制拒絕通常不值得。

第五,及早定義停止條件。證據門檻值、最大迭代次數、延遲預算和核准邊界(approval boundary)應該是初始設計的一部分。

第六,把迴圈當成一個系統來評估。光問最終答案聽不聽起來合理是不夠的。你需要檢視軌跡:呼叫了哪些工具、回傳了什麼觀察、哪裡發生了重試,以及迴圈是否該更早停止。

為什麼這比代理品牌更重要

團隊常花太多時間爭論一個產品「算不算」代理,花太少時間規定迴圈合約。這是本末倒置。

從工程角度來看,有意義的問題是營運性的:

  • 模型可以自行做什麼決定

  • 它可以呼叫什麼工具

  • 它會收到什麼觀察

  • 步驟之間保留什麼狀態

  • 什麼觸發重試

  • 什麼觸發提報

  • 什麼強制停止

這些問題對可靠性的影響,遠大於架構上的標籤。一個動作空間窄、工具合約(tool contract)乾淨、停止規則明確的適度系統,通常會贏過一個規格不足的宏大迴圈。

橋樑:當基本 RAG 不再足夠

一個簡單的推理-行動-觀察迴圈,通常足以檢索證據、檢視結果並產出有根據的答案。但有些任務會打破基本檢索背後的假設。系統可能需要在多個步驟中對更大的證據封包進行推理,或者維護一組包含文件和中間發現的工作集,又或者在即時檢索與為當前任務組裝的較長期上下文之間取得平衡。

這就是下一個設計層次浮現的地方。代理迴圈(agent loop)是這個問題常出現的場景,但不是唯一的場景。換句話說,一旦反覆的調查工作需要一個穩定的案件資料封包,而不是每輪都跑一次全新的 top-k 檢索,你就得認真思考混合基礎化(hybrid grounding)、工作記憶(working memory),以及標準 RAG 何時不再能提供夠穩定的上下文。

這就是通往下一篇的橋樑。我們會探討當簡單的 RAG 不再足夠時會怎樣,以及為什麼當系統需要反覆推理相同的證據——而不只是擷取它——混合檢索和工作記憶模式(working memory pattern)會變得不可或缺。


來源附註

本文參考以下主要與官方來源:

  • Yao, S., Zhao, J., Yu, D., et al. "ReAct: Synergizing Reasoning and Acting in Language Models." 交錯推理、行動與觀察的核心參考。arxiv.org/abs/2210.03629

  • Schick, T., Dwivedi-Yu, J., Dessi, R., et al. "Toolformer: Language Models Can Teach Themselves to Use Tools." 關於學習式工具使用決策的參考。arxiv.org/abs/2302.04761

  • Shinn, N., Cassano, F., Berman, E., et al. "Reflexion: Language Agents with Verbal Reinforcement Learning." 關於不更新權重的有界文字回饋與修正迴圈參考。arxiv.org/abs/2303.11366

閱讀順序

打造 AI 系統

章節 06 / 07

你在這裡86%
  1. 01
  2. 02
  3. 03
  4. 04
  5. 05
  6. 06
  7. 07
分享這篇文章
XLinkedIn

Huang Tzu Lin

With over eight years in autonomous robotics, there's a strong passion for incorporating cutting-edge technologies and innovative approaches. Dedicated to transforming the latest research and insights into practical applications, this journey pushes the limits of possibility.

透過 RSS 訂閱

使用慣用的 RSS 閱讀器追蹤最新的 AI 系統技術文章。

開啟 RSS Feed

支援任何 RSS 閱讀器,新文章將自動送達。

回到頂端