跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
JavaAIjava

Spring AI 实现多模型共存:基于 OpenAI 协议调用 ChatGPT 与千问

在 Spring AI 项目中同时配置多个使用相同 OpenAI 协议的大模型(如 ChatGPT 和通义千问)时,默认配置仅支持注入一个 ChatModel Bean。解决方案是自定义配置属性类和自动装配类,采用不同于 openai 的配置前缀(如 spring.ai.qwen)以避免 Bean 冲突。通过仿照 OpenAI 标准实现创建新的 ChatModel 类,即可在同一项目中并行调用不同的大模型服务,无需引入各模型自家的 SDK,保持框架原生操作的一致性。

监控大屏发布于 2026/3/16更新于 2026/5/316 浏览

前言

在做 Spring AI 项目的时候,如果想引入多个大模型,会发现似乎无法直接通过单一配置实现。

当然,这里指的是只导入 Spring AI 框架的东西,不引入各个大模型自家的 SDK 情况下,并且两个大模型的协议还是相同的。

原因很简单:同一个 ChatModel 的实现类仅能实现一个。比如我们都知道的,千问其实可以用 OpenAI 的 API 协议,引入 open-ai 的 maven,在配置文件配置千问的参数即可。

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>

但是,如果你还要再使用 ChatGPT 模型呢?那我怎么配置?很明显这时候就不行了。虽然这概率不是很大,但是这也确确实实是我团队的项目中遇到的一个障碍点。

问题原因

(这里不讲太深,不细扒底层源码,讲一下大致的流程和用到的类而已)

在 Spring AI 框架中,调用大模型 API 的流程其实就是你配置一个客户端 ChatClient,ChatClient 会配置 ChatModel,真正发起大模型调用的是这个 ChatModel,在 ChatModel 会按照自家的 API 协议封装请求体,比如 OpenAI API 协议用的是 org.springframework.ai.openai.api.OpenAiApi。调用完成后,再封装成 Spring AI 框架的 ChatResponse 返回。

以上是最简单的流程。如果我同时要实现 ChatGPT 的调用和千问的调用,发现用的都是 OpenAI 协议,而使用这个协议的 ChatModel 目前只有 OpenAiChatModel。你不能通过配置文件实现两个 OpenAiChatModel。你要么配置 ChatGPT 的配置,要么配置 Qwen 的配置。最终 Spring 框架也只会自动给你注入一个 Bean(这块在 Spring AI 框架中的 OpenAIChatAutoConfiguration 中)。

下面就来说说怎么解决。

解决后的效果

配置文件跟原生配置方式一样一点都不用变。

配置客户端的时候直接用我们写好的 QwenChatModel 即可,跟使用 OpenAIChatModel 一样,自动装配的,无需操心。这样子你的项目里既可以有调用 GPT 的 ChatClient 也可以再有一个调用 Qwen 的 ChatClient 了。而且非常简单方便,完全都是原生相同的操作。

接下来我们看看实现方式吧

实现方式

核心是我们再实现一个同样适用 OpenAIAPI 接口的 ChatModel 实现类,且自动装配要按照我们自己的前缀 (不能使用 openai 前缀不然就冲突了)

理解其实就很简单了,撸起袖子加油干!

配置类

首先看一下 Spring 原来的 OpenAIChatModel 是怎么自动装配的:

org.springframework.ai.model.openai.autoconfigure.OpenAiChatAutoConfiguration

关键在他的装配条件:

@ConditionalOnClass(OpenAiApi.class)
@EnableConfigurationProperties({ OpenAiConnectionProperties.class, OpenAiChatProperties.class })
@ConditionalOnProperty(name = SpringAIModelProperties.CHAT_MODEL, havingValue = SpringAIModels.OPENAI, matchIfMissing = true)

意思是:当项目的 classpath 中存在 OpenAiApi 类,并且应用配置中明确指定(或未指定但默认)使用 OpenAI 作为聊天模型时,Spring 容器才会自动启用并加载 OpenAiConnectionProperties 和 OpenAiChatProperties 这两个配置属性类。

OpenAiConnectionProperties 和 OpenAiChatProperties 都继承了 OpenAiParentProperties。

那我们就仿造他的这三个配置属性类自己实现:

需要创建以下文件:

  • QwenParentProperties.java
  • QwenChatProperties.java
  • QwenConnectionProperties.java

可以看到我们使用配置前缀是 spring.ai.qwen。当然你想改成什么都可以。

在 Properties 类中,有用到 Options 类,也就是具体的配置参数。这里虽然绝大部分和 OpenAI 协议一样,但我们还自己写一个,方便后面自己扩展。

  • QwenChatOptions.java

这里太长了,下面是代码部分。完整的直接参考:org.springframework.ai.openai.OpenAiChatOptions。只需要把 OpenAiChatOptions 改成 QwenChatOptions 即可。

好,接下来我们就要自动装配我们的 ChatModel 了。可以先把自动装配类写了,ChatModel 下一步再实现。

  • QwenChatAutoConfiguration.java

现在,QwenChatAutoConfiguration 就可以帮我们实现根据配置文件的配置,装配一个我们想要的第二个 ChatModel,这里我叫做 qwenChatModel。

注意,上面这段里一句:

QwenAutoConfigurationUtil.ResolvedConnectionProperties resolved = resolveConnectionProperties(commonProperties, chatProperties, "chat");

这是哪来的?我们是仿造 OpenAI 的 Configuration,使用先去看一下他的这段的作用:他是解析参数的,我们直接仿造他写一个即可,这里细节一点就是提示信息可以变动一下,不然以后报错都不能一眼看出是哪的配置出问题了。

  • QwenAutoConfigurationUtil.java

核心 ChatModel 的实现类

很好,现在我们就完成了自动装配的功能。下面着重实现 ChatModel,也就是核心部分。核心思想其实也就是把类名换成自己的比如 QwenChatModel,然后里面的 Options 使用上面我们自己实现的即可。

  • QwenChatModel.java

原代码太长了,我压缩了很多换行和空格。如果不是应急的话可以自己去实现一下。参考 org.springframework.ai.openai.OpenAiChatModel。

使用

到这里我们的项目已经可以根据 Properties 类中配置的前缀注入我们自定义的 ChatModel 的 Bean 了。那么我们怎么去使用?其实跟 OpenAIChatModel 使用一样。在配置类里配置一个 ChatClient 使用我们自己的 ChatModel 即可。调用的时候调用这个 ChatClient。

最后

到这里我们就可以实现根据自己的配置前缀为我们自己的项目配置多个相同协议的 ChatModel 的实现了。这个场景来源于真实的项目里,这个任务并不是很急所以我并没有引入千问的 sdk 而是保持 Spring AI 框架这一套的导入,在里面添加完成这个需求。

在 25 年 7 月的时候,如果用 spring-ai-starter-model-openai (当时还不是这个名字) 调用千问,如果大模型调用了工具@Tool 而且时流式输出,会出现适配的问题,虽然不知道现在还有没有,但是上面这种实现方式可以很好地解决这个问题,如果以后项目中出现千问流式调用工具的适配问题,我直接修改我自己实现的类即可。

目录

  1. 前言
  2. 问题原因
  3. 解决后的效果
  4. 实现方式
  5. 配置类
  6. 核心 ChatModel 的实现类
  7. 使用
  8. 最后
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • MoltBot 机器人集成钉钉 Stream 流式接入配置
  • 无线联邦学习:隐私保护下的 AI 协同进化
  • 无网络环境下 libwebkit2gtk-4.1-0 离线安装指南
  • MySQL 和 Navicat Windows 安装与连接教程
  • 无人机植物病害目标检测数据集(1500 张已标注)
  • 无人机发展简史:古代飞行探索历程
  • 算法模拟专题:LeetCode 精选例题解析
  • Microsoft Edge WebView2 运行时安装与故障排查指南
  • 从 Java 8 升级到 Java 21:核心新特性对比与实战指南
  • AIGC 人脸资产标准化生产方案:Face3D.ai Pro 企业实操
  • 无人机智能航线规划系统构建指南
  • 商业活动中人形机器人与机器狗的现场表演与交付验证
  • HarmonyOS6 RcButton 组件核心架构与设计思想解析
  • 无人机相关法律法规全体系梳理
  • Rust 复合类型高级用法:结构体、枚举与模式匹配
  • 无人机路径规划算法详解
  • Spring Boot 微服务架构设计与实战
  • 无人机航拍目标检测与语义分割数据集汇总
  • 麒麟 V10 ARM64 环境部署 WebLogic 12c 实战
  • 基于博弈论自适应策略与 CVACA 固定路径策略的多无人机部署仿真

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online