本文将深入讲解如何在 FastAPI AI 聊天应用中设计和实现多模型厂商架构,让你的应用能够灵活切换不同的 AI 提供商,提升系统的可靠性和成本效益。即使你是架构设计新手,也能跟着本教程掌握多厂商集成的核心技术。

📖 项目地址:https://github.com/wayn111/fastapi-ai-chat-demo

项目概述

想象一下,你的 AI 聊天应用不再依赖单一的 AI 提供商,而是能够智能地在 OpenAI、DeepSeek、通义千问等多个厂商之间切换。当某个服务出现问题时,可以切换到备用提供商;当需要降低成本时,可以选择性价比更高的模型。这就是我们要构建的多模型厂商架构!

在本章节中,我们重构了前端界面,使其更加美观,参考 lobechat 界面风格。

核心功能

  • 多厂商统一管理:一套代码支持多个 AI 提供商,无需重复开发
  • 智能故障转移:主提供商不可用时自动切换到备用提供商
  • 成本优化策略:根据不同场景选择最经济的模型
  • 动态提供商发现:新增提供商无需修改核心代码
  • 统一接口设计:所有提供商使用相同的调用方式

技术栈

  • 核心框架:FastAPI(高性能异步 Web 框架)
  • AI 集成:OpenAI SDK(统一的 AI 接口标准)
  • 设计模式:工厂模式 + 抽象工厂模式
  • 配置管理:环境变量 + 动态配置
  • 数据存储:Redis(会话和配置缓存)

🤖 支持的 AI 厂商

厂商 代表模型 特色 成本水平
OpenAI GPT-4, GPT-3.5-turbo 综合能力强,生态完善 较高
DeepSeek deepseek-chat, deepseek-coder 性价比高,推理能力强
通义千问 qwen-turbo, qwen-plus 中文理解优秀,阿里生态 中等

🏗️ 核心架构设计

🎯 设计理念

我们的多模型厂商架构基于三个核心设计原则:

1. 统一接口原则所有 AI 提供商都遵循相同的接口规范,就像不同品牌的手机都使用相同的充电接口一样。这样可以确保切换提供商时不需要修改业务代码。

2. 开放扩展原则新增 AI 提供商时,只需要继承基类并配置几个参数,系统会自动发现并集成新的提供商。

3. 故障隔离原则每个提供商都是独立的实例,一个提供商的故障不会影响其他提供商的正常工作。

🏛️ 架构层次

我们的架构分为四个清晰的层次,每一层都有明确的职责:

1. 抽象接口层(BaseAIProvider)

这是整个架构的"宪法",定义了所有 AI 提供商必须遵循的接口规范:

from  abc  import  ABC, abstractmethod 
 from  typing  import  List, Dict, Any, AsyncGenerator 
 
 class BaseAIProvider(ABC): 
      """AI提供商抽象基类 - 定义统一接口规范""" 
 
      def __init__(self, config: Dict[str, Any]): 
          """初始化提供商配置""" 
         self.config = config 
         self.provider_name = self.__class__.__name__.replace( 'Provider' ,  '' ).lower() 
 
     @abstractmethod 
      async def generate_response(self, messages: List[AIMessage], **kwargs) -> AIResponse: 
          """生成AI响应 - 所有提供商必须实现""" 
          pass 
 
     @abstractmethod 
      async def generate_streaming_response(self, messages: List[AIMessage], **kwargs) -> AsyncGenerator[str, None]: 
          """生成流式响应 - 支持实时对话""" 
          pass 
 
     @abstractmethod 
      def validate_config(self) -> bool: 
          """验证配置有效性""" 
          pass 

为什么这样设计?

  • 强制规范:所有提供商都必须实现这些方法
  • 统一流式响应:所有厂商使用同一套流式响应
  • 安全性:每个厂商都需要验证配置有效性
2. 兼容适配层(OpenAICompatibleProvider)

这一层是我们架构的"翻译官",将 OpenAI 的接口标准适配给所有提供商:

class OpenAICompatibleProvider(BaseAIProvider): 
      """OpenAI兼容提供商基类 - 统一OpenAI SDK调用方式""" 
 
      # 子类需要重写的配置 
     DEFAULT_BASE_URL =  None 
     DEFAULT_MODEL =  None 
     PROVIDER_NAME =  None 
     AVAILABLE_MODELS = [] 
 
      def __init__(self, config: Dict[str, Any]): 
          """初始化OpenAI兼容客户端""" 
         super().__init__(config) 
         self.client =  None 
         self._initialize_client() 
 
      def _initialize_client(self): 
          """初始化OpenAI SDK客户端""" 
          try : 
             api_key = self.get_config_value( 'api_key' ) 
              if not  api_key: 
                 logger.error( f"{self.get_provider_display_name()}API密钥为空" ) 
                  return 
 
              # 使用OpenAI SDK,但指向不同厂商的API端点 
             self.client = OpenAI( 
                 api_key=api_key, 
                 base_url=self.get_config_value( 'base_url' , self.DEFAULT_BASE_URL) 
             ) 
             logger.info( f"{self.get_provider_display_name()}客户端初始化成功" ) 
          except  Exception  as  e: 
             logger.error( f"客户端初始化失败: {e}" ) 
             self.client =  None 

核心优势:

  • 代码复用:所有兼容 OpenAI 接口的厂商都可以复用这套代码
  • 维护简单:所有厂商共用一套 openai 的 api 接口调用逻辑
  • 标准统一:所有厂商都使用同一套流式响应,使用相同的消息格式和参数
3. 具体提供商实现层

这一层是各个 AI 厂商的"身份证",每个提供商只需要声明自己的基本信息,继承 OpenAICompatibleProvider 即可。

class DeepseekProvider(OpenAICompatibleProvider): 
      """DeepSeek提供商实现 - 只需配置基本信息""" 
 
      # 提供商配置 - 这就是全部需要的代码! 
     DEFAULT_BASE_URL =  'https://api.deepseek.com/v1' 
     DEFAULT_MODEL =  'deepseek-chat' 
     PROVIDER_NAME =  'DeepSeek' 
     AVAILABLE_MODELS = [ 
          'deepseek-chat' ,       # 通用对话模型 
          'deepseek-coder' ,      # 代码专用模型 
          'deepseek-math' ,       # 数学推理模型 
          'deepseek-reasoner'     # 深度推理模型 
     ] 

实现原理:

  • 继承复用:继承 OpenAICompatibleProvider 获得所有通用功能
  • 配置驱动:只需要配置几个类变量就完成了集成
  • 自动发现:系统会自动扫描并注册这个提供商
4. 工厂管理层(AIProviderFactory)

这是整个架构的"大脑",负责动态发现、创建和管理所有提供商:

class AIProviderFactory: 
      """AI提供商工厂 - 统一管理所有提供商""" 
 
      # 提供商实例缓存 
     _instances: Dict[str, BaseAIProvider] = {} 
      # 动态发现的提供商类缓存 
     _discovered_providers: Optional[Dict[str, Type[BaseAIProvider]]] =  None 
 
     @classmethod 
      def _discover_providers(cls) -> Dict[str, Type[BaseAIProvider]]: 
          """动态发现所有提供商类 - 这是魔法发生的地方""" 
          if  cls._discovered_providers  is not None : 
              return  cls._discovered_providers 
 
         providers = {} 
 
          # 扫描 ai_providers 包中的所有模块 
          import  ai_providers 
         package_path = ai_providers.__path__ 
 
          for  importer, modname, ispkg  in  pkgutil.iter_modules(package_path): 
              if  modname.endswith( '_provider' )  and  modname !=  'openai_compatible_provider' : 
                  try : 
                      # 动态导入模块 
                     module = importlib.import_module( f'ai_providers.{modname}' ) 
 
                      # 查找继承自OpenAICompatibleProvider的类 
                      for  name, obj  in  inspect.getmembers(module, inspect.isclass): 
                          if  (issubclass(obj, OpenAICompatibleProvider)  and 
                             obj != OpenAICompatibleProvider  and 
                             hasattr(obj,  'PROVIDER_NAME' )): 
 
                             provider_key = name.lower().replace( 'provider' ,  '' ) 
                             providers[provider_key] = obj 
                             logger.debug( f"发现提供商: {provider_key} -> {name}" ) 
 
                  except  Exception  as  e: 
                     logger.warning( f"导入模块 {modname} 时出错: {e}" ) 
 
         cls._discovered_providers = providers 
         logger.info( f"动态发现 {len(providers)} 个提供商: {list(providers.keys())}" ) 
          return  providers 

工厂模式的威力:

  • 动态发现:自动扫描并注册新的提供商,无需手动配置
  • 实例缓存:相同配置的提供商实例会被缓存,提高性能
  • 统一创建:所有提供商都通过工厂创建,确保一致性
🔄 多提供商管理器

在工厂的基础上,我们还提供了多提供商管理器,让你可以同时管理多个提供商:

class MultiProviderManager: 
      """多提供商管理器 - 统一管理多个AI提供商实例""" 
 
      def __init__(self, configs: Dict[str, Dict[str, Any]]): 
          """初始化多提供商管理器

        Args:
            configs: 多个提供商的配置,格式:{provider_name: config}
        """ 
         self.providers: Dict[str, BaseAIProvider] = {} 
         self.default_provider =  None 
 
          # 初始化所有配置的提供商 
          for  provider_name, config  in  configs.items(): 
              try : 
                 provider = AIProviderFactory.create_provider(provider_name, config) 
                  if  provider.validate_config(): 
                     self.providers[provider_name] = provider 
                     logger.info( f"提供商 {provider_name} 初始化成功" ) 
 
                      # 设置默认提供商 
                      if  self.default_provider  is None : 
                         self.default_provider = provider_name 
                  else : 
                     logger.warning( f"提供商 {provider_name} 配置验证失败" ) 
              except  Exception  as  e: 
                 logger.error( f"提供商 {provider_name} 初始化失败: {e}" ) 
 
      def get_available_providers(self) -> List[str]: 
          """获取所有可用的提供商列表""" 
          return  list(self.providers.keys()) 
🔧 环境变量配置

在项目根目录创建 .env 文件:

REDIS_HOST="127.0.0.1" 
 REDIS_PORT=6379 
 REDIS_PASSWORD="" 
 
 # =========================================== 
 # AI 提供商配置(至少配置一个) 
 # =========================================== 
 
 # OpenAI 配置 
 OPENAI_API_KEY=sk-your-openai-api-key 
 OPENAI_BASE_URL=https://api.openai.com/v1  # 可选,默认官方地址 
 OPENAI_MODEL=gpt-4o  # 可选,默认模型 
 
 # DeepSeek 配置 
 DEEPSEEK_API_KEY=sk-your-deepseek-api-key 
 DEEPSEEK_MODEL=deepseek-chat  # 可选 
 
 # 通义千问配置 
 QIANWEN_API_KEY=sk-your-qianwen-api-key 
 QIANWEN_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 
 
 # =========================================== 
 # 应用配置 
 # =========================================== 
 DEFAULT_AI_PROVIDER=deepseek  # 默认使用的提供商 
 MAX_TOKENS=1000               # 最大生成长度 
 TEMPERATURE=0.7              # 创造性参数 
🏗️ 配置类设计

我们使用配置类来统一管理所有配置项:

class Config: 
      """应用配置管理类""" 
 
      # 应用基础配置 
     APP_NAME =  "FastAPI AI Chat Demo" 
      # ... 
 
      # 新增AI提供商基础信息 
     _AI_PROVIDERS_INFO = { 
          'openai' : { 
              'base_url' :  'https://api.openai.com/v1' , 
              'model' :  'gpt-4o' 
         }, 
          'deepseek' : { 
              'base_url' :  'https://api.deepseek.com/v1' , 
              'model' :  'deepseek-chat' 
         }, 
          'qianwen' : { 
              'base_url' :  'https://dashscope.aliyuncs.com/compatible-mode/v1' , 
              'model' :  'qwen-turbo' 
         } 
     } 
 
      # AI提供商配置 - 动态生成 
     @classmethod 
      def _get_ai_providers_config(cls) -> dict: 
          """获取所有AI提供商配置""" 
          return  {provider: cls._build_provider_config(provider)  for  provider  in  cls._AI_PROVIDERS_INFO.keys()} 
 
      # 延迟初始化AI提供商配置 
     @property 
      def AI_PROVIDERS_CONFIG(self) -> dict: 
          if not  hasattr(self,  '_ai_providers_config' ): 
             self._ai_providers_config = self._get_ai_providers_config() 
          return  self._ai_providers_config 
 
     @classmethod 
      def get_all_ai_configs(cls) -> dict: 
          """获取所有已配置API Key的AI提供商配置""" 
         configs = cls._get_ai_providers_config() 
          return  {name: config  for  name, config  in  configs.items()  if  config.get( 'api_key' )} 
 

在 Config 配置中新增 AI 提供商核心配置。

📡 核心 API 接口

1. 获取可用提供商列表
@app.get("/providers") 
 async def get_providers(): 
      """获取可用的AI提供商列表""" 
     logger.info( "获取AI提供商列表" ) 
      try : 
         configured_providers = Config.get_configured_providers() 
         all_models = ai_manager.get_all_available_models() 
 
         providers_info = [] 
          for  provider  in  configured_providers: 
             provider_obj = ai_manager.get_provider(provider) 
              if  provider_obj: 
                 providers_info.append({ 
                      "id" : provider, 
                      "name" : provider_obj.get_provider_name(), 
                      "models" : provider_obj.get_available_models(), 
                      "is_default" : provider == Config.DEFAULT_AI_PROVIDER 
                 }) 
 
          return  { 
              "providers" : providers_info, 
              "default_provider" : Config.DEFAULT_AI_PROVIDER, 
              "all_models" : all_models 
         } 
      except  Exception  as  e: 
         logger.error( f"获取AI提供商列表失败: {e}" ) 
          raise  HTTPException(status_code= 500 , detail= f"获取提供商列表失败: {str(e)}" ) 

/providers 接口会返回所有可用 AI 提供商,以及对应模型。

2. 流式聊天接口(支持提供商选择)
@app.get("/chat/stream") 
 async def chat_stream(
    user_id: str = Query(..., description="用户ID"),
    session_id: str = Query(..., description="会话ID"),
    message: str = Query(..., description="用户消息"),
    role: str = Query("assistant", description="AI角色"),
    provider: Optional[str] = Query(None, description="AI提供商"),
    model: Optional[str] = Query(None, description="AI模型")
): 
      """流式聊天接口""" 
     logger.info( f"流式聊天请求 - 用户: {user_id}, 会话: {session_id[:8]}..., 角色: {role}, 消息长度: {len(message)}, 提供商: {provider}" ) 
 
      if  role  not in  AI_ROLES: 
         logger.warning( f"不支持的AI角色: {role}" ) 
          raise  HTTPException(status_code= 400 , detail= "不支持的AI角色" ) 
 
      return  StreamingResponse( 
         generate_streaming_response(user_id, session_id, message, role, provider, model), 
         media_type= "text/event-stream" , 
         headers={ 
              "Cache-Control" :  "no-cache" , 
              "Connection" :  "keep-alive" , 
              "Access-Control-Allow-Origin" :  "*" 
         } 
     ) 

流式聊天接口参数中新增 AI 提供商以及 AI 模型参数。

🛠️ 扩展新提供商实现

🚀 快速添加新提供商

对于支持 OpenAI API 格式的提供商,只需几行代码即可集成:

这里用 moonshot 作为新厂商接入,在 ai_providers 目录下新增 moonshot_provider.py 文件,

# ai_providers/moonshot_provider.py 
 from  ai_providers.openai_compatible_provider  import  OpenAICompatibleProvider 
 
 class MoonshotProvider(OpenAICompatibleProvider): 
      """月之暗面 Kimi 提供商""" 
     DEFAULT_BASE_URL =  "https://api.moonshot.cn/v1" 
     DEFAULT_MODEL =  "moonshot-v1-8k" 
     PROVIDER_NAME =  "moonshot" 
     AVAILABLE_MODELS = [ 
          "moonshot-v1-8k" , 
          "moonshot-v1-32k" , 
          "moonshot-v1-128k" 
     ] 
环境变量配置

在 .env 文件中新增 moonshot 配置

# Moonshot (月之暗面) 
 MOONSHOT_API_KEY=sk-your-moonshot-api-key 
 MOONSHOT_BASE_URL=https://api.moonshot.cn/v1   # 可选 
 MOONSHOT_MODEL=moonshot-v1-8k   # 可选 
配置类更新

config.py 中添加 moonshot 配置,

class Config: 
      # ... 现有配置 ... 
 
      # AI提供商基础信息 
     _AI_PROVIDERS_INFO = { 
          'openai' : { 
              'base_url' :  'https://api.openai.com/v1' , 
              'model' :  'gpt-4o' 
         }, 
          'deepseek' : { 
              'base_url' :  'https://api.deepseek.com/v1' , 
              'model' :  'deepseek-chat' 
         }, 
          'qianwen' : { 
              'base_url' :  'https://dashscope.aliyuncs.com/compatible-mode/v1' , 
              'model' :  'qwen-turbo' 
         }, 
          'moonshot' : { 
              'base_url' :  'https://api.moonshot.cn/v1' , 
              'model' :  'moonshot-v1-8k' 
         } 
     } 

通过以上步骤,您可以轻松扩展支持任何新的 AI 提供商,系统会自动发现并集成新的提供商,无需修改核心代码。

📚 总结

本文详细介绍了如何在 FastAPI 应用中构建一个灵活、可扩展的多模型厂商架构。通过抽象接口层、兼容适配层、具体实现层和工厂管理层的四层架构设计,实现了所有 AI 提供商的统一接口调用,支持 OpenAI、DeepSeek、通义千问等多个厂商的无缝集成。核心采用工厂模式和抽象工厂模式,配合动态提供商发现机制,新增厂商只需几行代码即可完成集成。

最后觉得本文写的不错的话,可以关注我,我会继续更新 FastAPI 框架开发 AI 聊天应用代码。

大模型算是目前当之无愧最火的一个方向了,算是新时代的风口!有小伙伴觉得,作为新领域、新方向人才需求必然相当大,与之相应的人才缺乏、人才竞争自然也会更少,那转行去做大模型是不是一个更好的选择呢?是不是更好就业呢?是不是就暂时能抵抗35岁中年危机呢?

答案当然是这样,大模型必然是新风口!

那如何学习大模型 ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。但是具体到个人,只能说是:

最先掌握AI的人,将会比较晚掌握AI的人有竞争优势。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

但现在很多想入行大模型的人苦于现在网上的大模型老课程老教材,学也不是不学也不是,基于此我用做产品的心态来打磨这份大模型教程,深挖痛点并持续修改了近100余次后,终于把整个AI大模型的学习路线完善出来!

在这里插入图片描述

在这个版本当中:

您只需要听我讲,跟着我做即可,为了让学习的道路变得更简单,这份大模型路线+学习教程已经给大家整理并打包分享出来, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉CSDN大礼包🎁:全网最全《LLM大模型学习资源包》免费分享(安全咨料,放心领取)👈

一、大模型经典书籍(免费分享)

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源

在这里插入图片描述

二、640套大模型报告(免费分享)

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)
在这里插入图片描述

三、大模型系列视频教程(免费分享)

在这里插入图片描述

四、2025最新大模型学习路线(免费分享)

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

img

L1阶段:启航篇丨极速破界AI新时代

L1阶段:了解大模型的基础知识,以及大模型在各个行业的应用和分析,学习理解大模型的核心原理、关键技术以及大模型应用场景。

img

L2阶段:攻坚篇丨RAG开发实战工坊

L2阶段:AI大模型RAG应用开发工程,主要学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

img

L3阶段:跃迁篇丨Agent智能体架构设计

L3阶段:大模型Agent应用架构进阶实现,主要学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造Agent智能体。

img

L4阶段:精进篇丨模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调,并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

img

L5阶段:专题集丨特训篇 【录播课】

img

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方二维码免费领取

👉CSDN大礼包🎁:全网最全《LLM大模型学习资源包》免费分享(安全资料,放心领取)👈

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐