【結合OpenAI官方文檔】解決Chatgpt的API接口請求速率限制

OpenAI API接口請求速率限制

速率限制以五種方式衡量:RPM(每分鐘請求數)、RPD(每天請求數)、TPM(每分鐘令牌數)、TPD(每天令牌數)和IPM(每分鐘圖像數)。

任何選項都可能會達到速率限制,具體取決于首先發生的情況。例如,向 ChatCompletions 端點發送僅包含 100 個令牌的 20 個請求,這將達到限制(如果RPM 為 20),即使在這 20 個請求中沒有發送 150k 令牌(如果TPM 限制為 150k) 。

其他值得注意的重要事項:

  • 速率限制是在組織級別而不是用戶級別施加的。
  • 速率限制因所使用的模型而異。
  • 組織每月可以在 API 上花費的總金額也受到限制。這些也稱為“使用限制”。

OpenAI官網免費用戶速率限制
請求頭限制

解決方法

OpenAI Cookbook 有一個Python 筆記本,解釋了如何避免速率限制錯誤,以及一個用于在批處理 API 請求時保持速率限制的示例Python 腳本。

在提供編程訪問、批量處理功能和自動社交媒體發布時,考慮只為部分用戶啟用這些功能。

為了防止自動和大量濫用,請在指定時間范圍內(每日、每周或每月)為單個用戶設置使用限制。考慮對超出限制的用戶實施硬上限或手動審核流程。

方法一:使用指數退避重試

避免速率限制錯誤的一種簡單方法是使用隨機指數退避自動重試請求。使用指數退避重試意味著在遇到速率限制錯誤時執行短暫睡眠,然后重試不成功的請求。如果請求仍然不成功,則增加睡眠長度并重復該過程。這將持續到請求成功或達到最大重試次數為止。這種方法有很多好處:

  • 自動重試意味著您可以從速率限制錯誤中恢復,而不會崩潰或丟失數據
  • 指數退避意味著您可以快速嘗試第一次重試,同時如果前幾次重試失敗,仍然可以從更長的延遲中受益
  • 在延遲中添加隨機抖動有助于同時重試所有命中。

請注意,不成功的請求會影響您的每分鐘限制,因此連續重新發送請求將不起作用。

下面是一些使用指數退避的Python解決方案示例

示例 1:使用 Tenacity 庫

Tenacity 是一個 Apache 2.0 許可的通用重試庫,用 Python 編寫,用于簡化向任何事物添加重試行為的任務。要為您的請求添加指數退避,您可以使用tenacity.retry裝飾器。下面的示例使用該tenacity.wait_random_exponential函數向請求添加隨機指數退避。

from openai import OpenAI
client = OpenAI()from tenacity import (retry,stop_after_attempt,wait_random_exponential,
)  # 指數退避@retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6))
def completion_with_backoff(**kwargs):return client.completions.create(**kwargs)completion_with_backoff(model="gpt-3.5-turbo-instruct", prompt="Once upon a time,")

請注意,Tenacity 庫是第三方工具,OpenAI 不保證其可靠性或安全性。

示例 2:使用backoff庫

另一個為退避和重試提供函數裝飾器的 python 庫是backoff:

import backoff 
import openai
from openai import OpenAI
client = OpenAI()@backoff.on_exception(backoff.expo, openai.RateLimitError)
def completions_with_backoff(**kwargs):return client.completions.create(**kwargs)completions_with_backoff(model="gpt-3.5-turbo-instruct", prompt="Once upon a time,")

與 Tenacity 一樣,backoff 庫是第三方工具,OpenAI 不保證其可靠性或安全性。

示例 3:手動退避實現

如果您不想使用第三方庫,您可以按照以下示例實現自己的退避邏輯:

import random
import timeimport openai
from openai import OpenAI
client = OpenAI()# 定義一個重試裝飾器
def retry_with_exponential_backoff(func,initial_delay: float = 1,exponential_base: float = 2,jitter: bool = True,max_retries: int = 10,errors: tuple = (openai.RateLimitError,),
):"""Retry a function with exponential backoff."""def wrapper(*args, **kwargs):# 初始化變量num_retries = 0delay = initial_delay# 循環直到成功響應或達到 max_retries 或引發異常while True:try:return func(*args, **kwargs)# 重試特定錯誤except errors as e:# 增量重試num_retries += 1# 檢查是否已達到最大重試次數if num_retries > max_retries:raise Exception(f"Maximum number of retries ({max_retries}) exceeded.")# 增加延遲delay *= exponential_base * (1 + jitter * random.random())time.sleep(delay)# 針對任何未指定的錯誤引發異常except Exception as e:raise ereturn wrapper@retry_with_exponential_backoff
def completions_with_backoff(**kwargs):return client.completions.create(**kwargs)

同樣,OpenAI 不保證該解決方案的安全性或效率,但它可以成為您自己的解決方案的良好起點。

方法二:充分利用max_tokens以匹配您完成的規模

max_tokens您的速率限制是根據您的請求的字符數計算的令牌的最大值和估計數量。嘗試將該max_tokens值設置為盡可能接近您的預期響應大小。

批量請求

OpenAI API 對每分鐘請求數和每分鐘令牌數有單獨的限制。

如果您達到了每分鐘的請求限制,但每分鐘的令牌有可用容量,則可以通過將多個任務批處理到每個請求中來提高吞吐量。這將使您每分鐘處理更多令牌,特別是對于我們較小的模型。

發送一批提示的工作方式與普通 API 調用完全相同,只不過您將字符串列表而不是單個字符串傳遞給提示參數。

  • 沒有批處理的示例
from openai import OpenAI
client = OpenAI()num_stories = 10
prompt = "Once upon a time,"# 示例,每個請求完成一個故事
for _ in range(num_stories):response = client.completions.create(model="curie",prompt=prompt,max_tokens=20,)# 輸出故事print(prompt + response.choices[0].text)
  • 批處理示例
from openai import OpenAI
client = OpenAI()num_stories = 10
prompts = ["Once upon a time,"] * num_stories# 批量示例,每個請求完成 10 個故事
response = client.completions.create(model="curie",prompt=prompts,max_tokens=20,
)# 按索引將完成與提示進行匹配
stories = [""] * len(prompts)
for choice in response.choices:stories[choice.index] = prompts[choice.index] + choice.text# 輸出故事
for story in stories:print(story)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697362.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697362.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697362.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BUUCTF第二十四、二十五題解題思路

目錄 第二十四題CrackRTF 第二十五題[2019紅帽杯]easyRE1 第二十四題CrackRTF 查殼 無殼,32位,用32位IDA打開,打開后的main函數很短,可以找到一句“jmz _main_0”——跳轉到 _main_0,說明真正的主函數是_main_0&am…

React 模態框的設計(二)

自定義組件是每個前端開發者必備的技能。我們在使用現有框架時難免有一些超乎框架以處的特別的需求,比如關于彈窗,每個應用都會用到,但是有時我們使用的框架中提供的彈窗功能也是功能有限,無法滿足我們的應用需求,今天…

【linux】使用 acme.sh 實現了 acme 協議生成免費的SSL 證書

acme.sh 實現了 acme 協議, 可以從 letsencrypt 生成免費的證書. 主要步驟: 安裝 acme.sh生成證書copy 證書到 nginx/apache 或者其他服務更新證書更新 acme.sh出錯怎么辦, 如何調試 下面詳細介紹. 1. 安裝 acme.sh 安裝很簡單, 一個命令: curl https://get.acme.sh | sh…

隱藏餓了么el-select組件的el-select-dropdown部分,只使用el-select的顯示框

隱藏餓了么el-select組件的el-select-dropdown部分,只使用el-select的顯示框 問題: 由于el-select組件的el-select-dropdown部分是自動插入在最外層Body上的,所以在當前組件的scoped中讓el-select-dropdown組件display:none不會生效所以需要: :popper-…

Java架構師之路六、高并發與性能優化:高并發編程、性能調優、線程池、NIO、Netty、高性能數據庫等。

目錄 高并發編程: 性能調優: 線程池: NIO: Netty: 高性能數據庫: 上篇:Java架構師之路五、微服務:微服務架構、服務注冊與發現、服務治理、服務監控、容器化等。-CSDN博客 下篇…

TiDB 7.5.0 LTS 高性能數據批處理方案

過去,TiDB 由于不支持存儲過程、大事務的使用也存在一些限制,使得在 TiDB 上進行一些復雜的數據批量處理變得比較復雜。 TiDB 在面向這種超大規模數據的批處理場景,其能力也一直在演進,其復雜度也變得越來越低: ○ 從…

11.CSS3的媒介(media)查詢

CSS3 的媒介(media)查詢 經典真題 如何使用媒體查詢實現視口寬度大于 320px 小于 640px 時 div 元素寬度變成 30% 媒體查詢 媒體查詢英文全稱 Media Query,顧名思義就是會查詢用戶所使用的媒體或者媒介。 在現在,網頁的瀏覽終端是越來越多了。用戶可…

C++:string類

標準庫中的string類 string類 1. 字符串是表示字符序列的類 2. 標準的字符串類提供了對此類對象的支持,其接口類似于標準字符容器的接口,但添加了專門用于操作單字節字符字符串的設計特性。 3. string類是使用char(即作為它的字符類型,使用…

ChatGPT 是什么

文章目錄 一、ChatGPT 是什么二、ChatGPT的發明者三、ChatGPT的運作方式四、ChatGPT的技術五、ChatGPT的優勢六、ChatGPT的局限性七、ChatGPT的應用八、ChatGPT的未來九、總結 一、ChatGPT 是什么 OpenAI的ChatGPT,即Chat Generative Pre-Trained Transformer&…

3個精美的wordpress企業網站模板

WordPress企業網站模板 https://www.zhanyes.com/qiye/6305.html WordPress企業官網模板 https://www.zhanyes.com/qiye/6309.html WordPress律師模板 https://www.zhanyes.com/qiye/23.html

SQL注入漏洞解析--less-2

首先我們進入第二關 思路: 1.先判斷是什么類型的注入 2.根據類型我們在找注入點 步驟: 1.提示我們輸入id數字,那我們先輸入1猜一下 2.這里正常回顯,當我們后邊加上時可以看到報錯,且報錯信息看不到數字&#xff0…

輕松掌握opencv的8種圖像變換

文章目錄 opencv的8種圖像變換1. 圖像放大、縮小2. 圖像平移3. 圖像旋轉4. 圖像仿射變換5. 圖像裁剪6. 圖像的位運算(AND, OR, XOR)7. 圖像的分離和融合8. 圖像的顏色空間 opencv的8種圖像變換 1. 圖像放大、縮小 我們先看下原圖 import cv2 import ma…

C++面試:程序的編譯與運行

程序的編譯和運行是軟件開發中的基本環節,尤其是在使用編譯型語言(如C/C、Java等)進行開發時。這個過程涉及將人類可讀的源代碼轉換成機器能夠執行的指令,然后運行這些指令來完成既定的任務。下面是這一過程的詳細介紹&#xff0c…

基于java+springboot+vue實現的美食信息推薦系統(文末源碼+Lw)23-170

1 摘 要 使用舊方法對美食信息推薦系統的信息進行系統化管理已經不再讓人們信賴了,把現在的網絡信息技術運用在美食信息推薦系統的管理上面可以解決許多信息管理上面的難題,比如處理數據時間很長,數據存在錯誤不能及時糾正等問題。這次開發…

Shell好用的工具: cut

目標 使用cut可以切割提取指定列\字符\字節的數據 介紹 cut 譯為“剪切, 切割” , 是一個強大文本處理工具,它可以將文本按列進行劃分的文本處理。cut命令逐行讀入文本,然后按列劃分字段并進行提取、輸出等操作。 語法 cut [options] filename opti…

樹中枝繁葉茂:探索 B+ 樹、B 樹、二叉樹、紅黑樹和跳表的世界

歡迎來到我的博客,代碼的世界里,每一行都是一個故事 樹中枝繁葉茂:探索 B 樹、B 樹、二叉樹、紅黑樹和跳表的世界 前言B樹和B樹B樹(Binary Tree):B樹(B Plus Tree):應用場…

Cobra在ubuntu中設置自動補全

Cobra在ubuntu中設置自動補全 yourprogram指的是你程序&#xff0c;并且必須是使用了Cobra cli bash設置 $ source <(yourprogram completion bash)$ yourprogram completion bash > /etc/bash_completion.d/yourprogramzsh設置 $ echo "autoload -U compinit; …

Linux之用戶和用戶組用戶賬號系統文件

一、簡介 1.用戶的定義 在linux系統中用戶&#xff08;User&#xff09;需要用用戶賬號來訪問系統&#xff0c;服務和信息&#xff0c;系統中的每個進程&#xff08;運行的程序&#xff09;都是使用一個特定的用戶運行。每個文件都屬于一個特定的用戶所有。對文件和目錄的訪…

STM32Cubemx TB6612直流電機驅動

一、TB6612FNG TB6612是一個支持雙電機的驅動模塊&#xff0c;支持PWM調速。PWMA、AIN1、AIN2 為一組控制引腳&#xff0c;PWMA 為 PWM 速度控制引腳&#xff0c;AIN1、AIN2 為方向控制引腳&#xff1b;PWMB、BIN1、BIN2 為一組控制引腳&#xff0c;PWMB 為 PWM 速度控制引腳&…

【力扣hot100】刷題筆記Day11

前言 科研不順啊......又不想搞了&#xff0c;隨便弄弄吧&#xff0c;多花點時間刷題&#xff0c;今天開啟二叉樹&#xff01; 94. 二叉樹的中序遍歷 - 力扣&#xff08;LeetCode&#xff09; 遞歸 # 最簡單遞歸 class Solution:def inorderTraversal(self, root: TreeNode) …