集成:DeepSeek,豆包,混元,通义千问。

一、简介

2025年7月份,开始转型独立开发者。

第一款尝试的产品自然是AI方向,此前不具备专业的产品经验,所以只能更多的依赖大模型的能力。

年初DeepSeek成功证明模型即产品的理念,所以第一款产品尽量降低传统的产品设计思维,会把场景和流程交给大模型去处理,通过反复测试来调整干预的权重,找到一个相对平衡的比例。

有时候在反思,自己的脑回路会不会限制AI的发挥。

在产品的初期,先选择接入四款大模型,深度求索的DeepSeek,字节跳动的豆包,腾讯的混元,阿里的通义千问。

模型即产品,那产品是什么?

当然每家的大模型,都有自己的能力特点,这里只是从产品的整体功能考量,这几款模型可能更适合,后续可能也会在实践中做动态调整。

二、大模型自评

如何快速熟悉大模型的能力?多提问题,多和它来回拉扯。

首先给这几款大模型,抛出一个灵魂拷问:

作为一款很强的大模型,请你客观的分析DeepSeek,豆包,千问,混元,这四款大模型的差异,并从综合能力的角度给个排序。

看热闹不嫌事大,先让大模型自我分析一把,验证一下自己对它们的预期。

DeepSeek回答:

豆包回答:

通义千问回答:

混元回答:

各个大模型对于能力的排序,权当个热闹看一看。

不过有个结论可以得出来的:不同平台的业务和数据有很大差异,所以训练出来的模型能力也有差异。

此前文章中写过DeepSeek的代码测评,确实很惊艳;豆包的产品化能力,方便解决很多生活问题;混元经常用来分析行业热门事件;通义千问常用来提供业务设计的参考。

所以产品的不同功能,交给不同的大模型来处理,是比较合理的策略。

三、SpringBoot集成

从产品的业务需求出发,来设计后端框架的模型对接,既然需要集成多款大模型,自然是通用的组件更方便管理,通过测试对比个人倾向使用spring-ai-openai依赖包。

这几款模型的使用文档,都适配了OpenAI的接口规范,只是豆包有轻微的细节差异。

3.1 版本依赖

这里说一下简单的思路,是先敲定spring-ai-openai组件的版本,在这个组件中依赖spring-boot3.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集成多款主流大模型的更多相关文章

  1. 无插件的大模型浏览器Autodesk Viewer开发培训-武汉-2014年8月28日 9:00 – 12:00

    武汉附近的同学们有福了,这是全球第一次关于Autodesk viewer的教室培训. :) 你可能已经在各种场合听过或看过Autodesk最新推出的大模型浏览器,这是无需插件的浏览器模型,支持几十种数 ...

  2. 几款主流PHP框架的优缺点评比

    PHP是一种在国内外都比较流行的开源服务器端脚本开发语言.能够适应大中小型项目的开发需求.我们将在这篇文章中向大家介绍几款主流PHP框架及其相关优缺点评比,作为一个参考分享给朋友们. 主要参考的PHP ...

  3. 推荐一款超强大的基于Angularjs的自动完成(Autocomplete)标签及标签组插件–ngTagsInput

    前言 今天利用中午午休时间,给大家分享推荐一款基于Angularjs的自动完成(Autocomplete)标签及标签组插件--ngTagsInput,功能超强大的.不信,你试试就知道^_^... Au ...

  4. 多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了

    1.引言 对于即时通讯网来说,所有的技术文章和资料都在围绕即时通讯这个技术方向进行整理和分享,这一次也不例外.对于即时通讯系统(包括IM.消息推送系统等)来说,MQ消息中件间是非常常见的基础软件,但市 ...

  5. 吴裕雄 python 机器学习——集成学习AdaBoost算法回归模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,ensemble from sklear ...

  6. 吴裕雄 python 机器学习——集成学习AdaBoost算法分类模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,ensemble from sklear ...

  7. HDFS+ClickHouse+Spark:从0到1实现一款轻量级大数据分析系统

    在产品精细化运营时代,经常会遇到产品增长问题:比如指标涨跌原因分析.版本迭代效果分析.运营活动效果分析等.这一类分析问题高频且具有较高时效性要求,然而在人力资源紧张情况,传统的数据分析模式难以满足.本 ...

  8. 千亿参数开源大模型 BLOOM 背后的技术

    假设你现在有了数据,也搞到了预算,一切就绪,准备开始训练一个大模型,一显身手了,"一朝看尽长安花"似乎近在眼前 -- 且慢!训练可不仅仅像这两个字的发音那么简单,看看 BLOOM ...

  9. DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍

    DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来,ChatGPT及类似模型引发了人工智能(AI)领域的一场风潮. 这场风潮对数字世 ...

  10. 两款主流项目管理软件PK,哪个更好用?

    两款主流项目管理软件PK,哪个更好用? 一.产品介绍 JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领 ...

随机推荐

  1. MySurvey 问卷调查, 一个简单的Biwen.QuickApi示例项目

    MySurvey 项目 很久没更新我的博客了,之前开发的Biwen.QuickApi微框架 一直没有开发一个示例项目,最近有点时间,写了一个示例项目稍微介绍下 项目简介 这是一个基于 Biwen.Qu ...

  2. mybatis-plus之配置安全

    1. 环境 SpringBoot 2.6.x 2. 介绍 MyBatis-Plus 从3.3.2版本开始提供了数据安全保护功能,MyBatis-Plus 支持通过加密配置来增强数据库的安全性. 3. ...

  3. C# Equals 和 GetHashCode 方法认知及Distinct方法解析

    参照: 生成 C# Equals 和 GetHashCode 方法重写 - Visual Studio (Windows) | Microsoft Learn 如何修改字符串内容 - C# | Mic ...

  4. 【记录】MATLAB矩阵的批量元素修改方式,与Python的NumPy对比

    文章目录 二维矩阵 操作 1. 将数组大于0的数全部加1 2. 删除元素 ①删除单个元素 ②删除一列元素 3. 添加一行或多行 ①添加一行 ②添加多行 4. 获取行/列数 5. 格式化输出数组 结构数 ...

  5. FastAPI-响应处理和配置

    前篇学习了关于请求参数相关的约束验证, Request 包括 路径参数 , 查询参数, 枚举参数, 文件参数, 类型验证, 多参数嵌套验证, 请求体嵌套验证, Cookie 和 Header 等, 了 ...

  6. 聊聊 ruoyi-vue ,ruoyi-vue-plus ,ruoyi-vue-pro 谁才是真正的王者

    笔者在知乎.Github 上搜索不少快速开发框架 ,很多的话题都绕不开若依 RuoYi . 开源世界 RuoYi 单体框架有三个不同的项目,分别是:ruoyi-vue .ruoyi-vue-plus ...

  7. K8s新手系列之Pod的基本存储

    概念 官方文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-volume-storage/ 卷:h ...

  8. Summary of Indexing operation in DataFrame of Pandas

    Summary of Indexing operation in DataFrame of Pandas For new users of pandas, the index of DataFrame ...

  9. 又一版 A+B

    Description 输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数. Input 输入格式:测试输入包含若干测试用 ...

  10. GStreamer开发笔记(四):ubuntu搭建GStreamer基础开发环境以及基础Demo

    前言   本篇开始gstreamer的编程学习,先搭建基础的环境,跑通一个基础的Demo对GStreamer编程有个初步的了解.   Demo         GStreamer   GStreame ...