測試你的應用程式如何處理 OpenAI 速率限制

一目了然
目標: 測試你的應用程式如何處理 OpenAI 速率限制和超載錯誤
時間: 10分鐘
插件:GenericRandomErrorPlugin、 RetryAfterPlugin
前置條件:設定開發代理

你的應用程式在開發中正常運作,然後在生產環境中因 429 Too Many Requests 而失敗。 OpenAI 的速率限制取決於你組織的使用等級、你的模型,以及其他使用同一組織的人,所以你無法刻意且穩定地達到這些限制。 Dev Proxy 會回傳與 OpenAI API 相同的錯誤,所以你可以在使用者看到之前,先了解你的應用程式會如何回應。

了解 OpenAI 會傳回什麼

並非每個 OpenAI 錯誤都代表「重試一次」。 你的應用程式需要分辨它們。

Status error.code 這是什麼意思? 你的應用程式應該做什麼
429 rate_limit_exceeded 你達到每分鐘請求數(RPM)或代幣數(TPM)的上限。 等到 Retry-After 標頭中的時間到達後,再重試。
429 slow_down 你的請求速率增加得太快,即使你仍在限制內。 等待 Retry-After,降低請求速率,然後逐步增加。
429 credit_balance_exhausted 您的組織已經沒有預付點數了。 不要重試。 重試無法恢復存取權限。 告訴使用者或通知管理員。
503 server_is_overloaded 這個模型目前容量不夠。 若 Retry-After 存在,請等待,然後以逐漸增加的延遲時間重試。

完整清單請參閱 OpenAI 文件中的 錯誤代碼 。

Important

429 列中的 3 個錯誤都使用相同的狀態碼。 如果你的應用程式每次遇到 429 都重試,它就會一直重試永遠無法恢復的帳單錯誤。 查看 error.code 以決定該怎麼做。

了解 OpenAI SDK 為你帶來的好處

官方 OpenAI SDK 針對 Python 和 JavaScript,預設會重試 408、409、429 和 5xx 的回應和連線錯誤兩次,並採用指數式退讓。 你可以在 Python 中使用 max_retries 選項,並在 JavaScript 中使用 maxRetries 來更改這個設定。

SDK 重試涵蓋短暫尖峰。 你的應用程式仍需決定重試用盡後會發生什麼,以及如何處理重試無法解決的錯誤。 在 Python 裡,429 會引發 RateLimitError,503 會引發 InternalServerError,所以兩者都要處理。

Tip

若要精確查看錯誤處理程式碼實際接收到的內容,請在測試時將 max_retries=0 設為 True(Python)或將 maxRetries: 0 設為 true(JavaScript)。 之後再把 SDK 重試重新開啟。

模擬 OpenAI 速率限制

Dev Proxy 有一個預設集,包含表格中的 OpenAI 錯誤。 下載它:

devproxy config get openai-throttling

用以下預設啟動開發代理:

devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"

此預設對 https://api.openai.com/* 的請求有 90% 會失敗,並顯示表格中的隨機錯誤。 對於限速回應,它會設定 Retry-After 標頭,並使用 RetryAfterPlugin 檢查你的應用程式是否會等那麼久才再次呼叫 API。

確保你的應用程式透過 Dev Proxy 傳送請求,並信任 Dev Proxy 憑證。 關於 Node.js,請參見「 在 Node.js 應用程式中使用開發代理」。 對於其他執行環境,請參見「Dev Proxy 故障排除」。

啟動你的應用程式並檢查:

  • 發生 slow_down 或 rate_limit_exceeded 錯誤後,應用程式會等待 Retry-After 時間。 如果它太早呼叫 API,Dev Proxy 會回報並限制請求。
  • credit_balance_exhausted 錯誤發生後,你的應用程式會停止呼叫 API,並顯示清晰訊息。
  • 錯誤 server_is_overloaded 發生後,應用程式會延遲重試,當重試結束時,會回退或顯示清楚的訊息而非堆疊追蹤。
  • 你的應用程式不會遺失工作內容。 例如,長時間的聊天對話或批次工作會在錯誤發生後繼續。

若要變更要求失敗的頻率,請使用 --failure-rate 選項。 例如,要讓所有請求失敗:

devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json" --failure-rate 100

模擬 Azure OpenAI 及其他供應商的代幣限制

預設會隨機回傳錯誤,不管你的應用程式使用了多少代幣。 要根據實際的令牌使用量來限速請求,例如要觀察長時間對話超過你的 TPM 限制會發生什麼,可以使用 LanguageModelRateLimitingPlugin。 它可搭配任何相容 OpenAI 的 API,包括 Azure OpenAI 及本地模型。 欲了解更多資訊,請參閱 測試語言模型的令牌限制。

下一步

學習如何模擬基於權杖的限制。

也請參閱