如何解決運行多代理工作流程時出現的“API逾時錯誤”

在多代理工作流程中,「API 逾時錯誤」很少能透過更改單一數值來解決。規劃器可能會呼叫三個代理,每個代理可能會呼叫 LLM、搜尋服務、資料庫或工具 API,而每一層都可以有自己的逾時時間、重試策略、連線池和並發限制。實際的解決方法是確定哪一層最先逾時,然後在延長等待時間、減少並發呼叫次數、更聰明的重試機制、縮短關鍵路徑或採用非同步作業設計等方案中進行選擇。

權衡取捨至關重要:提高超時時間雖然簡單,但會佔用資源更長時間;頻繁重試會增加負載和成本;降低並發度可以提高穩定性,但會降低峰值吞吐量;並行代理只有在下游服務能夠吸收扇出流量時才能降低實際延遲。對於每個多代理系統,並不存在唯一的最佳設定。

你實際觸發的是哪個暫停?

首先要對故障進行分類,而不是將每次超時視為相同事件。 HTTP 用戶端在連線、讀取、寫入或等待連線池中的連線時都可能發生逾時。例如,HTTPX 文件中列出了四種不同的逾時類型:連線逾時、讀取逾時、寫入逾時和連線池逾時。其預設行為是在網路無活動五秒後觸發逾時,而不是在請求總持續時間達到五秒後觸發。請參閱官方的 HTTPX 逾時文件。

如果您使用 OpenAI Python SDK,其官方 README 檔案指出,請求的預設用戶端逾時時間為 10 分鐘,並且預設逾時失敗會重試兩次。該 SDK 還會自動重試連線錯誤以及 HTTP 408、409、429 和 5xx 回應,並採用較短的指數退避演算法。這些是 SDK 的預設設置,並不保證請求前端的每個代理、負載平衡器、網關或編排器都會等待 10 分鐘。請參閱OpenAI Python SDK 的官方 README 文件。

範例暗日誌視圖,顯示多代理研究呼叫以 API 逾時和讀取逾時回溯結束。
步驟 1:擷取逾時的確切異常以及代理、端點和傳輸層,而不是僅記錄通用的工作流程失敗。

你應該選擇哪種解決方案?

選項 最佳匹配 主要好處 主要權衡
增加請求逾時時間 模型/工具呼叫正常但速度確實較慢 最小的程式碼和架構變更 工作進程和連線佔用時間更長;上游網關仍有可能先終止請求。
使用指數退避重試 瞬態網路錯誤、速率限制、選定的 5xx 故障 能夠從短暫故障中自動恢復 可能會倍增流量、延遲和成本;除非精心設計,否則對於非冪等操作而言是不安全的。
降低代理並發性 429s,池超時,下游飽和 減少突發流量和隊列爭用 峰值吞吐量降低,有時工作流程完成時間也會延長
並行化獨立代理 具有獨立分支的順序工作流程 縮短關鍵路徑 增加並發請求數,可能會觸發速率或連線數限制。
流部分輸出 在互動式使用者體驗中,首字節延遲至關重要。 用戶能更快看到進展。 無法自動解決嚴重的整合超時或下游服務過載問題。
將工作移至非同步任務/佇列 可能需要幾十秒或幾分鐘的工作流程 將 HTTP 請求生命週期與工作流程生命週期解耦 需要作業狀態、輪詢/Webhook、冪等性、持久性和運行監控

步驟 1:找出第一個超過截止時間的層

記錄整個工作流程的關聯 ID,以及每個座席和工具呼叫的跨度 ID 或子 ID。記錄開始時間、結束時間、端點、嘗試次數、異常類型、回應狀態(如有),以及取消操作是由呼叫方還是下游服務方發起的。

關鍵問題是「誰先停止等待?」如果 LLM 呼叫在 42 秒內完成,但 API 網關在 30 秒時放棄,那麼將 LLM 用戶端超時時間從 60 秒提高到 120 秒並不會改變任何結果。亞馬遜目前關於 API 閘道 HTTP API 的文件列出了最大整合逾時時間為 30 秒,這很好地說明了為什麼鏈中最短的截止時間通常決定最終結果。請參閱Amazon API 網關 HTTP API 配額。

範例多代理程式工作流程圖,顯示規劃器、搜尋器、分析器和寫入器代理程式連接到外部 API,並具有可能的逾時點。
步驟 2:繪製請求路徑圖,並標記所有可能終止或延遲呼叫的地方:協調器、代理程式、網關、模型 API、搜尋 API、資料庫和工具服務。

步驟 2:測量關鍵路徑,而不僅僅是平均延遲

平均延遲可能看起來很健康,但少量慢呼叫才是導致大多數工作流程失敗的原因。至少要追蹤每個依賴項的成功率以及 p50、p95 和 p99 延遲。在扇出階段,也要記錄佇列時間和連線池等待時間,因為「慢 API」實際上可能是客戶端過載,正在等待空閒連線。

使用追蹤來回答三個實際問題:哪個依賴項主導關鍵路徑,多個慢代理是否在可以並發運行時順序運行,以及並發峰值是否與 429、池超時或 5xx 錯誤相吻合。

範例監控儀表板,包含 LLM API、向量資料庫和網路搜尋 API 的 API 延遲、錯誤率圖表和服務健康指標。
步驟 3:將延遲、錯誤和依賴項健康狀況進行比較;超時峰值與某個降級的依賴項同時出現,這表明需要採取與系統範圍內的並發峰值不同的修復方法。

步驟 3:從外到內建構暫停預算

首先設定端對端工作流程的截止時間,然後縮短內部各層的截止時間,以便底層能夠儘早出現故障,讓編排器有時間恢復。例如,面向使用者的截止時間設為 120 秒,其中 10 秒用於編排和回應處理,剩餘 110 秒用於實際工作。單一工具呼叫可能分配 15 秒,而模型呼叫則可能分配 45 或 60 秒,具體取決於觀察到的尾延遲。

不要盲目複製這些值;它們只是一個預算方法範例,並非通用預設值。請根據您測量的延遲分佈和產品服務等級目標 (SLO) 選擇合適的值。外部截止時間應足夠長,以包含內部呼叫、允許的重試次數、退避延遲和清理時間。

Python 3.11 及更高版本支援asyncio.timeout()為非同步任務設定截止時間。截止時間過後,任務將被取消,上下文管理器會拋出一個異常TimeoutError。請參閱Python 官方 asyncio 超時文件。

import asyncio

async def run_stage():
    try:
        async with asyncio.timeout(90):
            return await run_agents()
    except TimeoutError:
        return {"status": "partial", "reason": "stage_timeout"}
範例 API 設定面板,顯示請求逾時、最大重試次數、指數退避策略和請求日誌記錄。
步驟 4:將超時和重試值配置為協調預算,而不是單獨增加每個值。

步驟 4:在增加重試次數之前,先限制並發數。

多代理系統經常出現故障,原因在於扇出成長速度超出預期。如果 20 個使用者請求分別啟動 5 個代理,每個代理啟動 2 個工具,那麼在重試之前,系統最多會產生 200 個下游呼叫。如果先進行重試,則可能導致壅塞演變為重試風暴。

當您遇到 429 回應、連線池逾時、佇列時間不斷增加或下游相依性達到飽和等問題時,並發限制器通常是更好的首選方案。 Pythonasyncio.Semaphore提供了一種基於計數器的簡單方法來限制同時進入受保護部分的協程數量。請參閱Python 官方信號量文件。

import asyncio

sem = asyncio.Semaphore(8)

async def guarded_agent_call(agent, task):
    async with sem:
        return await agent.run(task)

這種權衡是經過深思熟慮的:較低的限制可以保護下游服務,但可能會增加應用程式內部的排隊情況。應該根據吞吐量、p95 延遲、速率限制和連接池容量來調整此值,而不是選擇機器可以調度的最大值。

Python 編輯器範例視圖,顯示單獨的連接和讀取逾時值,以及具有指數等待的有界重試策略。
步驟 5:將有界並發與明確傳輸設定結合,這樣滿連接池就不會偽裝成慢模型或工具。

步驟 5:只重試那些以後很可能成功的失敗案例。

對於瞬態連線故障、速率限制、特定伺服器錯誤以及請求逾時等情況,如果重複操作是安全的,重試機制就非常有用。但對於驗證錯誤、驗證失敗、確定性工具錯誤或缺乏冪等性保護的副作用操作,重試機制並非理想的預設選擇。

注意重試次數的倍增。如果 SDK 進行兩次重試,則表示一個邏輯呼叫最多會嘗試三次。如果您的代理層也對整個呼叫進行兩次重試,則理論上該邏輯操作的最大嘗試次數將達到九次:三次外部嘗試乘以三次 SDK 嘗試。如果編排器隨後重試整個包含五個代理程式的階段,則請求量可能會迅速增長。

盡可能集中管理重試權限。對於使用 OpenAI Python SDK 的 LLM 調用,請記住,當前 SDK 預設會對某些類型的故障進行兩次重試。只有在有特定原因且可限制總嘗試次數時,才會新增外部重試。

範例 API 錯誤螢幕,顯示遠端 HTTPS 端點的請求逾時和讀取逾時訊息。
步驟 6:在重試之前對錯誤進行分類;讀取逾時可能足以構成有限制的重試,而永久性配置錯誤通常不構成重試。

步驟 6:縮短關鍵路徑,同時避免產生扇出問題

如果規劃、研究、評估和撰寫代理嚴格按照順序運行,則總延遲時間近似等於它們各自運行時間的總和。獨立分支有時可以並行運行,這樣一來,實際運行時間會向最慢的分支靠攏,而不是所有分支運行時間的總和。

Python 的asyncio.TaskGroupTaskGroup 提供了一種結構化的方式來並發運行相關任務。目前的 Python 文件指出,TaskGroup 會等待群組內的任務完成,並在某個任務因非取消異常而失敗時取消剩餘的任務,這比非結構化的任務生成方式提供了更強的安全性。請參閱Python TaskGroup 的官方文件。

並行化並非免費。如果同一服務提供者嚴格限制每分鐘請求數或並發請求數,同時執行四個代理程式可能會將原本緩慢但成功的流程變成快速的 429 回應爆發。因此,僅對真正獨立的工作進行並行化,並保持全局並發限制器有效。

步驟 7:何時應該停止使用同步 HTTP 請求?

如果正常的流程通常會超過網路路徑中最短的請求逾時時間,那麼採用非同步作業模型通常比不斷延長逾時時間更為簡潔。初始 HTTP 請求可以驗證輸入、建立一個持久作業並立即傳回作業 ID。然後,工作進程在請求生命週期之外執行多代理圖,而用戶端則透過輪詢、伺服器發送事件、WebSocket 或 Webhook 接收進度資訊。

當伺服器能夠儘早開始發送有意義的輸出時,串流傳輸非常有用。例如,OpenAI Python SDK 支援對 Responses API 呼叫進行伺服器傳送事件串流。串流傳輸可以提高回應速度,並保持連線持續產生數據,但它並不能自動解決每個代理的最大請求生命週期問題。請參閱OpenAI 官方串流事件參考文件。

當持久性比即時簡便性更重要時,請選擇非同步作業:例如耗時較長的研究任務、需要人工審批的代理工作流程、大量工具呼叫、不希望重複執行的昂貴操作,或必須在客戶端斷開連線後仍能正常運作的工作負載。其代價是需要額外的狀態管理:作業狀態、檢查點、冪等鍵、取消、結果儲存和重試所有權。

範例工作流程完成視圖,顯示規劃員、研究員、分析師和撰稿人完成各自的工作時長和最終的成功狀態。
步驟 7:對於長時間的工作流程,將代理完成狀況追蹤為持久的工作流程狀態,而不是依賴一個客戶端連線保持開啟狀態直到所有代理完成。

步驟 8:在實際負載下驗證修復效果

一次請求成功並不能證明修復方案有效。請在生產環境中預期的並發環境下進行測試,並測量成功率、逾時率、每個邏輯任務的重試次數、p95 和 p99 延遲、佇列延遲、連接池等待時間、下游 429/5xx 錯誤率以及每個已完成工作流程的成本。

如果在 Kubernetes 中運行代理,請將就緒探針和存活探針用於不同的目的。 Kubernetes 將就緒探針定義為確定 Pod 是否應該接收流量的機制,而存活探針則用於決定何時應該重新啟動容器。其文件明確警告,實現不當的存活檢查可能會導致負載下的級聯故障。請參閱Kubernetes 官方探針文件。

對於暫時的過載,進入「未就緒」狀態通常比反覆終止那些健康但繁忙的工作進程更安全。只有在重啟進程才是真正正確的恢復措施的情況下,才應考慮使用存活故障。

範例 API 效能儀表板顯示了工作流程變更後的成功率、平均回應時間、逾時率和請求歷史記錄。
步驟 8:使用類似生產環境的流量和尾延遲指標來驗證更改,而不僅僅是一次成功的測試運行。

如何判斷哪種修復方法最適合您的故障模式?

觀察到的模式 最有用的第一次改變 首先不要做什麼
電話通話在客戶截止時間後剛好結束;下游運作正常 增加內部超時時間並重新調整外部截止時間。 增加重試次數
429 錯誤和連接池逾時隨著並發性的增加而增加。 降低並發度並增加隊列/反壓機制 並行啟動更多代理
偶爾出現 408/5xx 錯誤或網路故障 對冪等運算使用有界指數退避重試機制 無限期地重試所有異常
工作流程通常耗時超過網關限制 使用非同步作業架構或支援的串流設計 只增加 SDK 逾時時間
p99 延遲主要受一種緩慢依賴性的影響 最佳化、快取、替換或隔離該依賴項;考慮備用方案。 調整無關代理逾時
僅在新增並行代理程式後才會出現故障。 保留有用的並行性,但添加全局信號量和每個提供者的限制。 假設並行處理總是更快

實際生產基準

對於典型的多代理 API,一個穩健的基線是:為每個工作流程分配一個關聯 ID,跟踪每個代理和工具調用,定義一個端到端截止時間,在其中分配更短的每次調用截止時間,強制執行每個下游提供程序的全局並發限制,保持重試次數有界且冪等,並持久化足夠的狀態以恢復或報告部分完成情況。

然後根據測量結果進行調整。如果系統穩定但速度過慢,則選擇性地並行化獨立任務。如果系統在低負載下速度很快,但在尖峰負載下速度下降,則減少扇出並增加背壓。如果成功的流程自然耗時超過同步請求路徑允許的時間,則切換架構,而不是試圖讓每個代理程式等待更長時間。

官方參考資料

留下評論

如何使用 Local Ollama 自動產生 SEO 元標題和描述

如何使用 Local Ollama 自動產生 SEO 元標題和描述

建立本地 Ollama 工作流程,批量產生結構化的 SEO 標題和元描述,驗證輸出,並將結果標記出來以供手動審核。

Modern Real Estate Listing Presentation PowerPoint Template Free: A Practical Seller-Ready Slide Blueprint

Modern Real Estate Listing Presentation PowerPoint Template Free: A Practical Seller-Ready Slide Blueprint

Use this free modern real estate listing presentation PowerPoint blueprint to organize pricing, marketing, property prep, agent value, and seller next steps.

適用於Excel的可列印建築工程估價範本:小型承包商的實用指南

適用於Excel的可列印建築工程估價範本:小型承包商的實用指南

在 Excel 中建立一個可列印的建築工程估價模板,其中包含清晰的人工、材料、公式、加價、排除項和可直接列印的客戶總計。

如何為 Luma Dream Machine 產生電影級光照提示

如何為 Luma Dream Machine 產生電影級光照提示

利用實用的電影級照明公式、可重複使用的配方、範例和快速故障排除清單,建立更強大的 Luma Dream Machine 視訊提示。

Minimalist Investor Pitch Deck PowerPoint Template for Tech Startups: What to Include and How to Structure It

Minimalist Investor Pitch Deck PowerPoint Template for Tech Startups: What to Include and How to Structure It

Build a minimalist tech startup investor pitch deck in PowerPoint with the right slide order, clear design rules, traction metrics, and investor-ready appendix.

如何阻止Excel自動將數字轉換為日期

如何阻止Excel自動將數字轉換為日期

阻止 Excel 將程式碼、ID 和分數轉換為日期。使用文字格式、撇號、匯入控制項和最新的 Microsoft 365 選項。

如何在 ComfyUI 中減少 SDXL 工作流程的渲染時間

如何在 ComfyUI 中減少 SDXL 工作流程的渲染時間

透過減少採樣工作、控制解析度和批次大小、簡化節點、使用快取以及安全地調整 VRAM 和注意力來加快 ComfyUI SDXL 渲染速度。

Free Rental Property Expense & Income Tracker Excel Template: Simple Landlord Workbook

Free Rental Property Expense & Income Tracker Excel Template: Simple Landlord Workbook

Build a practical rental property income and expense tracker in Excel with clear categories, formulas, monthly summaries, and tax-ready recordkeeping guidance.

如何為個人文檔建立私有的本地AI知識庫

如何為個人文檔建立私有的本地AI知識庫

使用 Ollama、AnythingLLM、本地嵌入和 RAG 建立私人本地 AI 知識庫。學習四步驟設定、隱私檢查、測試和備份。

如何在不遺失關鍵證據的情況下修復長文檔分析中的「上下文視窗超出範圍」錯誤

如何在不遺失關鍵證據的情況下修復長文檔分析中的「上下文視窗超出範圍」錯誤

透過修剪輸入、分割文件、使用檢索以及驗證最終答案是否涵蓋來源文件來修復長文檔分析中的上下文視窗錯誤。