在使用大型语言模型(LLM)时,开发人员常常会遇到来自底层API的问题,如速率限制或停机。因此,在将LLM应用程序推向生产时,保护机制愈发重要。这时,我们引入了“回退”的概念。
技术背景介绍
回退机制 是在紧急情况下备用的计划。在LLM级别和整个可运行级别上应用回退都很重要。不同模型可能需要不同的提示,因此如果对OpenAI的调用失败,不仅仅是简单地将相同的提示发送给Anthropic,而更可能是需要用不同的提示模板发送不同版本。
核心原理解析
针对LLM API错误的回退 是最常见的使用场景。请求可能因为各种原因失败,如API停机或速率限制。因此,回退机制能帮助防止这些问题。
重要提示:默认情况下,许多LLM包装器会捕获错误并重试。使用回退时,您可能需要关闭这些重试机制,否则第一个包装器会一直重试而不失败。
代码实现演示
首先,让我们模拟OpenAI的RateLimitError:
%pip install --upgrade --quiet langchain langchain-openai
from langchain_anthropic import ChatAnthropic
from langchain_openai import ChatOpenAI
from unittest.mock import patch
import httpx
from openai import RateLimitError
# 模拟RateLimitError
request = httpx.Request("GET", "/")
response = httpx.Response(200, request=request)
error = RateLimitError("rate limit", response=response, body="")
# 创建OpenAI和Anthropic的LLM实例
openai_llm = ChatOpenAI(model="gpt-3.5-turbo-0125", max_retries=0) # 禁止自动重试
anthropic_llm = ChatAnthropic(model="claude-3-haiku-20240307")
llm = openai_llm.with_fallbacks([anthropic_llm])
# 使用OpenAI LLm并处理错误
with patch("openai.resources.chat.completions.Completions.create", side_effect=error):
try:
print(openai_llm.invoke("Why did the chicken cross the road?"))
except RateLimitError:
print("Hit error")
# 使用包含回退的LLM
with patch("openai.resources.chat.completions.Completions.create", side_effect=error):
try:
print(llm.invoke("Why did the chicken cross the road?"))
except RateLimitError:
print("Hit error")
应用场景分析
序列的回退 也可以为序列本身创建回退。在处理长输入时,您可能需要回退到具有更长上下文窗口的模型。
short_llm = ChatOpenAI()
long_llm = ChatOpenAI(model="gpt-3.5-turbo-16k")
llm = short_llm.with_fallbacks([long_llm])
inputs = "What is the next number: " + ", ".join(["one", "two"] * 3000)
try:
print(short_llm.invoke(inputs))
except Exception as e:
print(e)
try:
print(llm.invoke(inputs))
except Exception as e:
print(e)
实践建议
- 关闭默认重试:确保你的API请求不会因为内建重试机制而延长故障时间。
- 基于不同需求设计提示模板:在切换模型时,确保提示与模型特性匹配。
- 监控错误和行为:即使有回退机制,监控系统的错误日志以便及时改进策略。
如果遇到问题欢迎在评论区交流。
—END—