如何处理模型速率限制
运行大型评估作业时,一个常见问题是遇到第三方 API 速率限制,通常来自模型提供商。以下是一些处理速率限制的方法。
使用 langchain
RateLimiters(仅限 Python)
如果您在应用程序或评估器中使用 langchain
Python ChatModels,您可以向您的模型添加速率限制器,这将增加客户端对发送到模型提供商 API 的请求频率的控制,以避免速率限制错误。
- Python
from langchain.chat_models import init_chat_model
from langchain_core.rate_limiters import InMemoryRateLimiter
rate_limiter = InMemoryRateLimiter(
requests_per_second=0.1, # <-- Super slow! We can only make a request once every 10 seconds!!
check_every_n_seconds=0.1, # Wake up every 100 ms to check whether allowed to make a request,
max_bucket_size=10, # Controls the maximum burst size.
)
llm = init_chat_model("gpt-4o", rate_limiter=rate_limiter)
def app(inputs: dict) -> dict:
response = llm.invoke(...)
...
def evaluator(inputs: dict, outputs: dict, reference_outputs: dict) -> dict:
response = llm.invoke(...)
...
请参阅 langchain 文档以了解有关如何配置速率限制器的更多信息。
使用指数退避重试
处理速率限制错误的一个非常常见的方法是使用指数退避重试。使用指数退避重试意味着重复重试失败的请求,并在每次重试之间使用(指数级)增加的等待时间。这种情况会持续到请求成功或达到最大请求次数。
使用 langchain
如果您正在使用 langchain
组件,您可以使用 .with_retry(...)
/ .withRetry()
方法向所有模型调用添加重试
- Python
- TypeScript
from langchain import init_chat_model
llm_with_retry = init_chat_model("gpt-4o-mini").with_retry(stop_after_attempt=6)
import { initChatModel } from "langchain/chat_models/universal";
const llm = await initChatModel("gpt-4o", {
modelProvider: "openai",
});
const llmWithRetry = llm.withRetry({ stopAfterAttept: 2 });
请参阅 langchain
Python 和 JS API 参考以获取更多信息。
不使用 langchain
如果您不使用 langchain
,您可以使用其他库(如 tenacity
(Python) 或 backoff
(Python))来实现指数退避重试,或者您可以从头开始实现它。请参阅 OpenAI 文档,了解如何执行此操作的一些示例。
限制最大并发数
限制您对应用程序和评估器发出的并发调用数量是另一种减少模型调用频率的方法,从而避免速率限制错误。max_concurrency
可以直接在 evaluate() / aevaluate() 函数上设置。这通过有效地跨线程拆分数据集来并行化评估。
- Python
- TypeScript
from langsmith import aevaluate
results = await aevaluate(
...
max_concurrency=4,
)
import { evaluate } from "langsmith/evaluation";
await evaluate(..., {
...,
maxConcurrency: 4,
});