使用open AI的API调用模型的时候,会出现以下报错:
openai.error.RateLimitError: Rate limit reached for default-text-davinci-003 in organization XXX on requests per min. Limit: 60 / min. Please try again in 1s.
原因就是调用API的频率太过于频繁。
例如,free trial的用户,每分钟限制的request的上限是20次,15万tokens。超过这部分,访问就会受拒。
解决方案
官方提供了解决方案:
import openai # for OpenAI API calls
from tenacity import (
retry,
stop_after_attempt,
wait_random_exponential,
) # for exponential backoff
@retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6))
def completion_with_backoff(**kwargs):
return openai.Completion.create(**kwargs)
completion_with_backoff(model="text-davinci-002", prompt="Once upon a time,")
如上图,安装tenacity
包,然后给的自己的脚本,访问API那段函数,添加修饰:@retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6))
这样的话,在访问之间会自动增加一定时间间隔,并在访问受拒之后,再次进行尝试。
除了上述tenacity
,还可以使用backoff
。以及尝试自己手动添加停顿等。
import backoff # for exponential backoff
import openai # for OpenAI API calls
@backoff.on_exception(backoff.expo, openai.error.RateLimitError)
def completions_with_backoff(**kwargs):
return openai.Completion.create(**kwargs)
completions_with_backoff(model="text-davinci-002", prompt="Once upon a time,")
参考:
笔者还是建议读者去阅读官方的notebook:
How_to_handle_rate_limits.ipynb