【多模型接入架构实战】如何同时接入GPT、Gemini、Claude并统一管理?(避免代码爆炸的终极方案)
一、问题场景
我在做AI工具系统初期,只接了一个模型(比如Gemini),代码很简单:
python
response = gemini.generate(prompt)
一开始没问题,但很快用户开始提需求:
- 能不能加GPT?
- Claude写代码更强,能切换吗?
- 哪个便宜用哪个可以吗?
👉 于是我直接加了判断逻辑:
python
if model == "gpt":
return call_gpt()
elif model == "gemini":
return call_gemini()
结果一周后代码直接炸了:
- 每个接口都在写 if/else
- 不同模型参数完全不一样
- 想加新模型要改10多个文件
👉 典型的"早期设计不当导致系统不可扩展"
二、问题分析
1. 不同模型协议完全不一致
| 模型 | 输入格式 | 特点 |
|---|---|---|
| GPT | messages[] | 标准对话 |
| Gemini | prompt | 简单 |
| Claude | messages + system | 特殊 |
👉 如果不抽象,代码会越来越乱
2. 业务逻辑耦合模型
错误写法:
python
def chat(model, input):
if model == "gpt":
...
👉 业务层直接依赖模型细节
三、解决方案(核心设计思想)
👉 统一接口 + 适配器模式 + 工厂模式
架构如下:
text
业务层
↓
统一模型接口(BaseModel)
↓
模型适配层(Adapter)
↓
具体模型实现(GPT / Gemini / Claude)
四、实操步骤(完整实现)
步骤1:定义统一接口
python
from abc import ABC, abstractmethod
class BaseModel(ABC):
@abstractmethod
def generate(self, messages):
pass
步骤2:实现GPT适配器
python
class GPTModel(BaseModel):
def generate(self, messages):
# 模拟调用
return {
"model": "gpt",
"content": "GPT response"
}
步骤3:实现Gemini适配器
python
class GeminiModel(BaseModel):
def generate(self, messages):
prompt = self._convert(messages)
return {
"model": "gemini",
"content": "Gemini response"
}
def _convert(self, messages):
return " ".join([m["content"] for m in messages])
步骤4:工厂模式统一管理
python
class ModelFactory:
_models = {
"gpt": GPTModel,
"gemini": GeminiModel,
}
@classmethod
def get_model(cls, name):
if name not in cls._models:
raise ValueError("Unsupported model")
return cls._models[name]()
步骤5:业务层调用(关键)
python
def chat(model_name, messages):
model = ModelFactory.get_model(model_name)
return model.generate(messages)
👉 从此业务层完全不关心具体模型
五、验证结果
优化前:
- 新增模型:改10+文件
- 切换模型:大量if判断
优化后:
- 新增模型:只加一个类
- 切换模型:参数级完成
👉 开发效率提升至少3倍
六、踩坑记录(真实经验)
1️⃣ 不要把API key写在模型类里
👉 应该统一放配置中心
2️⃣ 不同模型返回结构不统一
👉 必须做标准化输出
python
return {
"content": "...",
"usage": {},
"model": "xxx"
}
3️⃣ 超时机制一定要做
👉 不然某个模型卡死拖垮系统
七、总结
多模型系统的核心不是"支持多个模型",而是:
👉 让模型"可替换"
八、优化建议(进阶)
- 加入负载均衡(自动选模型)
- 加入成本策略(优先便宜模型)
- 加入Fallback机制(失败自动切换)
九、下一篇预告
👉 【Prompt工程系统】如何让AI输出稳定、可控、可复用?