返回日志
3 分钟阅读

使用 Vercel AI SDK 构建高可用的多模型服务商 AI 路由层

本实战指南将介绍如何使用 Vercel AI SDK 和 Zod 构建生产级 LLM 路由层,实现自动故障转移(failover)、备用模型配置及类型安全的结构化数据输出。

Vercel AI SDKTypeScriptLLM RoutingZodAI Engineering
使用 Vercel AI SDK 构建高可用的多模型服务商 AI 路由层

在生产环境中部署大语言模型(LLM)时,可靠性往往是最大的瓶颈。仅依赖单一模型服务商会带来单点故障风险:例如 API 速率限制(HTTP 429)、服务商临时宕机(HTTP 500/503)或突发的延迟飙升。

为了保证服务可用性与成本效率,团队需要一个动态路由层,能够根据输入参数自动切换到备用模型或更换服务商。

在本指南中,我们将使用 Vercel AI SDK 和 Zod 实现一个高可用且类型安全的多服务商路由层。


LLM 容灾架构设计

一个高可用的路由层基于以下三个核心原则运行:

  1. 顺序故障转移(Failover):如果首选服务商失败,系统会自动使用备用服务商重试请求。
  2. 动态选择:短文本提示被发送到快速、低成本的模型,而较大的输入则被路由到高上下文模型。
  3. 类型安全验证:无论由哪个模型处理请求,输出的 Schema 都保持一致并经过验证。
               +-------------------+
               |  Incoming Request |
               +-------------------+
                         |
                         v
             +-----------------------+
             | Dynamic Route Selector|
             +-----------------------+
               /                   \
        (Short Input)          (Long Input)
             /                       \
            v                         v
   +-----------------+       +-----------------+
   |  Primary Model  |       |  Primary Model  |
   | (OpenAI Luna)   |       | (Gemini-3.1-Pro)|
   +-----------------+       +-----------------+
            |                         |
       (On Failure)              (On Failure)
            v                         v
   +-----------------+       +-----------------+
   | Fallback Model  |       | Fallback Model  |
   | (Gemini-3.5-Fl) |       | (Claude-Sonnet5)|
   +-----------------+       +-----------------+
            \                         /
             \                       /
              v                     v
            +-------------------------+
            |  Zod Schema Validation  |
            +-------------------------+
                        |
                        v
               +-------------------+
               | Validated Output  |
               +-------------------+

使用 Vercel AI SDK 实现 Fallback

Vercel AI SDK 提供了内置的 fallback 包装器,允许你指定模型的优先级列表。如果对第一个模型的调用失败,SDK 会自动使用数组中的后续模型进行重试。

以下是如何初始化一个带有备用服务商的容灾模型:

import { fallback } from 'ai';
import { openai } from '@ai-sdk/openai';
import { google } from '@ai-sdk/google';
import { anthropic } from '@ai-sdk/anthropic';

// Initialize a resilient model that crosses three distinct providers
export const resilientModel = fallback([
  openai('terra'),
  anthropic('claude-sonnet-5'),
  google('gemini-3.1-pro')
]);

当你使用 resilientModel 调用 generateTextgenerateObject 时,SDK 会自动处理错误、超时和重试逻辑。

使用 Ollama 实现本地 Fallback

为了支持离线可用、混合云环境或在本地测试期间实现零成本执行,你可以通过 Ollama 集成本地托管的模型。Vercel AI SDK 将 Ollama 模型视为一等公民服务商,允许你直接从云端 API 故障转移到本地硬件(本地芯片)。

以下是配置混合云到本地故障转移的方法:

import { fallback } from 'ai';
import { openai } from '@ai-sdk/openai';
import { ollama } from '@ai-sdk/ollama';

// Fallback to a locally hosted Llama 4 Scout model if the OpenAI API is unreachable
export const hybridModel = fallback([
  openai('luna'),
  ollama('llama4-scout')
]);

类型安全的结构化数据提取

多服务商路由的挑战之一是确保不同的模型输出严格符合相同的结构。使用 Zod 配合 generateObject API 可以轻松解决这个问题。

让我们定义一个 Schema,用于从原始开发人员简历文本中提取结构化元数据:

import { generateObject } from 'ai';
import { z } from 'zod';
import { resilientModel } from './models';

const ProfileSchema = z.object({
  fullName: z.string(),
  skills: z.array(z.string()),
  yearsOfExperience: z.number(),
  certifications: z.array(
    z.object({
      name: z.string(),
      issuer: z.string()
    })
  )
});

export async function extractProfile(text: string) {
  try {
    const { object } = await generateObject({
      model: resilientModel,
      schema: ProfileSchema,
      prompt: `Extract structured profile details from the following resume text:\n\n${text}`
    });

    return object;
  } catch (error) {
    console.error('Failed to extract profile after exhausting all fallbacks:', error);
    throw new Error('Profile extraction failed');
  }
}

由于输出在运行时由 Zod 进行解析和验证,无论备用链中的哪个模型执行成功,你的应用程序代码都可以放心使用返回的数据结构。


基于上下文大小的动态路由

虽然顺序故障转移可以防止彻底的服务中断,但它并没有针对成本或 Token 限制进行优化。例如,将一个 100,000 Token 的文档发送给限制为 128,000 Token 的模型是没问题的,但如果发送给限制为 16,000 Token 的模型,则会立即触发错误。

我们可以构建一个动态路由器,在选择模型链之前检查输入大小:

import { LanguageModel, generateText } from 'ai';
import { openai } from '@ai-sdk/openai';
import { google } from '@ai-sdk/google';
import { anthropic } from '@ai-sdk/anthropic';

// Define specialized model chains
const standardChain = fallback([
  openai('luna'),
  google('gemini-3.5-flash')
]);

const highContextChain = fallback([
  google('gemini-3.1-pro'),
  anthropic('claude-sonnet-5')
]);

// Estimate token count (simple word-count approximation for demo)
function estimateTokens(text: string): number {
  return text.trim().split(/\s+/).length * 1.3;
}

export async function smartRouteRequest(promptText: string) {
  const tokenEstimate = estimateTokens(promptText);
  
  // Route to the appropriate chain based on input size
  const model = tokenEstimate > 50000 ? highContextChain : standardChain;

  return generateText({
    model,
    prompt: promptText
  });
}

这种模式通过将标准任务路由到低成本、高速度的模型来降低成本,同时将具有更大上下文窗口的高级模型留给重度负载。


遥测与可观测性(Observability)

为了监控路由层触发备用模型的频率,你可以接入 Vercel AI SDK 的实验性遥测功能。这可以收集有关 Token 使用量、延迟和模型服务商成功率的指标:

import { generateText } from 'ai';
import { resilientModel } from './models';

const response = await generateText({
  model: resilientModel,
  prompt: 'Analyze this log output...',
  experimental_telemetry: {
    isEnabled: true,
    functionId: 'analyze-logs',
    metadata: {
      environment: 'production'
    }
  }
});

这些 Trace 记录会汇总到标准的 OpenTelemetry 收集器中,让你的团队对故障转移和模型服务商的健康状况一目了然。


总结与权衡

多服务商路由层提高了系统的可靠性。然而,考虑以下权衡因素也很重要:

  • 风格差异:备用模型可能会表现出不同的写作风格、格式细微差别或合规特征。
  • 冷启动延迟:针对备用模型重试失败的请求会增加用户端的整体等待时间。
  • API 密钥管理:你的基础设施必须配置并维护多个服务商的 API 密钥、速率限制层级和计费账户。

通过使用 Vercel AI SDK 统一的 API 接口,你可以构建一个高度可用的路由架构,保护你的生产应用程序免受单个服务商宕机的影响。

Share this article