一目了然
目標: 測試你的應用程式如何處理 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 及本地模型。 欲了解更多資訊,請參閱 測試語言模型的令牌限制。
下一步
學習如何模擬基於權杖的限制。
也請參閱
- 使用語言模型故障測試我的應用程式 ——模擬意外的語言模型回應
- 模擬 OpenAI API 的錯誤 ——建立你自己的 OpenAI 錯誤檔案
- 測試我的應用程式是否能正確處理限速 ——在任何 API 上進行限速
- 使用預設配置 - 使用預設配置進行操作
- RetryAfterPlugin - 驗證重試行為