You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:32:15