← 部落格

智能體工作流工具串接:模式與陷阱

正在建構智能體工作流?失敗的原因很少出在模型本身。以下揭示工具串接、權限設定與協調編排在生產環境中實際崩潰的方式。

2 min read
智能體工作流工具串接:模式與陷阱

上週我統計了時間。在一個為期五天的衝刺開發中,我接線了一個代理流水線——七個工具、三個外部 API、一個程式碼沙盒、一個瀏覽器自動化層——我大約花了 14 小時在除錯上。其中十一個小時都耗在接線上。不是模型。不是提示詞。而是模型決定呼叫工具,到那個工具實際做出正確行為之間的空隙。

我們團隊 Slack 上有人問我:「Dora,原本不是說難點在於提示詞工程嗎?」八個月前確實如此。現在提示詞只要花一個下午。讓工具分派、授權範圍和故障恢復在真實負載下正常運作,卻要花掉整個星期。

如果你現在的狀態是:代理系統在 demo 中可以運作,但在生產環境中就會崩潰——工具靜默超時、重試迴圈耗盡你的 token 預算、模型無法解讀的權限錯誤——那麼接線就是你真正需要面對的工程問題。這篇文章記錄了我在這一層遇到的模式和故障模式,以及決定系統能夠恢復還是螺旋下墜的設計決策。

為什麼工具接線是難點

模型很少是瓶頸所在。 我追蹤過的大多數生產故障,根源都不在 LLM 的推理上。而是在模型決定呼叫工具之後發生的事情——分派、授權握手、回應解析、錯誤處理。Anthropic 自家關於打造有效代理的工程指南清楚地指出了這一點:擴增的 LLM 只是一個構建模組,真正的難點在於圍繞它的一切。

代理系統中「接線」的實際含義。 工具接線不只是「串接一個 API」。它涵蓋了整個層面:工具如何被發現、如何向模型描述、每個工具的權限如何界定、回應在被送回上下文視窗之前如何驗證,以及任何環節失敗時如何處理而不讓整個對話階段崩潰。Model Context Protocol 規範就是為了標準化這一層而設計的——工具發現、呼叫和結果格式化——因為每個團隊都在重新發明這套東西。

從 demo 到生產的常見誤解。 在 demo 中,你接了三個工具,模型正確地呼叫它們,感覺像魔法。在生產環境中,你才發現當有十五個工具時,工具描述會互相競爭注意力;參數 schema 需要極度精確,否則模型會幻想出參數;你原型中展示的「快樂路徑」可能只涵蓋真實呼叫的 40%。Anthropic 最近關於為代理撰寫有效工具的文章發現,即使是工具描述的細微改變——例如 Claude 是否在搜尋查詢後附加「2025」——都可能顯著降低效能。介面設計與模型本身同等重要。

生產工具編排的核心模式

靜態與動態工具介面。 靜態工具介面意味著模型在每次呼叫時看到相同的工具集。簡單、可預測、易於測試。動態介面則意味著工具根據對話上下文載入、過濾或生成——用戶角色、當前工作流步驟、已呼叫的內容。動態介面更靈活,但除錯難度大幅提升。我採用了混合方式:固定的核心工具集,加上由工作流狀態控制的條件性工具。

序列與並行工具分派。 序列分派很直接——呼叫工具 A,解析結果,呼叫工具 B。大多數早期代理系統都是這樣運作的。並行分派,即模型同時請求多個工具呼叫,可以降低延遲,但帶來了協調複雜性。LangGraph 的編排框架透過其基於圖的狀態管理支援這兩種模式,實際延遲的差異相當顯著——我在批次操作中測到了 3-4 倍的加速。但並行分派也意味著你需要處理部分失敗:當工具 A 成功而工具 B 超時時,該怎麼辦?

按工具類型進行權限控制。 並非所有工具都承擔相同的風險。唯讀資料庫查詢與可以刪除文件或發送電子郵件的工具,本質上截然不同。我將工具分為三個層級:唯讀(自動批准)、可回滾的寫入(記錄日誌、自動批准並審計)、以及破壞性/外部操作(需要明確確認)。NVIDIA 的 AI 紅隊發布的沙盒實務安全指南對此有很好的框架:強制性控制是網路出口限制和阻止工作區外的文件寫入。其他一切都是次要的。

沙盒化與隔離策略。 如果你的代理執行程式碼,就需要沙盒。不是 Docker 容器——容器共享宿主核心,對不受信任的 LLM 生成程式碼而言隔離程度不夠。生產環境的選項是 microVM(Firecracker、Kata Containers)、用於系統呼叫攔截的 gVisor,或嚴格用於可信程式碼的強化容器。我對大多數工具執行使用 gVisor。開銷是可以接受的。替代方案——發現 LLM 生成的 bash 命令在掛載的磁碟區上執行了 rm -rf——則不可接受。

預期會遇到的故障模式

工具呼叫迴圈與無限委派。 最昂貴的故障模式。模型呼叫一個工具,得到錯誤,用相同的參數重試同一個呼叫,得到同樣的錯誤,再次重試。沒有有限的重試預算,這種情況會持續到你觸及 token 上限或 API 計費門檻。我見過這種情況在授權失敗時尤其常見——模型一直重試一個永遠不會成功的操作。最低要求是設定 2-3 次的有界重試次數,並區分可重試與不可重試的錯誤。

輸出截斷破壞下游步驟。 超出上下文視窗的工具回應會被靜默截斷。模型隨後在不完整的資料上進行推理,卻不知道資料是不完整的。這在返回大型結果集的資料庫查詢中尤為棘手。我現在對每個工具回應強制設定硬性 token 上限——最多 25,000 個 token——並在結果被截斷時發送明確的分頁信號。

對話中途授權過期。 長時間運行的代理對話可能比 OAuth token 的有效期更長。工具在第一分鐘運作正常。到了第四十七分鐘,token 過期了,之後每個工具呼叫都會失敗。模型不明白為什麼。我目前還沒有找到優雅的解決方案——目前的做法是在分派前預先檢查 token 過期時間,並主動刷新。

沒有防護的破壞性命令。 擁有 shell 執行或文件系統工具存取權的模型,偶爾確實會生成破壞性命令。不是出於惡意——只是出錯了。AWS 關於工作流編排代理的規範性指南建議追蹤每個工作代理的執行狀態,並為任何影響生產系統的操作實施審批閘道。我同意這個觀點。任何可以寫入、刪除或發送的工具都應該有明確的確認步驟。

跨工具呼叫的速率限制級聯。 當一個工具觸及速率限制時,模型往往會立即再次嘗試呼叫它。或者呼叫另一個觸及相同底層 API 的工具。級聯效應可以在幾秒鐘內耗盡所有工具的速率限制。指數退避加上抖動是基線——不是針對每個模型,而是針對每個工具端點。

恢復與彈性模式

帶指數退避的重試邏輯。 從 1 秒開始,每次重試加倍,上限為 60 秒,加入隨機抖動。這不是可選的。沒有抖動,並行對話會同時重試,造成雷鳴群效應。先對錯誤分類:速率限制和 5xx 錯誤可以重試。授權失敗和驗證錯誤不行——再多重試也修不好錯誤的 API 金鑰。暫時性錯誤重試兩到三次。不可重試的錯誤重試次數為零。

檢查點與壓縮策略。 跨多個上下文視窗工作的長時間運行代理,需要一種持久化進度的方式。Anthropic 的工程團隊在他們關於長時間運行代理的有效框架的工作中記錄了這一點——關鍵洞察是使用進度文件配合 git 歷史,使新的上下文視窗能夠快速重建已完成的工作。我採用了類似的模式:在壓縮之前,代理寫入一個結構化的檢查點,總結已完成的步驟、待處理的步驟和已知的故障。下一個上下文視窗從讀取該文件開始,而不是猜測。

工具不可用時的優雅降級。 如果你的資料庫連接器停止運作,代理不應該崩潰。它應該識別故障,跳過那個步驟,繼續執行它能做的事情——或者告訴用戶它無法完成什麼。這需要設計工具介面時確保沒有單一工具成為整個工作流的硬性依賴。備用鏈很有幫助:主要工具失敗,運行更便宜或更簡單的替代方案。模型的指令應該明確涵蓋當工具不返回資料時應該怎麼做。

評估代理基礎設施

自建與採購:何時自己打造框架。 如果你的工作流是有 3-4 個工具、輸入可預測的線性鏈,自定義框架一天就能構建完成,比框架更容易維護。如果你需要動態路由、並行分派、跨對話的狀態持久化,以及人機協作的檢查點,從頭開始構建需要幾個月。這就是像 LangGraph 這樣的框架或託管平台發揮作用的時候。我從自定義開始。在第三次重新實作狀態檢查點之後,我遷移過去了。

生產就緒的關鍵信號。 你能回答這些問題嗎:工具呼叫超時時會發生什麼?工具呼叫日誌存儲在哪裡,你能查詢它們嗎?系統如何處理有效 JSON 但語義錯誤的工具回應?你能從檢查點重播失敗的對話嗎?如果這些問題中有任何一個讓你停頓,那麼系統還沒有準備好投入生產。

擴展之前應該基準測試什麼。 負載下每個工具呼叫的延遲。每種工具類型的錯誤率。每次對話的 token 消耗(工具回應是主要驅動因素)。當前流量 2 倍時的速率限制餘量。我忽視 token 消耗指標長達數週,當我真正測量時感到震驚——工具回應佔了我總 token 支出的 60%。

常見問題

代理 AI 系統中的工具接線是什麼?

工具接線指的是 LLM 與其可以呼叫的外部工具之間的完整整合層——包括工具發現、schema 定義、權限範圍、分派邏輯、回應解析和錯誤處理。它是決定模型「呼叫函數」的決策是否真正導致正確函數被正確呼叫的基礎設施。Model Context Protocol 的創建正是為了在不同 LLM 應用程式中標準化這一層。

如何防止代理工作流中的破壞性命令?

按風險等級對工具分層。唯讀操作可以自動批准。寫入操作應該記錄日誌並具備回滾能力。破壞性操作——任何刪除資料、發送外部通信或修改生產狀態的操作——應該要求明確的人工確認。將此與沙盒化(程式碼執行使用 gVisor 或 microVM)和預設阻止任意出站連接的網路出口控制結合起來。

在生產環境中處理工具呼叫失敗的最佳方式是什麼?

將錯誤分類為可重試的(速率限制、超時、5xx)和不可重試的(授權失敗、驗證錯誤、權限被拒)。對可重試錯誤應用帶抖動的指數退避,上限為 2-3 次嘗試。對不可重試錯誤,向模型返回清晰的錯誤訊息,使其能夠調整方法——或升級給用戶。在此之上加上斷路器,當工具持續失敗時能夠檢測並繞過它。

多工具代理中的權限管理如何運作?

每個工具都應該有一個定義好的權限範圍:它可以存取什麼、可以執行什麼操作、可以返回什麼資料。在生產環境中,這意味著每個對話使用短期憑證(而非共享服務金鑰)、分派前的明確能力檢查,以及每次工具呼叫的審計日誌。原則是最小權限——做文字分析的代理不需要你文件系統的寫入存取權。

我應該何時使用託管代理層,而不是自己構建?

如果你的使用案例涉及少於五個工具、執行順序可預測,就自己構建——除錯和維護更快。一旦你需要動態路由、並行執行、狀態持久化、人機協作閘道或多代理協調,構建和維護自定義基礎設施的工程成本就會超過學習框架的學習曲線。決定因素通常是狀態管理:一旦你的對話需要在進程重啟後繼續存活,你就需要基礎設施,而不只是腳本。

我仍在調整權限控制模型。三個層級可能還不夠細緻——有些寫入操作感覺應該自動批准(附加到日誌文件),而其他的明顯不應該(更新客戶記錄)。隨著工作流變得更加複雜,這條界線不斷移動。後續還會有更多分享。

過往文章: