如何处理模型速率限制
运行大型评估作业时的一个常见问题是遇到第三方 API 速率限制,通常来自模型提供商。 有几种方法可以处理速率限制。
用langchainRateLimiters(仅限 Python)
如果您使用的是langchainPython Chat模型,您可以向模型添加速率限制器,这将添加对发送到模型提供程序 API 的请求的频率的客户端控制,以避免速率限制错误。
- 蟒
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()方法:
- 蟒
- 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
限制您对应用程序和评估器进行的并发调用的数量是降低您进行的模型调用频率的另一种方法,从而避免速率限制错误。max_concurrency可以直接在 evaluate() / aevaluate() 函数上设置。
这通过跨线程有效地拆分数据集来并行化评估。
- 蟒
- TypeScript (类型脚本)
from langsmith import aevaluate
results = await aevaluate(
...
max_concurrency=4,
)
import { evaluate } from "langsmith/evaluation";
await evaluate(..., {
...,
maxConcurrency: 4,
});