跳到主要内容
Open In ColabOpen on GitHub

Upstash 速率限制回调

在本指南中,我们将介绍如何使用 UpstashRatelimitHandler 基于请求数量或令牌数量添加速率限制。此处理程序使用 Upstash 的 ratelimit 库,该库利用 Upstash Redis

Upstash 速率限制的工作原理是每次调用 limit 方法时,都向 Upstash Redis 发送 HTTP 请求。检查和更新用户的剩余令牌/请求。根据剩余令牌,我们可以停止执行昂贵的操作,例如调用 LLM 或查询向量存储

response = ratelimit.limit()
if response.allowed:
execute_costly_operation()

UpstashRatelimitHandler 允许您在几分钟内将速率限制逻辑整合到您的链中。

首先,您需要转到 Upstash 控制台 并创建一个 redis 数据库 (请参阅我们的文档)。创建数据库后,您需要设置环境变量

UPSTASH_REDIS_REST_URL="****"
UPSTASH_REDIS_REST_TOKEN="****"

接下来,您需要使用以下命令安装 Upstash Ratelimit 和 Redis 库

pip install upstash-ratelimit upstash-redis

您现在可以准备好向您的链添加速率限制了!

按请求速率限制

假设我们希望允许用户每分钟调用我们的链 10 次。实现这一点非常简单,只需

# set env variables
import os

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

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

# create ratelimit
ratelimit = Ratelimit(
redis=Redis.from_env(),
# 10 requests per window, where window size is 60 seconds:
limiter=FixedWindow(max_requests=10, window=60),
)

# create handler
user_id = "user_id" # should be a method which gets the user id
handler = UpstashRatelimitHandler(identifier=user_id, request_ratelimit=ratelimit)

# create mock chain
chain = RunnableLambda(str)

# invoke chain with handler:
try:
result = chain.invoke("Hello world!", config={"callbacks": [handler]})
except UpstashRatelimitError:
print("Handling ratelimit.", UpstashRatelimitError)
Error in UpstashRatelimitHandler.on_chain_start callback: UpstashRatelimitError('Request limit reached!')
``````output
Handling ratelimit. <class 'langchain_community.callbacks.upstash_ratelimit_callback.UpstashRatelimitError'>

请注意,我们将处理程序传递给 invoke 方法,而不是在定义链时传递处理程序。

对于 FixedWindow 以外的速率限制算法,请参阅 upstash-ratelimit 文档

在执行管道中的任何步骤之前,速率限制将检查用户是否已超过请求限制。如果是,则会引发 UpstashRatelimitError

按令牌速率限制

另一种选择是基于以下内容对链调用进行速率限制

  1. 提示中的令牌数量
  2. 提示和 LLM 完成中的令牌数量

这仅在您的链中包含 LLM 时才有效。另一个要求是您使用的 LLM 应在其 LLMOutput 中返回令牌使用情况。

工作原理

处理程序将在调用 LLM 之前获取剩余令牌。如果剩余令牌大于 0,则将调用 LLM。否则,将引发 UpstashRatelimitError

调用 LLM 后,令牌使用信息将用于从用户的剩余令牌中扣除。在此链阶段不会引发任何错误。

配置

对于第一个配置,只需像这样初始化处理程序

ratelimit = Ratelimit(
redis=Redis.from_env(),
# 1000 tokens per window, where window size is 60 seconds:
limiter=FixedWindow(max_requests=1000, window=60),
)

handler = UpstashRatelimitHandler(identifier=user_id, token_ratelimit=ratelimit)

对于第二个配置,以下是如何初始化处理程序

ratelimit = Ratelimit(
redis=Redis.from_env(),
# 1000 tokens per window, where window size is 60 seconds:
limiter=FixedWindow(max_requests=1000, window=60),
)

handler = UpstashRatelimitHandler(
identifier=user_id,
token_ratelimit=ratelimit,
include_output_tokens=True, # set to True
)

您还可以同时采用基于请求和令牌的速率限制,只需传递 request_ratelimittoken_ratelimit 参数即可。

这是一个使用 LLM 的链的示例

# set env variables
import os

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

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

# create ratelimit
ratelimit = Ratelimit(
redis=Redis.from_env(),
# 500 tokens per window, where window size is 60 seconds:
limiter=FixedWindow(max_requests=500, window=60),
)

# create handler
user_id = "user_id" # should be a method which gets the user id
handler = UpstashRatelimitHandler(identifier=user_id, token_ratelimit=ratelimit)

# create mock chain
as_str = RunnableLambda(str)
model = ChatOpenAI()

chain = as_str | model

# invoke chain with handler:
try:
result = chain.invoke("Hello world!", config={"callbacks": [handler]})
except UpstashRatelimitError:
print("Handling ratelimit.", UpstashRatelimitError)
Error in UpstashRatelimitHandler.on_llm_start callback: UpstashRatelimitError('Token limit reached!')
``````output
Handling ratelimit. <class 'langchain_community.callbacks.upstash_ratelimit_callback.UpstashRatelimitError'>

此页是否对您有所帮助?