尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

LLM API 速率限制(HTTP 429)的成因与稳健处理方案

LLM API 速率限制(HTTP 429)的成因与稳健处理方案 最近在对接各类大模型 API 开发应用时你是否也频繁遇到HTTP 429 Too Many Requests这个令人头疼的错误尤其是在业务高峰期或批量处理任务时这个错误会直接导致服务中断、用户体验下降甚至引发数据丢失。HTTP 429并非简单的“网络不通”而是服务端对你请求频率的明确限制。对于依赖 OpenAI、Claude、DeepSeek、智谱等 LLM API 的开发者来说能否优雅地处理这个错误是应用能否稳定运行的关键。本文将系统性地拆解 LLM API 中HTTP 429错误的成因、识别方法并提供一套从基础到进阶的完整解决方案。我们会从 HTTP 协议原理讲起逐步深入到具体的代码实现、重试策略设计、以及面向生产环境的最佳实践。无论你是刚接触 API 调用的新手还是正在优化现有服务稳定性的资深开发者都能从中找到可复用的代码和清晰的排错思路。1. 理解 HTTP 429不只是“请求太多”在深入代码之前我们必须准确理解HTTP 429状态码的含义及其在 LLM API 上下文中的特殊性。1.1 HTTP 429 状态码的定义HTTP 429 Too Many Requests是 HTTP/1.1 标准RFC 6585中定义的一个状态码。它表示用户在给定的时间内发送了太多请求即超过了服务端设定的速率限制Rate Limiting。与4xx系列的其他客户端错误如400 Bad Request、401 Unauthorized不同429错误的核心矛盾在于“频率”而非“内容”。你的请求本身可能是完全合法的认证通过、参数正确只是发送得太快了。1.2 LLM API 速率限制的常见维度各大 LLM 服务商实施速率限制的策略各不相同但通常围绕以下几个核心维度展开。理解这些维度是设计有效应对策略的基础RPM (Requests Per Minute) / RPD (Requests Per Day)每分钟或每天允许的请求总数。这是最常见的限制。TPM (Tokens Per Minute)每分钟允许处理的令牌Token总数。这对于 LLM 尤为重要因为生成长文本消耗的 Token 远多于短文本。一个复杂的请求可能在 Token 数量上“等价于”多个简单请求。并发连接数同时允许建立的连接数量。即使 RPM 未超过多的并发请求也可能被限制。基于用户/API Key/IP 的限流限制策略可能绑定到你的账户、具体的 API Key 或来源 IP 地址。例如从网络热词中可以看到deepseek-v4-pro和deepseek-v4-flash等模型不同模型的速率限制配额很可能不同。api error: 402 insufficient balance则提示我们额度不足也可能表现为类似“拒绝服务”的现象需要与429区分。1.3 为何 LLM 服务必须实施限流这并非服务商“故意为难”开发者而是出于必要的考量保障服务稳定性防止少数用户耗尽计算资源影响所有用户的可用性。控制成本LLM 推理是计算密集型任务成本高昂。限流是控制运营成本的重要手段。公平使用确保所有付费用户都能获得相对公平的服务质量。防范滥用防止恶意爬虫或自动化脚本对服务进行攻击。因此作为客户端开发者我们的目标不是“绕过”限流而是“尊重并适配”限流规则构建健壮的应用程序。2. 环境准备与工具选择在开始编写处理逻辑前我们需要搭建一个合适的开发环境。本文将主要使用 Python 进行演示因为它是与 LLM API 交互最流行的语言之一。2.1 基础环境操作系统Windows 10/11, macOS, 或 Linux (如 Ubuntu 20.04) 均可。Python 版本建议使用 Python 3.8 及以上版本。本文示例代码基于 Python 3.10。包管理工具使用pip进行包管理。推荐使用虚拟环境venv或conda隔离项目依赖。2.2 核心依赖库我们将使用以下几个库来构建示例requests: 用于发送 HTTP 请求的基础库。openai(官方库): 作为与 OpenAI 兼容 API 交互的示例。其他厂商如 Anthropic、DeepSeek 也有类似 SDK。backoff: 一个非常实用的库用于实现灵活的重试逻辑特别适合处理429错误。tenacity: 另一个强大的重试库可以作为backoff的替代品。httpx: 一个现代化的异步 HTTP 客户端适合高性能场景。首先创建并激活虚拟环境然后安装基础依赖# 创建虚拟环境 (可选) python -m venv llm_api_env source llm_api_env/bin/activate # Linux/macOS # llm_api_env\Scripts\activate # Windows # 安装核心库 pip install requests openai backoff httpx2.3 获取 API 密钥你需要准备一个可用的 LLM API 密钥用于测试。本文将以 OpenAI 格式的 API 为例但其原理和代码模式完全适用于其他提供类似 REST API 的 LLM 服务如配置了正确base_url的 DeepSeek、智谱等。请将你的 API 密钥保存在环境变量中而不是硬编码在代码里这是最基本的安全实践。# Linux/macOS export OPENAI_API_KEYyour-api-key-here # Windows (PowerShell) $env:OPENAI_API_KEYyour-api-key-here3. 识别与解析 HTTP 429 响应当请求被限流时服务端返回的不仅仅是429状态码响应头Headers中通常包含关键信息告诉我们何时可以重试。3.1 检查响应状态码最简单的识别方法就是检查 HTTP 状态码。import requests import os api_key os.getenv(OPENAI_API_KEY) url https://api.openai.com/v1/chat/completions headers {Authorization: fBearer {api_key}, Content-Type: application/json} data { model: gpt-3.5-turbo, messages: [{role: user, content: Hello!}], max_tokens: 50 } response requests.post(url, headersheaders, jsondata) if response.status_code 429: print(触发速率限制) # 处理限流逻辑 elif response.status_code 200: print(请求成功) print(response.json()) else: print(f其他错误: {response.status_code}) print(response.text)3.2 解析重试头部信息服务端通常通过特定的响应头告知客户端需要等待多久。这是处理429错误最规范、最有效的方式。Retry-After: 这是最标准的头部。它的值可以是一个整数表示需要等待的秒数也可以是一个 HTTP 日期时间GMT 格式。Retry-After: 30(等待30秒)Retry-After: Wed, 21 Oct 2024 07:28:00 GMT(等待到指定时间)X-RateLimit-*: 许多 API 会提供自定义的速率限制头部信息更丰富。X-RateLimit-Limit: 允许的最大请求数。X-RateLimit-Remaining: 当前周期内剩余的请求数。X-RateLimit-Reset: 限制重置的时间戳秒或日期。我们需要在代码中解析这些信息import time import requests def make_request_with_retry_info(): # ... 同上发起请求 ... response requests.post(url, headersheaders, jsondata) if response.status_code 429: print(触发速率限制) # 1. 优先检查 Retry-After retry_after response.headers.get(Retry-After) wait_time 60 # 默认等待60秒 if retry_after: try: # 尝试解析为秒数 wait_time int(retry_after) print(f根据 Retry-After 头部需要等待 {wait_time} 秒。) except ValueError: # 如果解析失败可能是日期格式这里简化处理等待默认时间 # 生产环境应解析日期并计算差值 print(fRetry-After 为日期格式: {retry_after}将等待默认时间。) # 2. 检查自定义头部 (例如 OpenAI 旧版 API 可能使用) reset_time response.headers.get(X-RateLimit-Reset) if reset_time: try: reset_timestamp int(reset_time) current_timestamp int(time.time()) wait_time max(reset_timestamp - current_timestamp, 1) # 计算需要等待的秒数 print(f根据 X-RateLimit-Reset限制将在 {wait_time} 秒后重置。) except (ValueError, TypeError): pass print(f等待 {wait_time} 秒后重试...) time.sleep(wait_time) # 这里可以递归调用或通过循环重试 # return make_request_with_retry_info() return None # ... 处理成功和其他错误 ...关键点始终优先使用服务端返回的Retry-After信息这是最准确的。如果没有再使用自定义头部或一个保守的默认回退策略。4. 实现基础重试机制最简单的应对策略是“遇到429就等待然后重试”。我们可以用循环和time.sleep实现一个基础版本。4.1 简单循环重试import time import requests from requests.exceptions import RequestException def simple_retry_request(max_retries5, initial_backoff1): 一个简单的带重试的请求函数。 initial_backoff: 首次回退等待的秒数后续会指数级增加。 for attempt in range(max_retries): try: response requests.post(url, headersheaders, jsondata, timeout30) if response.status_code 200: return response.json() elif response.status_code 429: retry_after response.headers.get(Retry-After) if retry_after and retry_after.isdigit(): wait int(retry_after) else: # 指数退避1, 2, 4, 8, 16... wait initial_backoff * (2 ** attempt) print(f尝试 {attempt1}/{max_retries} 失败 (429)。等待 {wait} 秒。) time.sleep(wait) continue # 继续下一次循环尝试 else: # 其他非429错误如400, 401, 500等通常重试无意义直接抛出 print(f请求失败状态码: {response.status_code}) response.raise_for_status() # 抛出HTTPError异常 except RequestException as e: # 网络层面的异常如超时、连接错误可以重试 print(f尝试 {attempt1}/{max_retries} 发生网络异常: {e}) if attempt max_retries - 1: raise # 重试次数用尽抛出异常 wait initial_backoff * (2 ** attempt) time.sleep(wait) # 所有重试都耗尽且未成功 raise Exception(f请求失败已达到最大重试次数 {max_retries}。) # 使用示例 try: result simple_retry_request(max_retries3, initial_backoff2) print(最终成功:, result) except Exception as e: print(f所有重试均失败: {e})这个示例包含了几个重要实践区分错误类型只对429和网络异常进行重试。对于400参数错误、401认证失败等客户端错误重试是没用的。指数退避如果服务端没有提供Retry-After我们使用指数退避策略避免在服务恢复瞬间再次“轰炸”API。设置最大重试次数防止无限重试卡死程序。超时设置为请求设置timeout避免网络问题导致线程长期挂起。5. 使用高级重试库Backoff/Tenacity手动管理重试逻辑容易出错且代码冗长。使用专门的库可以让代码更清晰、更健壮。这里以backoff库为例。5.1 使用backoff装饰器backoff库通过装饰器的方式可以非常优雅地为任何函数添加重试逻辑。import backoff import requests from requests.exceptions import HTTPError, RequestException # 定义一个自定义的异常检查函数告诉 backoff 在什么情况下需要重试 def fatal_code(e): 定义哪些 HTTP 状态码是‘致命’的即不应重试的。 # 429 是需要重试的所以返回 False非致命 # 400, 401, 403, 404, 422 等客户端错误不应重试 return 400 e.response.status_code 500 and e.response.status_code ! 429 backoff.on_exception( backoff.expo, # 使用指数退避策略 (HTTPError, RequestException), # 捕获这些异常进行重试判断 max_tries5, # 最大尝试次数包括第一次 giveupfatal_code, # 遇到“致命”错误时放弃重试 on_backofflambda details: print(f第{details[tries]}次重试等待{details[wait]:.1f}秒...) # 回调函数打印日志 ) def make_request_with_backoff(): 使用 backoff 装饰的请求函数 response requests.post( url, headersheaders, jsondata, timeout30 ) # 如果状态码不是2xx会抛出 HTTPError 异常从而触发 backoff 的重试判断逻辑 response.raise_for_status() return response.json() # 使用示例 try: result make_request_with_backoff() print(请求成功:, result) except HTTPError as e: if e.response.status_code 429: print(即使重试后仍然收到 429 错误。可能需要检查配额或降低请求频率。) else: print(f发生客户端或服务器错误 ({e.response.status_code}): {e.response.text}) except Exception as e: print(f其他异常: {e})backoff的优势声明式配置重试策略清晰可见。灵活的退避策略支持expo指数、constant固定、fibonacci斐波那契等。精细的异常控制通过giveup参数可以精确控制哪些异常应该停止重试。丰富的钩子on_backoff,on_giveup,on_success等回调函数方便记录日志和监控。5.2 结合Retry-After头部进行智能等待上面的backoff例子使用了固定的指数退避。我们可以进一步优化使其优先尊重服务端的Retry-After头部。import backoff import requests import time def get_wait_time_from_response(response): 从响应中提取建议的等待时间 retry_after response.headers.get(Retry-After) if retry_after and retry_after.isdigit(): return int(retry_after) # 如果没有提供返回 None让 backoff 使用自己的策略 return None backoff.on_predicate( backoff.expo, # 基础退避策略 predicatelambda r: r is None, # 当函数返回 None 时重试 max_tries5, on_backofflambda details: print(f等待重试...尝试次数: {details[tries]}), jitterNone, # 暂时关闭抖动 ) def smart_request(): 智能请求优先使用服务端返回的等待时间 response requests.post(url, headersheaders, jsondata, timeout30) if response.status_code 200: return response.json() elif response.status_code 429: wait_time get_wait_time_from_response(response) if wait_time: print(f收到 429根据 Retry-After 等待 {wait_time} 秒。) time.sleep(wait_time) else: print(f收到 429但未提供 Retry-After将使用指数退避。) # 返回 None 会触发 backoff.on_predicate 的重试 return None else: # 其他错误直接抛出异常这会中断重试 response.raise_for_status() # 使用 try: result smart_request() if result: print(成功:, result) else: print(重试次数用尽仍未成功。) except requests.exceptions.HTTPError as e: print(f非429错误请求失败: {e})这个方案结合了backoff的重试框架和我们自定义的、基于Retry-After的等待逻辑更加智能。6. 构建健壮的 LLM API 客户端类在实际项目中我们通常会将 API 调用封装成一个客户端类集成错误处理、日志、监控等功能。下面是一个面向生产的简化示例。6.1 客户端类设计import logging import time from typing import Optional, Dict, Any import requests from requests.exceptions import RequestException, HTTPError # 配置日志 logging.basicConfig(levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s) logger logging.getLogger(__name__) class RobustLLMClient: 一个健壮的 LLM API 客户端内置速率限制处理。 def __init__(self, api_key: str, base_url: str https://api.openai.com/v1, default_model: str gpt-3.5-turbo): self.api_key api_key self.base_url base_url self.default_model default_model self.session requests.Session() self.session.headers.update({ Authorization: fBearer {self.api_key}, Content-Type: application/json }) # 用于记录每个终端的请求时间实现客户端限流可选 self.request_timestamps [] def _handle_rate_limit(self, response: requests.Response) - int: 处理 429 响应返回建议等待的秒数。 wait_time 60 # 默认回退时间 # 1. 检查标准 Retry-After retry_after response.headers.get(Retry-After) if retry_after: try: wait_time int(retry_after) logger.info(f速率限制。服务端要求等待: {wait_time}秒 (Retry-After)。) return wait_time except ValueError: # 可能是日期格式简化处理使用默认值 logger.warning(f无法解析 Retry-After 头部: {retry_after}。使用默认等待。) # 2. 检查常见自定义头部 custom_wait None for header in [X-RateLimit-Reset, x-ratelimit-reset-requests]: reset_val response.headers.get(header) if reset_val: try: reset_time int(reset_val) current_time int(time.time()) custom_wait max(reset_time - current_time, 1) logger.info(f速率限制。根据 {header} 计算等待: {custom_wait}秒。) break except (ValueError, TypeError): continue if custom_wait: return custom_wait # 3. 使用指数退避的默认值这里简化实际应由调用者管理退避 logger.info(f速率限制。未从头部获取等待时间使用默认值: {wait_time}秒。) return wait_time def chat_completion(self, messages: list, model: Optional[str] None, max_retries: int 3, **kwargs) - Optional[Dict[str, Any]]: 发送聊天补全请求带有自动重试。 Args: messages: 消息列表。 model: 模型名称默认为初始化时设置的 default_model。 max_retries: 最大重试次数不包括首次请求。 **kwargs: 其他传递给 API 的参数如 temperature, max_tokens 等。 Returns: API 的响应字典如果最终失败则返回 None。 model model or self.default_model endpoint f{self.base_url}/chat/completions payload { model: model, messages: messages, **kwargs } last_exception None for attempt in range(max_retries 1): # 1 包括第一次尝试 try: logger.debug(f尝试请求 (尝试 {attempt1}/{max_retries1})...) response self.session.post(endpoint, jsonpayload, timeout60) if response.status_code 200: logger.info(请求成功。) return response.json() elif response.status_code 429: wait_seconds self._handle_rate_limit(response) if attempt max_retries: # 如果不是最后一次尝试则等待 logger.warning(f触发速率限制。等待 {wait_seconds} 秒后重试。) time.sleep(wait_seconds) continue # 继续下一次尝试 else: logger.error(f达到最大重试次数 ({max_retries})仍被限流。) # 这里可以抛出特定异常或返回错误信息 last_exception HTTPError(fRate limited after {max_retries} retries.) break else: # 对于其他 HTTP 错误记录并立即失败 logger.error(fHTTP 错误 {response.status_code}: {response.text[:200]}) response.raise_for_status() # 抛出异常终止循环 except RequestException as e: logger.warning(f网络/请求异常 (尝试 {attempt1}): {e}) if attempt max_retries: # 网络错误使用简单的指数退避 wait_seconds 2 ** attempt logger.info(f等待 {wait_seconds} 秒后重试。) time.sleep(wait_seconds) last_exception e continue else: logger.error(f达到最大重试次数网络问题持续。) last_exception e break # 所有重试都失败后的处理 logger.error(聊天补全请求最终失败。) # 可以选择抛出最后一个异常或返回一个错误结构 # raise last_exception if last_exception else Exception(Unknown error) return None def close(self): 关闭会话释放资源。 self.session.close() # 使用示例 if __name__ __main__: import os api_key os.getenv(OPENAI_API_KEY) if not api_key: print(请设置 OPENAI_API_KEY 环境变量) exit(1) client RobustLLMClient(api_keyapi_key) try: messages [{role: user, content: 用一句话介绍你自己。}] result client.chat_completion(messages, max_retries2, temperature0.7) if result: print(回复:, result[choices][0][message][content]) else: print(请求失败未获得结果。) finally: client.close()这个RobustLLMClient类提供了会话管理使用requests.Session复用连接提升性能。集中化的限流处理_handle_rate_limit方法统一解析各种限流头部。可配置的重试chat_completion方法内置了针对429和网络异常的重试逻辑。详细的日志便于监控和调试。资源清理提供了close方法。7. 高级策略与最佳实践对于生产级应用仅仅重试是不够的。我们需要从系统层面设计更稳健的策略。7.1 客户端限流节流在服务端限流之外在客户端主动控制请求速率是预防429错误的第一道防线。import time import threading from collections import deque from datetime import datetime, timedelta class RateLimiter: 一个简单的令牌桶算法实现用于客户端限流。 def __init__(self, requests_per_minute: int): self.capacity requests_per_minute self.tokens self.capacity self.last_refill time.time() self.refill_rate self.capacity / 60.0 # 每秒补充的令牌数 self.lock threading.Lock() def _refill(self): 补充令牌 now time.time() time_passed now - self.last_refill new_tokens time_passed * self.refill_rate if new_tokens 0: with self.lock: self.tokens min(self.capacity, self.tokens new_tokens) self.last_refill now def acquire(self, tokens1): 获取令牌如果不够则阻塞直到足够。 while True: with self.lock: self._refill() if self.tokens tokens: self.tokens - tokens return True # 令牌不足短暂睡眠后重试 time.sleep(0.01) # 10毫秒 # 在客户端中使用 class AdvancedLLMClient(RobustLLMClient): def __init__(self, api_key: str, requests_per_minute: int 60, **kwargs): super().__init__(api_key, **kwargs) self.rate_limiter RateLimiter(requests_per_minute) def chat_completion_with_throttle(self, messages: list, **kwargs): 带客户端限流的请求 self.rate_limiter.acquire() # 获取一个令牌如果超过速率会阻塞 return self.chat_completion(messages, **kwargs)关键点将客户端限流值设置为略低于服务端公布的限制例如服务端限制 60 RPM客户端设置为 50 RPM为突发流量和网络延迟留出缓冲空间。7.2 异步处理与队列对于需要发送大量请求的场景如批量处理文档使用异步和非阻塞模式可以大幅提高效率。import asyncio import aiohttp import backoff # 注意backoff 也支持异步需要安装 backoff 的异步支持或使用 tenacity async def async_make_request(session, url, headers, data, semaphore): 使用信号量控制并发数的异步请求 async with semaphore: # 控制并发量 async with session.post(url, headersheaders, jsondata) as response: if response.status 429: retry_after response.headers.get(Retry-After, 1) wait int(retry_after) if retry_after.isdigit() else 1 print(f被限流等待 {wait} 秒) await asyncio.sleep(wait) # 这里应该实现重试逻辑示例简化了 return None elif response.status 200: return await response.json() else: text await response.text() raise Exception(fHTTP {response.status}: {text}) async def batch_process_requests(api_key, prompts, max_concurrent5): 批量处理请求 url https://api.openai.com/v1/chat/completions headers {Authorization: fBearer {api_key}, Content-Type: application/json} # 使用信号量限制最大并发数 semaphore asyncio.Semaphore(max_concurrent) async with aiohttp.ClientSession() as session: tasks [] for prompt in prompts: data {model: gpt-3.5-turbo, messages: [{role: user, content: prompt}]} task asyncio.create_task(async_make_request(session, url, headers, data, semaphore)) tasks.append(task) results await asyncio.gather(*tasks, return_exceptionsTrue) return results # 使用示例 # asyncio.run(batch_process_requests(api_key, [prompt1, prompt2, ...]))7.3 监控与告警在生产环境中必须监控429错误率。记录日志将所有429错误以及相关的Retry-After时间、请求端点、时间戳记录到日志系统如 ELK、Splunk。设置指标在监控系统如 Prometheus中为429错误设置计数器。配置告警当429错误率超过阈值例如过去5分钟内超过10%时触发告警通知开发或运维人员。这可能意味着业务量突增需要申请提高配额。客户端限流逻辑有 bug。服务端出现异常。7.4 降级与熔断当持续遇到429错误时应考虑服务降级策略避免级联失败。熔断器模式如果连续 N 个请求都失败包括429则“熔断”一段时间直接快速失败或返回缓存内容不再请求上游服务。返回缓存内容对于某些可缓存的查询如常见问答可以在首次成功请求后缓存结果当遇到限流时返回缓存的旧数据。切换备用服务如果使用了多个 LLM 供应商当主供应商持续限流时可以自动将流量切换到备用供应商。8. 常见问题排查清单当你的应用遇到429错误时可以按照以下清单进行排查问题现象可能原因排查步骤与解决方案偶发性429错误瞬时流量超过限制1. 检查客户端是否实现限流。2. 分析日志看错误是否集中在特定时间点。3. 考虑在客户端增加请求间隔的随机抖动Jitter避免定时任务同时触发。持续性429错误1. 总体请求频率超标。2. Token 消耗超标TPM限制。3. API Key 配额用尽。1.核对服务商控制台查看用量统计、速率限制和剩余配额。2.计算 Token 消耗检查发送的文本长度长文本会消耗大量 Token。使用tiktoken等库估算。3.检查多个应用或进程是否有多处服务使用同一个 API Key429错误伴随其他错误如400请求格式错误导致服务端处理异常可能被计为异常请求。1. 确保请求参数如model名称正确。例如网络热词中提到的deepseek-v4-pro或deepseek-v4-flash。2. 检查messages数组格式是否正确。3. 验证 JSON 负载是否有效。异步/多线程下429激增并发控制失效多个线程/协程同时发出大量请求。1. 使用信号量Semaphore或连接池限制全局并发数。2. 确保客户端限流器如令牌桶是线程/协程安全的。使用了代理或中转站代理IP被多人共用触发基于IP的限流。1. 联系代理服务商确认。2. 考虑使用独享IP的代理或直接连接。错误信息不明确服务端返回的429响应体可能包含更详细的错误信息。打印完整的响应体print(response.json())。可能会看到{error: {message: Rate limit exceeded for requests..., type: rate_limit_error}}等详细信息。9. 总结与核心要点处理 LLM API 的HTTP 429错误是一个从被动应对到主动防御的系统工程。核心要点总结如下理解根源429是服务端的保护机制客户端的目标是适配而非对抗。优先解析头部Retry-After是服务端给你的最佳建议务必优先使用。实现智能重试结合指数退避和Retry-After使用backoff或tenacity库让代码更健壮。实施客户端限流在发出请求前就控制好节奏这是预防429最有效的手段。设计异步与队列对于批量任务利用异步IO和队列来平滑请求流量。完善监控告警将429视为重要的系统指标进行监控及时发现配额不足或程序异常。准备降级方案在持续限流时要有熔断、缓存、降级策略保证核心业务不中断。在实际开发中建议将上述策略封装成公司内部统一的 LLM SDK 或中间件确保所有业务线都能以一致、稳健的方式调用大模型服务。这样不仅能减少429错误也能提升整个系统的可观测性和可维护性。从网络热议的api error: 400 this models maximum context length或api error: 402 insufficient balance可以看出LLM API 的错误类型多样。429只是其中一种但因其与业务流量直接相关处理得好坏直接影响用户体验和系统稳定性。掌握本文介绍的方法你就能构建出更能适应生产环境挑战的 AI 应用。
返回列表