1152 字
约 3 分钟
3
Spring AI 多模型接入:模型路由与运行时切换

Spring AI 多模型接入:模型路由与运行时切换

真实 AI 项目通常不会只使用一个模型。

可能同时接入:

DeepSeek
智谱
通义
OpenAI
Claude
硅基流动

如果每接一个模型就在业务代码里加 if-else,很快就会失控。

因此更合理的设计是:

让 Agent 不关心具体模型,把模型选择和厂商适配下沉到基础设施层。

1. Provider:统一模型供应商

先定义统一接口:

public interface ModelProvider {

    String apiStyle();

    Model model(ModelConfig.ModelInfo info);
}

不同厂商分别实现:

OpenAIProvider
AliProvider
AnthropicProvider
...

最终统一返回 Spring AI 的:

Model

于是上层只依赖统一接口。

整体变成:

具体厂商
   ↓
ModelProvider
   ↓
Spring AI Model

这本质上是 Adapter + Factory


2. 插件化自动发现

每个 Provider 注册成 Spring Bean。

Provider 模块
    ↓
@AutoConfiguration
    ↓
Spring Boot 自动发现
    ↓
注册 ModelProvider

这样增加新厂商时,只需要新增实现模块,不需要修改核心业务代码。

这就是:

插件式模型接入。


3. ModelResolver:模型路由

系统可以使用统一模型标识:

zhipu#glm-4
deepseek#deepseek-chat
openai#gpt-x

其中:

deepseek#deepseek-chat
    │           │
 Provider    ModelName

启动时把所有 Provider 建成索引:

Map<String, ModelProvider> providerMap;

请求进来后:

用户
 ↓
模型偏好
 ↓
ModelResolver
 ↓
找到 Provider
 ↓
创建 / 获取 Model

这样就可以做到:

用户 A → 智谱
用户 B → DeepSeek
默认用户 → 全局默认模型

这就是 Model Routing


4. Agent 不直接操作模型

Agent 最好不要写:

DeepSeekChatModel model = ...

而是调用统一的:

llmCaller.call(...);

然后内部完成:

Agent
 ↓
LlmCaller
 ↓
ModelResolver
 ↓
ModelProvider
 ↓
具体 LLM

这样职责非常清楚:

Agent
负责业务逻辑

LlmCaller
负责调用流程

ModelResolver
负责选模型

ModelProvider
负责适配厂商

模型换了,Agent 不需要改。


5. 调用器也可以分层

不同场景需要的能力不同。

可以设计:

SimpleLlmCaller
模型 + Prompt

适合分类、摘要等一次性任务。

再往上:

MemoryLlmCaller
模型 + ChatMemory + Tools

适合普通 Agent。

再往上:

IdentityLlmCaller
模型 + Memory + Tools + 用户画像

适合个性化 Agent。

核心思想是:

不同调用器的区别,不是模型不同,而是给模型附加的上下文能力不同。


6. 优先复用 OpenAI 兼容协议

很多模型厂商都提供 OpenAI Compatible API。

例如只需要修改:

base-url:
api-key:
model:

底层仍然可以复用同一套 OpenAI Provider。

于是:

OpenAI Provider
      │
      ├── DeepSeek
      ├── 智谱
      └── 硅基流动

不需要每个厂商都重新写 Java 代码。

这里有一个很重要的架构思想:

优先按照协议抽象,而不是按照厂商抽象。

10 个厂商,可能只有两三种协议。

真正协议完全不同的模型,例如 Anthropic,再单独实现 Provider。


7. Model Cache

创建模型实例通常还包含:

HTTP Client
API Key
Base URL
Timeout
Retry
ToolCallingManager

所以没必要每次请求都重新创建。

可以:

provider + modelName
        ↓
     Cache

第一次创建:

ModelResolver
↓
build Model
↓
Cache

后续直接复用。


8. 运行时切换模型

生产环境不能每改一次模型配置就重启服务。

因此可以设计:

后台修改配置
     ↓
保存
     ↓
发布配置变更事件
     ↓
清理 Model Cache
     ↓
下一次请求重新构建 Model

这样就实现了:

Runtime Model Switching

模型切换从“代码部署行为”变成了“配置行为”。

运营人员就可以动态调整:

默认模型
用户模型
API Key
Base URL
模型名称

而不需要重新发布系统。


9. 最终架构

可以把整套系统记成:

                User
                  ↓
                Agent
                  ↓
              LlmCaller
                  ↓
             ModelResolver
                  ↓
          provider#modelName
                  ↓
             ModelProvider
            /      |       \
       OpenAI     Ali    Anthropic
          ↓
       Model Cache
          ↓
          LLM

10. 最值得沉淀的几个关键词

ModelProvider
ModelResolver
Model Routing
Adapter
Plugin Architecture
OpenAI Compatible
Model Cache
Runtime Switching

最核心的一句话是:

Agent 只依赖模型能力,不依赖具体模型;模型选择、协议适配和动态切换全部交给基础设施层。

这样今天用 DeepSeek,明天换智谱,后天接 Claude,业务 Agent 基本都不用改。

Spring AI 多模型接入:模型路由与运行时切换
http://www.clxhxhhr.top/posts/657/
作者
clxstart
发布于
2026-09-17
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。