多模型支持的架构设计:如何集成 10+ AI 模型

26 阅读1分钟

Blade 多模型 AI 系统架构:从统一接口到智能路由

blade-code 系列第 3 篇。本文基于 Blade 源码(2026年2月)探讨多模型 AI 系统的架构设计。

为什么要支持多模型?

构建 AI 应用时,第一个问题往往是:"用哪个模型?"

  • OpenAI GPT-4.5?强大但贵
  • Claude Opus 4?代码能力强但有速率限制
  • DeepSeek V3?便宜但稳定
  • 智谱 GLM-4.7?需配置

我的答案是:全都要

blade-code 从第一天就设计为多模型架构,基于 Vercel AI SDK 构建统一接口,支持 80+ 主流模型无缝切换。

单一模型的问题

问题影响
成本高GPT-4.5 输入 $15/M tokens
速率限制Claude 每分钟请求数有限
服务中断OpenAI 宕机时干瞪眼
能力差异不同任务需要不同模型

多模型架构能解决这些问题:

成本优化 — 简单任务用便宜模型,复杂任务用强大模型:

// 简单任务
const summary = await model.generate('总结这段文字', {
  model: 'deepseek-chat' // $0.28/M input
});

// 复杂任务
const architecture = await model.generate('设计系统架构', {
  model: 'claude-opus-4' // $15/M input
});

高可用 — 主模型挂了自动切换:

const response = await model.generate(prompt, {
  model: 'gpt-4.5',
  fallback: ['claude-sonnet-4', 'deepseek-chat']
});

统一接口设计

架构概览

graph TB
    subgraph "Blade ModelManager"
        MM[ModelManager]
        MM --> |管理| P1[OpenAI Provider]
        MM --> |管理| P2[Anthropic Provider]
        MM --> |管理| P3[Google/Gemini Provider]
        MM --> |管理| P4[DeepSeek Provider]
        MM --> |管理| P5[Azure Provider]
    end
    
    subgraph "Vercel AI SDK"
        AI[AI SDK Core]
        AI --> |抽象| CP[createOpenAICompatible]
        AI --> |抽象| CA[createAnthropic]
        AI --> |抽象| CD[createDeepSeek]
        AI --> |抽象| CG[createGoogleGenerativeAI]
    end
    
    subgraph "统一接口"
        PI[IChatService Interface]
        PI --> |chat| GEN[生成响应]
        PI --> |streamChat| STR[流式响应]
    end
    
    P1 -.-> |实现| PI
    P2 -.-> |实现| PI
    P3 -.-> |实现| PI
    P4 -.-> |实现| PI

IChatService 统一接口

所有模型提供商都实现统一的 IChatService 接口:

// packages/agent-sdk/src/services/ChatServiceInterface.ts

export interface IChatService {
  chat(messages: Message[], tools?: Tool[], signal?: AbortSignal): Promise<ChatResponse>;
  streamChat(messages: Message[], tools?: Tool[], signal?: AbortSignal): AsyncGenerator<StreamChunk>;
  getConfig(): ChatConfig;
  updateConfig(newConfig: Partial<ChatConfig>): void;
}

export interface ChatResponse {
  content: string;
  reasoningContent?: string;  // Thinking 模型的推理过程
  toolCalls?: ChatCompletionMessageToolCall[];
  usage?: UsageInfo;
}

export interface UsageInfo {
  promptTokens: number;
  completionTokens: number;
  totalTokens: number;
  reasoningTokens?: number;
  cacheCreationInputTokens?: number;  // Anthropic: 缓存创建
  cacheReadInputTokens?: number;      // Anthropic: 缓存读取
}

Provider 工厂

基于 Vercel AI SDK 的 Provider 工厂:

// packages/agent-sdk/src/services/VercelAIChatService.ts

private createModel(config: ChatConfig): LanguageModel {
  const { provider, apiKey, baseUrl, model } = config;

  switch (provider) {
    case 'anthropic':
      return createAnthropic({ apiKey, baseURL: baseUrl })(model);
    case 'gemini':
      return createGoogleGenerativeAI({ apiKey, baseURL: baseUrl })(model);
    case 'deepseek':
      return createDeepSeek({ apiKey, baseURL: baseUrl })(model);
    default:
      // OpenAI 兼容接口(覆盖 100+ 模型)
      return createOpenAICompatible({ name: 'custom', apiKey, baseURL: baseUrl })(model);
  }
}

模型管理

ModelManager

// packages/agent-sdk/src/agent/ModelManager.ts

export class ModelManager {
  private chatService!: IChatService;
  private currentModelId?: string;

  async initialize(modelId?: string): Promise<IChatService> {
    const modelConfig = this.resolveModelConfig(modelId);
    await this.applyModelConfig(modelConfig);
    return this.chatService;
  }

  async switchModelIfNeeded(modelId: string): Promise<boolean> {
    if (modelId === this.currentModelId) return false;
    
    const modelConfig = this.config.models?.find((m) => m.id === modelId);
    if (!modelConfig) return false;

    await this.applyModelConfig(modelConfig);
    return true;
  }
}

运行时切换

# 启动时指定模型
blade --model=claude-opus-4 "优化代码"

# 运行时切换
> /model claude-sonnet-4
✅ 已切换到 claude-sonnet-4

# 仅当前轮使用指定模型
> /model once deepseek-chat 总结这段代码

成本优化

Token 追踪

Blade 实时追踪每次请求的 Token 使用:

// packages/agent-sdk/src/services/ChatServiceInterface.ts

export interface UsageInfo {
  promptTokens: number;
  completionTokens: number;
  totalTokens: number;
  reasoningTokens?: number;
  cacheCreationInputTokens?: number;
  cacheReadInputTokens?: number;
}

模型成本对比

模型输入 ($/M)输出 ($/M)特点
gpt-4.5$15.00$75.00旗舰
gpt-4o$2.50$10.00均衡
gpt-4o-mini$0.15$0.60轻量
claude-opus-4$15.00$75.00代码最强
claude-sonnet-4$3.00$15.00性价比
deepseek-chat$0.28$1.10性价比王
deepseek-reasoner$0.55$2.19推理
groq-llama-4$0.20$0.20高速

Prompt Caching

Anthropic/DeepSeek 支持 prompt caching,缓存命中时成本降低 90%:

提供商正常输入缓存命中节省
Anthropic$5/M$0.50/M90%
OpenAI$1.75/M$0.175/M90%
DeepSeek$0.28/M$0.028/M90%

核心设计原则

  1. 抽象优于具体 — Vercel AI SDK 隔离具体实现
  2. 组合优于继承 — 通过组合不同 Provider 实现多模型支持
  3. 配置优于硬编码 — 模型选择、降级策略都可配置
  4. 监控优于盲目 — 实时追踪 Token 使用和成本

参考资源


本文由 青雲 (echoVic) 撰写,基于 blade-code 的实践经验。 如有问题或建议,欢迎在 GitHub Issues 讨论。