SpringBoot3集成多款主流大模型
集成:DeepSeek,豆包,混元,通义千问。
一、简介
2025年7月份,开始转型独立开发者。
第一款尝试的产品自然是AI方向,此前不具备专业的产品经验,所以只能更多的依赖大模型的能力。
年初DeepSeek成功证明模型即产品的理念,所以第一款产品尽量降低传统的产品设计思维,会把场景和流程交给大模型去处理,通过反复测试来调整干预的权重,找到一个相对平衡的比例。
有时候在反思,自己的脑回路会不会限制AI的发挥。
在产品的初期,先选择接入四款大模型,深度求索的DeepSeek,字节跳动的豆包,腾讯的混元,阿里的通义千问。
模型即产品,那产品是什么?
当然每家的大模型,都有自己的能力特点,这里只是从产品的整体功能考量,这几款模型可能更适合,后续可能也会在实践中做动态调整。
二、大模型自评
如何快速熟悉大模型的能力?多提问题,多和它来回拉扯。
首先给这几款大模型,抛出一个灵魂拷问:
作为一款很强的大模型,请你客观的分析DeepSeek,豆包,千问,混元,这四款大模型的差异,并从综合能力的角度给个排序。
看热闹不嫌事大,先让大模型自我分析一把,验证一下自己对它们的预期。
DeepSeek回答:

豆包回答:

通义千问回答:

混元回答:

各个大模型对于能力的排序,权当个热闹看一看。
不过有个结论可以得出来的:不同平台的业务和数据有很大差异,所以训练出来的模型能力也有差异。
此前文章中写过DeepSeek的代码测评,确实很惊艳;豆包的产品化能力,方便解决很多生活问题;混元经常用来分析行业热门事件;通义千问常用来提供业务设计的参考。
所以产品的不同功能,交给不同的大模型来处理,是比较合理的策略。
三、SpringBoot集成
从产品的业务需求出发,来设计后端框架的模型对接,既然需要集成多款大模型,自然是通用的组件更方便管理,通过测试对比个人倾向使用spring-ai-openai依赖包。
这几款模型的使用文档,都适配了OpenAI的接口规范,只是豆包有轻微的细节差异。
3.1 版本依赖
这里说一下简单的思路,是先敲定spring-ai-openai组件的版本,在这个组件中依赖spring-boot的3.3.6版本,以此定了后端的框架和版本。
<spring-boot.version>3.3.6</spring-boot.version>
<spring-ai-openai.version>1.0.0-M5</spring-ai-openai.version>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>${spring-ai-openai.version}</version>
</dependency>
</dependencies>
<!-- SpringBoot依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
3.2 配置和测试
首先看基础的Yaml配置文件,比较常见的就是请求的地址和方法,然后指定大模型使用的版本名称,这里要注意豆包配置的差异,千问和混元也是一样的方式。
spring:
# 大模型配置
ai:
openai:
base-url: https://api.deepseek.com
api-key: sk-deep-seek
chat:
# 默认配置
# 豆包大模型使用:/api/v3/chat/completions
completions-path: /v1/chat/completions
options:
model: deepseek-chat
简单做个测试的用例,构建ChatClient类,传入自定义的提示词,请求DeepSeek大模型,没有使用流式输出,所以请求响应的时间比较长。
@RestController
public class TestModelWeb {
private final ChatClient chatClient ;
public TestModelWeb(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
@GetMapping(value = "/client")
public String chatClient() {
String message = "讲个笑话,最好能把我听哭的那一种。";
return chatClient.prompt(new Prompt(message)).call().content();
}
}
3.3 多模型封装
通过配置文件管理模型的集成虽然简单高效,但是产品的场景中有模型动态选择的功能,所以做个简单的封装,在容器中存ChatClient类,选中哪款调用哪款。
/**
* 大模型工厂
* @author 七号楼
* @since 2025-07-02 13:48
*/
@Component
public class ModelFactory {
private static volatile Map<String, ChatClient> modelMap = new HashMap<>();
/**
* 获取模型
* @since 2025-07-03 10:53
*/
public static ChatClient getModel (String modelName){
return modelMap.get(modelName);
}
/**
* 移除模型
* @since 2025-07-03 10:53
*/
public static void removeModel (String modelName){
if (CollUtil.contains(modelMap.keySet(),modelName)){
modelMap.remove(modelName);
}
}
/**
* 添加模型
* @since 2025-07-03 10:53
*/
public static void putModel (OpenAiChatProperties properties,OpenAiChatOptions options){
ChatClient buildClient = buildChatClient(properties,options);
modelMap.put(options.getModel(),buildClient);
}
/**
* 构建ChatClient对话客户端
* @param properties 基础配置
* @param options 选项配置
* @return ChatClient
*/
private static ChatClient buildChatClient(OpenAiChatProperties properties,OpenAiChatOptions options) {
properties.setOptions(options);
OpenAiApi openAiApi = new OpenAiApi(
properties.getBaseUrl(),
properties.getApiKey(),
properties.getCompletionsPath(),
"/v1/embeddings",
RestClient.builder(),
WebClient.builder(),
RetryUtils.DEFAULT_RESPONSE_ERROR_HANDLER);
OpenAiChatModel chatModel = new OpenAiChatModel(openAiApi,options);
return ChatClient.builder(chatModel).build();
}
}
多款大模型的配置信息,统一维护在表中即可,在服务启动时加载一次,初始化ModelFactory中的Map容器。
@Service
public class ModelConfigServiceImpl extends ServiceImpl<ModelConfigMapper, ModelConfig> implements ModelConfigService {
@PostConstruct
public void init (){
List<ModelConfig> modelList = this.list();
if (CollUtil.isNotEmpty(modelList)){
for (ModelConfig modelConfig:modelList) {
// 基础配置
OpenAiChatProperties properties = new OpenAiChatProperties();
properties.setBaseUrl(modelConfig.getBaseUrl());
properties.setCompletionsPath(modelConfig.getCompletionsPath());
properties.setApiKey(modelConfig.getApiKey());
// 选项配置
OpenAiChatOptions options = OpenAiChatOptions.builder()
.model(modelConfig.getModelVersion())
.temperature(modelConfig.getTemperature())
.build();
// 模型工厂
ModelFactory.putModel(properties,options);
}
}
}
}
简单的测试一下模型动态选择的封装。
@RestController
public class TestModelWeb {
@GetMapping(value = "/completion")
public String completion() {
String message = "你是哪个公司开发的?当前使用的是哪个版本的模型?";
return ModelFactory.getModel("qwen").prompt(new Prompt(message)).call().content()
+"<br/><br/>"+
ModelFactory.getModel("hunyuan").prompt(new Prompt(message)).call().content();
}
}
四、最后总结
产品在完成大模型集成后,测试具体的业务场景时,可以先不考虑自定义的干预策略,就看一看大模型能发挥到什么程度。
如果效果不符合预期,再逐步的加入自定义的策略,直到产品和大模型这个"产品"形成默契的配合,建议测试过程放在模型官网的对话框进行。
毕竟独立开发者的收入,已经独立了。
文档仓库:
https://gitee.com/cicadasmile/butte-java-note
源码仓库:
https://gitee.com/cicadasmile/butte-mound
SpringBoot3集成多款主流大模型的更多相关文章
- 无插件的大模型浏览器Autodesk Viewer开发培训-武汉-2014年8月28日 9:00 – 12:00
武汉附近的同学们有福了,这是全球第一次关于Autodesk viewer的教室培训. :) 你可能已经在各种场合听过或看过Autodesk最新推出的大模型浏览器,这是无需插件的浏览器模型,支持几十种数 ...
- 几款主流PHP框架的优缺点评比
PHP是一种在国内外都比较流行的开源服务器端脚本开发语言.能够适应大中小型项目的开发需求.我们将在这篇文章中向大家介绍几款主流PHP框架及其相关优缺点评比,作为一个参考分享给朋友们. 主要参考的PHP ...
- 推荐一款超强大的基于Angularjs的自动完成(Autocomplete)标签及标签组插件–ngTagsInput
前言 今天利用中午午休时间,给大家分享推荐一款基于Angularjs的自动完成(Autocomplete)标签及标签组插件--ngTagsInput,功能超强大的.不信,你试试就知道^_^... Au ...
- 多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了
1.引言 对于即时通讯网来说,所有的技术文章和资料都在围绕即时通讯这个技术方向进行整理和分享,这一次也不例外.对于即时通讯系统(包括IM.消息推送系统等)来说,MQ消息中件间是非常常见的基础软件,但市 ...
- 吴裕雄 python 机器学习——集成学习AdaBoost算法回归模型
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,ensemble from sklear ...
- 吴裕雄 python 机器学习——集成学习AdaBoost算法分类模型
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,ensemble from sklear ...
- HDFS+ClickHouse+Spark:从0到1实现一款轻量级大数据分析系统
在产品精细化运营时代,经常会遇到产品增长问题:比如指标涨跌原因分析.版本迭代效果分析.运营活动效果分析等.这一类分析问题高频且具有较高时效性要求,然而在人力资源紧张情况,传统的数据分析模式难以满足.本 ...
- 千亿参数开源大模型 BLOOM 背后的技术
假设你现在有了数据,也搞到了预算,一切就绪,准备开始训练一个大模型,一显身手了,"一朝看尽长安花"似乎近在眼前 -- 且慢!训练可不仅仅像这两个字的发音那么简单,看看 BLOOM ...
- DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍
DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来,ChatGPT及类似模型引发了人工智能(AI)领域的一场风潮. 这场风潮对数字世 ...
- 两款主流项目管理软件PK,哪个更好用?
两款主流项目管理软件PK,哪个更好用? 一.产品介绍 JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领 ...
随机推荐
- Javascript try catch finally
很少用到javascript的异常捕获,突然需要,发现挺全的,小小记录下,留爪. 直接打码: //public.js //异常输出 function exception(ex) { console.l ...
- 《机器人SLAM导航核心技术与实战》第1季:第0章_SLAM发展综述
<机器人SLAM导航核心技术与实战>第1季:第0章_SLAM发展综述 视频讲解 [第1季]0.第0章_SLAM发展综述-视频讲解 [第1季]0.1.第0章_SLAM发展综述-梳理定位导航技 ...
- IDEA强制注册登录版本号:IntelliJ IDEA 2021.2.2
建议采用 IntelliJ IDEA 2021.2.2 版本进行 Evaluate for free 试用 IntelliJ IDEA 2021.3.3 以前的版本可以不用注册登录idea账户, ...
- PriorityBlockingQueue 的put方法底层源码
一.PriorityBlockingQueue 的put方法底层源码 PriorityBlockingQueue 的 put 方法用于将元素插入队列.由于 PriorityBlockingQueue ...
- hashtable底层
一.单线程环境下 底层:hash表结构 (数组 + 链表) 使用无参构造创建对象时 会默认长度11的数组 加载因子0.75 Hashtable<Object, Object> hashta ...
- MySQL 的 Doublewrite Buffer 是什么?它有什么作用?
MySQL 的 Doublewrite Buffer 是什么?它有什么作用? Doublewrite Buffer 是 InnoDB 存储引擎的一种机制,旨在提高数据的安全性,防止在写入磁盘时发生崩溃 ...
- jmeter使用之数据关联
- CSS横向滚动
Flex版本 .super { display: flex; width: 100%; overflow-x: scroll; white-space: nowrap; } .sub { width: ...
- 凯亚IOT平台在线测试MQTT接入设备
一.概述 凯亚 (Kayak)开通了MQTT端口425,以便给感兴趣的同僚进行测试,下面将在此篇文章讲解如何平台接入设备进行MQTT通信 凯亚 (Kayak) 是什么? 凯亚(Kayak)是基于.NE ...
- 23.5K star!零代码构建AI知识库,这个开源神器让问答系统开发像搭积木一样简单!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 FastGPT 是一个基于大语言模型的智能知识库平台,提供开箱即用的数据处理.RAG检索和可 ...