如何为可运行对象添加备用方案以增强稳定性

105 阅读3分钟

引言

在使用语言模型(LLMs)开发应用程序时,无论是速率限制还是服务中断,底层API都可能出现问题。将LLM应用程序部署到生产环境时,保护应用程序免受这些问题的侵害变得越来越重要。为此,我们引入了“备用方案”的概念。备用方案是在紧急情况下可以采用的备用计划,确保你的应用程序在遇到故障时仍能保持稳定和连续运行。

主要内容

1. LLM API错误的备用方案

这是备用方案最常见的使用场景之一。LLM API请求可能因多种原因失败——API可能宕机,或者可能达到了速率限制。因此,使用备用方案有助于防范这些类型的问题。需要注意的是,很多LLM封装器默认会捕获错误并进行重试。在使用备用方案时,你需要关闭这些重试机制,否则第一个封装器会不断重试而不进入备用方案。

2. 序列的备用方案

我们还可以为序列(即多个步骤的流程)创建备用方案。例如,使用ChatOpenAI作为主要模型,并用常规OpenAI模型作为备用模型。由于OpenAI不是聊天模型,因此可能需要不同的提示模板。

3. 长输入的备用方案

LLM的一个主要限制因素是其上下文窗口大小。在难以提前跟踪输入长度的情况下,使用具有更长上下文窗口的模型进行回退处理是一种合理的做法。

4. 更优模型的备用方案

有时,我们要求模型以特定格式(例如JSON)输出。较高级的模型可能在这些任务上表现更好。因此,我们可以先尝试使用性能较快且较便宜的模型,如果解析失败,再使用更高级的模型。

代码示例

以下是关于如何使用备用方案的完整示例:

from langchain_anthropic import ChatAnthropic
from langchain_openai import ChatOpenAI
from unittest.mock import patch
from openai import RateLimitError
import httpx

# 初始化模型
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的RateLimitError
request = httpx.Request("GET", "/")
response = httpx.Response(200, request=request)
error = RateLimitError("rate limit", response=response, body="")

# 使用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")

# 使用备用方案
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")

# 使用API代理服务提高访问稳定性

常见问题和解决方案

  1. 如何处理多次重试不成功的情况?

    • 如果相同错误发生多次,可以考虑增加更多的备用方案或者调整调用策略。
  2. 在使用API代理服务时,如何提高访问稳定性?

    • 使用可靠的代理服务,并确保它能处理你目标API的特定错误,比如速率限制或服务中断。

总结和进一步学习资源

备用方案为开发者提供了一种灵活可靠的方法来应对LLM API潜在的故障。通过实施适当的备用方案,应用程序能够更好地处理错误并提供一致的用户体验。进一步学习可以关注以下资源:

参考资料

  • Langchain官方文档
  • OpenAI API使用指南

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

---END---