LangChain集成ChatGPT:如何覆盖OpenAI默认重试次数?
解决方案
针对LangChain结合OpenAI时,账单限额触发RateLimitError后默认重试5次、耗时久的问题,可通过以下方式解决:
1. 自定义重试策略,排除RateLimitError
LangChain的OpenAI类基于tenacity实现重试逻辑,可自定义重试装饰器,让程序遇到RateLimitError时直接停止重试,无需等待默认周期:
from langchain.llms import OpenAI from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_not_exception_type from openai.error import RateLimitError llm = OpenAI( temperature=0, retry=retry( stop=stop_after_attempt(5), # 其他异常仍保留5次重试 wait=wait_exponential(multiplier=1, min=4, max=10), # 仅对非RateLimitError的异常执行重试 retry=retry_if_not_exception_type(RateLimitError), reraise=True ) )
配置后,触发RateLimitError时程序会立即抛出异常,可在外层用try-except即时处理:
try: result = llm.predict("检索查询内容") except RateLimitError as e: # 添加即时处理逻辑,如提示用户、记录日志 print(f"账单限额不足:{str(e)}")
2. 继承OpenAI类,重写重试逻辑
如需深度定制,可继承LangChain的OpenAI类,重写_create_retry_decorator方法,完全自定义重试规则:
from langchain.llms.openai import OpenAI from tenacity import retry, stop_after_attempt, retry_if_not_exception_type from openai.error import RateLimitError class CustomOpenAI(OpenAI): def _create_retry_decorator(self) -> callable: # 自定义规则:排除RateLimitError,其他异常按max_retries配置重试 return retry( stop=stop_after_attempt(self.max_retries), wait=self._create_wait_func(), retry=retry_if_not_exception_type(RateLimitError), reraise=True ) llm = CustomOpenAI(max_retries=3)
3. 利用tenacity回调即时终止重试
通过tenacity的after_retry回调,可在每次重试前检查异常类型,检测到RateLimitError时立即终止重试:
from langchain.llms import OpenAI from tenacity import retry, stop_after_attempt, wait_exponential, after_retry, RetryCallState from openai.error import RateLimitError def terminate_on_rate_limit(retry_state: RetryCallState): exception = retry_state.outcome.exception() if isinstance(exception, RateLimitError): retry_state.stop() print(f"检测到账单限额错误:{str(exception)},停止重试") custom_retry = retry( stop=stop_after_attempt(5), wait=wait_exponential(multiplier=1, min=4, max=10), after=after_retry(terminate_on_rate_limit), reraise=True ) llm = OpenAI(retry=custom_retry)
三种方法均可避免默认的长耗时重试,实现RateLimitError的即时捕获处理。第一种简洁高效,适合快速调整;第二种适合长期复用的定制场景;第三种保留对其他异常的重试能力,同时针对账单限额做特殊处理。
内容的提问来源于stack exchange,提问作者Abhishek Sasidharan
相关产品推荐
相关产品推荐

