Spring AI 集成国内大模型实战:千问/豆包(含多模态)+ Spring Boot 4.0.1 全攻略

Spring AI 集成国内大模型实战:千问/豆包(含多模态)+ Spring Boot 4.0.1 全攻略

引言

Spring AI 作为 Spring 官方推出的 AI 开发框架,极大简化了 Java 开发者集成大模型的流程;而 Spring Boot 4.0.1 作为最新稳定版,凭借 Java 17+ 优化、原生镜像等特性,能让 AI 应用兼具开发效率与运行性能。

国内开发者常面临的痛点是:如何基于 Spring AI 适配阿里通义千问、字节豆包等本土化大模型?是否支持多模态(图文问答)能力?本文将从「环境准备→文本交互集成→多模态能力落地」全流程拆解,结合 Spring Boot 4.0.1 给出可直接复用的代码示例,覆盖国内模型的核心使用场景。

一、前置准备:基础环境与依赖配置

1.1 环境要求(必满足)

  • JDK:17+(Spring Boot 4.0.1 强制要求)
  • 构建工具:Maven 3.8.8+ / Gradle 8.0+
  • Spring 版本:Spring Boot 4.0.1 + Spring AI 0.8.1(最佳兼容组合)
  • 网络:确保服务器/本地能访问国内大模型 API 地址(国内服务器无需代理)

1.2 国内模型 API 密钥获取

模型密钥获取平台核心信息
通义千问阿里云百炼大模型平台(dashscope.aliyun.com)获取 API-KEY
字节豆包火山方舟平台(volcengine.com/product/ark)获取 api-key + 接口地址

1.3 基础依赖配置

先搭建 Spring Boot 4.0.1 项目,在 pom.xml 中添加核心依赖(后续按模型补充专属依赖):

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>4.0.1</version><relativePath/></parent><groupId>com.example</groupId><artifactId>spring-ai-china-llm-demo</artifactId><version>0.0.1-SNAPSHOT</version><!-- 核心基础依赖 --><dependencies><!-- Spring Web:提供接口测试能力 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring AI 核心依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-ai</artifactId><version>0.8.1</version></dependency><!-- 测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><source>17</source><target>17</target></configuration></plugin></plugins></build></project>

二、核心场景1:文本交互集成(最常用)

2.1 集成阿里通义千问(官方适配,推荐)

Spring AI 对千问有官方适配依赖,无需自定义客户端,配置即可用。

步骤1:添加千问专属依赖
<!-- Spring AI 通义千问适配依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-ai-dashscope</artifactId><version>0.8.1</version></dependency>
步骤2:配置千问 API 信息

application.yml 中添加配置(替换为你的 API-KEY):

spring:ai:dashscope:api-key: sk-xxxxxx # 阿里云百炼平台获取的API-KEYchat:model: qwen-turbo # 可选:qwen-plus、qwen-max、qwen-72b-chat等temperature:0.7# 随机性(0-1),值越小越精准max-tokens:2048# 最大生成token数
步骤3:编写千问文本调用代码

Spring AI 自动配置 DashScopeChatClient,直接注入使用:

importorg.springframework.ai.dashscope.DashScopeChatClient;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;/** * 通义千问文本交互控制器 */@RestControllerpublicclassQwenTextController{@AutowiredprivateDashScopeChatClient dashScopeChatClient;/** * 调用千问生成文本回答 * @param prompt 提问内容 * @return AI 回答 */@GetMapping("/ai/qwen/chat")publicStringchatWithQwen(@RequestParamString prompt){// 极简调用:直接传入Promptreturn dashScopeChatClient.call(prompt);// 进阶调用(自定义参数):/* DashScopeChatRequest request = DashScopeChatRequest.builder() .prompt(prompt) .model("qwen-plus") // 覆盖配置文件模型 .temperature(0.5) .maxTokens(1000) .build(); return dashScopeChatClient.call(request).getResult().getOutput().getContent(); */}}
步骤4:测试接口

启动项目后访问:
http://localhost:8080/ai/qwen/chat?prompt=用Spring Boot 4.0.1写一个用户注册接口
即可得到千问生成的标准化代码回答。

2.2 集成字节豆包(OpenAI 兼容模式)

豆包暂无 Spring AI 官方适配,但支持「OpenAI 兼容模式」,可复用 OpenAI 客户端调用。

步骤1:添加 OpenAI 适配依赖
<!-- Spring AI OpenAI 适配依赖(兼容豆包接口) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-ai-openai</artifactId><version>0.8.1</version></dependency>
步骤2:配置豆包兼容接口信息
spring:ai:openai:api-key: your-doubao-api-key # 豆包平台获取的API-KEYbase-url: https://www.doubao.com/api/v1 # 豆包OpenAI兼容接口前缀chat:model: doubao-pro # 豆包模型名称(如doubao-pro、doubao-lite)temperature:0.7max-tokens:2048
步骤3:编写豆包文本调用代码
importorg.springframework.ai.openai.OpenAiChatClient;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;/** * 豆包文本交互控制器(兼容OpenAI模式) */@RestControllerpublicclassDouBaoTextController{@AutowiredprivateOpenAiChatClient openAiChatClient;@GetMapping("/ai/doubao/chat")publicStringchatWithDouBao(@RequestParamString prompt){// 调用逻辑与OpenAI完全一致return openAiChatClient.call(prompt);}}

三、核心场景2:多模态集成(图文问答)

Spring AI 0.8.1+ 原生支持多模态能力(文本+图片),核心是将图片转为 Base64 编码后传入 Prompt,不同国内模型的适配方式略有差异。

3.1 千问多模态集成(官方适配,最便捷)

千问 qwen-vl/qwen-vl-plus 模型原生支持图文问答,Spring AI 提供完整封装。

步骤1:确认配置(复用千问依赖,修改模型为多模态版本)
spring:ai:dashscope:api-key: sk-xxxxxx chat:model: qwen-vl # 多模态专属模型temperature:0.7
步骤2:编写千问多模态调用代码
importorg.springframework.ai.dashscope.DashScopeMultiModalChatClient;importorg.springframework.ai.image.ImageContent;importorg.springframework.ai.multimodal.MultiModalPrompt;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.multipart.MultipartFile;importjava.util.Base64;/** * 千问多模态(图文问答)控制器 */@RestControllerpublicclassQwenMultiModalController{@AutowiredprivateDashScopeMultiModalChatClient multiModalChatClient;/** * 上传图片+文本提问,调用千问图文问答 * @param file 图片文件(PNG/JPG) * @param prompt 文本提问 * @return 多模态回答 * @throws Exception 图片编码异常 */@PostMapping("/ai/qwen/multimodal/chat")publicStringmultiModalChat(@RequestParam("file")MultipartFile file,@RequestParam("prompt")String prompt)throwsException{// 1. 图片转Base64编码(千问要求图片为Base64格式)byte[] imageBytes = file.getBytes();String base64Image =Base64.getEncoder().encodeToString(imageBytes);// 2. 封装多模态Prompt:文本+图片ImageContent imageContent =newImageContent("data:image/jpeg;base64,"+ base64Image);MultiModalPrompt multiModalPrompt =newMultiModalPrompt(prompt, imageContent);// 3. 调用千问多模态模型return multiModalChatClient.call(multiModalPrompt).getResult().getOutput().getContent();}}
步骤3:测试多模态接口

通过 Postman/表单提交:

  • 请求方式:POST
  • 地址:http://localhost:8080/ai/qwen/multimodal/chat
  • 参数:
    • file:上传图片(如代码截图、流程图);
    • prompt:文本提问(如“分析这张图片的代码逻辑并优化”)。

3.2 豆包多模态集成(兼容/自定义模式)

方式1:OpenAI 兼容模式(推荐)
importorg.springframework.ai.openai.OpenAiChatClient;importorg.springframework.ai.openai.api.OpenAiApi;importorg.springframework.ai.openai.api.OpenAiChatCompletionRequest;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.multipart.MultipartFile;importjava.util.Base64;importjava.util.List;/** * 豆包多模态控制器(兼容OpenAI模式) */@RestControllerpublicclassDouBaoMultiModalController{@AutowiredprivateOpenAiChatClient openAiChatClient;@PostMapping("/ai/doubao/multimodal/chat")publicStringdouBaoMultiModalChat(@RequestParam("file")MultipartFile file,@RequestParam("prompt")String prompt)throwsException{// 1. 图片转Base64byte[] imageBytes = file.getBytes();String base64Image =Base64.getEncoder().encodeToString(imageBytes);// 2. 构建OpenAI格式多模态消息OpenAiChatCompletionRequest.Message message =OpenAiChatCompletionRequest.Message.builder().role(OpenAiApi.ChatRole.USER.value()).content(List.of(// 文本部分OpenAiChatCompletionRequest.Message.ContentPart.builder().type("text").text(prompt).build(),// 图片部分OpenAiChatCompletionRequest.Message.ContentPart.builder().type("image_url").imageUrl(OpenAiChatCompletionRequest.Message.ImageUrl.builder().url("data:image/jpeg;base64,"+ base64Image).build()).build())).build();// 3. 调用豆包兼容接口return openAiChatClient.call(List.of(message)).getResult().getOutput().getContent();}}
方式2:自定义客户端(原生接口)

若兼容模式不可用,直接调用豆包原生多模态接口:

importorg.springframework.beans.factory.annotation.Value;importorg.springframework.http.*;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.client.RestTemplate;importorg.springframework.web.multipart.MultipartFile;importjava.util.Base64;importjava.util.List;importjava.util.Map;/** * 豆包多模态自定义客户端(原生接口) */@RestControllerpublicclassCustomDouBaoMultiModalController{@Value("${doubao.api-key}")privateString apiKey;@Value("${doubao.base-url}")privateString baseUrl;privatefinalRestTemplate restTemplate =newRestTemplate();@PostMapping("/ai/doubao/custom/multimodal/chat")publicStringcustomMultiModalChat(@RequestParam("file")MultipartFile file,@RequestParam("prompt")String prompt)throwsException{// 1. 图片转Base64byte[] imageBytes = file.getBytes();String base64Image =Base64.getEncoder().encodeToString(imageBytes);// 2. 构建请求头HttpHeaders headers =newHttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Authorization","Bearer "+ apiKey);// 3. 构建豆包原生请求体Map<String,Object> requestBody =Map.of("model","doubao-multimodal","messages",List.of(Map.of("role","user","content",List.of(Map.of("type","text","text", prompt),Map.of("type","image","image", base64Image)))),"temperature",0.7);// 4. 发送请求并解析响应HttpEntity<Map<String,Object>> request =newHttpEntity<>(requestBody, headers);ResponseEntity<Map> response = restTemplate.postForEntity( baseUrl +"/chat/multimodal/completions", request,Map.class);if(response.getStatusCode().is2xxSuccessful()){List<Map<String,Object>> choices =(List<Map<String,Object>>) response.getBody().get("choices");return(String) choices.get(0).get("message").get("content");}return"调用失败:"+ response.getStatusCode();}}

对应的配置:

doubao:api-key: your-doubao-api-key base-url: https://www.doubao.com/api/v1 

四、关键注意事项(避坑指南)

4.1 版本兼容

  • 必须使用 Spring AI 0.8.1+(适配 Spring Boot 4.0.1),低版本会出现依赖冲突;
  • 国内模型需选择对应版本(千问多模态用 qwen-vl,豆包多模态用 doubao-multimodal)。

4.2 密钥安全

生产环境切勿硬编码 API 密钥,通过环境变量注入:

spring:ai:dashscope:api-key: ${DASHSCOPE_API_KEY}# 从环境变量读取

4.3 图片处理

  • 图片格式:支持 JPG/PNG,部分模型限制大小(≤10MB);
  • 性能优化:大图片先压缩分辨率,再转 Base64(减少请求体积)。

4.4 网络与接口适配

  • 国内服务器无需代理,海外服务器需配置国内代理;
  • 定期确认模型官方接口地址(可能微调)。

五、总结

Spring AI 结合 Spring Boot 4.0.1 可高效集成国内主流大模型,核心要点如下:

  1. 文本交互:千问用官方适配依赖,豆包复用 OpenAI 兼容模式,配置简单、调用便捷;
  2. 多模态能力:核心是图片 Base64 编码,千问有官方封装,豆包可通过兼容/自定义模式实现;
  3. 核心原则:国内模型集成的关键是「鉴权方式 + 接口格式」适配,Spring AI 已封装通用逻辑,只需少量配置即可落地。

通过本文的实操方案,你可快速构建基于国内大模型的 AI 应用,兼顾 Spring 生态的优雅性与本土化模型的适配性。若需集成文心一言、讯飞星火等其他国内模型,核心逻辑一致:确认适配方式(官方/兼容/自定义)→ 配置 API 信息 → 封装 Prompt 调用。

Read more

大模型+智能家居解决方案--小米MiLoco部署

大模型+智能家居解决方案--小米MiLoco部署

一、Miloco简介 小米推出了首个“大模型+智能家居”解决方案Xiaomi Miloco,全称为 Xiaomi Local Copilot(小米本地协同智能助手)。 https://gitee.com/xiaomi-miloco/xiaomi-miloco 1、GitHub地址 https://github.com/XiaoMi/xiaomi-miloco Miloco以米家摄像头为视觉信息源,以自研大语言模型MiMo-VL-Miloco-7B为核心,连接家中所有物联网(IoT)设备,框架面向所有人开源。MiMo-VL-Miloco-7B模型基于小米4月发布的MiMo模型调优而来,“天才少女”罗福莉最近加入的正是MiMo模型团队。 这很可能是智能家居的“ChatGPT时刻”,小米AIoT平台截至今年6月已连接的IoT设备数(不含智能手机、平板及笔记本计算机)达9.89亿台,数以亿计的米家摄像头、小爱音箱、台灯等设备都有望用上大模型。 从小米公布的Miloco页面来看,页面主视觉是一个类似于ChatGPT的聊天框,聊天框的左侧具有智能家居设备的导航栏,包括AI中心、模型管

By Ne0inhk
Flutter 三方库 arcane_helper_utils 的鸿蒙化适配指南 - 实现具备通用逻辑增强与多维开发脚手架的实用工具集、支持端侧业务开发的效率倍增实战

Flutter 三方库 arcane_helper_utils 的鸿蒙化适配指南 - 实现具备通用逻辑增强与多维开发脚手架的实用工具集、支持端侧业务开发的效率倍增实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 arcane_helper_utils 的鸿蒙化适配指南 - 实现具备通用逻辑增强与多维开发脚手架的实用工具集、支持端侧业务开发的效率倍增实战 前言 在进行 Flutter for OpenHarmony 开发时,如何快速处理常见的字符串格式化、色值转换、日期计算或布尔值增强?虽然每一个功能都很小,但如果每个项目都重复造轮子,开发效率将大打折扣。arcane_helper_utils 是一款专注于极致实用的“瑞士军刀”型工具集。本文将探讨如何在鸿蒙端通过这类高内聚的 Utility 集实现极致、丝滑的业务交付。 一、原直观解析 / 概念介绍 1.1 基础原理 该库通过对 Dart 原生类型(Object, String, List, Map, Bool)

By Ne0inhk
【Xilinx FPGA】7 Series Clocking 设计

【Xilinx FPGA】7 Series Clocking 设计

FPGA 的高性能时钟设计面临多重挑战:需为高速 I/O 及存储接口提供纯净的时钟信号,支持宽频率范围内的多时钟域,并在实现高性能的同时保持低功耗。Xilinx 7 系列 FPGA 基于 Virtex-6 的时钟架构,采用全系列统一的时钟系统,为开发人员提供了一套高效、可靠的时钟解决方案。本文主要介绍 Xilinx 7 Series 器件时钟设计所需要了解的知识,包括时钟布局、时钟分配与时钟生成。 目录 1 Clock Region 时钟布局 2 Clock Distribution 时钟分配 3 Clock Generation 时钟生成         3.1 Clock Management Tile 时钟管理单元         3.2 MMCM 混合模式时钟管理器         3.3

By Ne0inhk
【选型】地瓜机器人RDK系列选型指南:X3 vs X5 vs S100 vs S100P(含资源对比图)

【选型】地瓜机器人RDK系列选型指南:X3 vs X5 vs S100 vs S100P(含资源对比图)

在机器人开发领域,地瓜机器人(D-Robotics)凭借其“RDK(Robot Developer Kit)”系列开发套件,已成为众多开发者和创业团队的首选平台。从轻量级边缘计算到高性能具身智能,地瓜机器人已构建了覆盖多场景的完整产品线,致力于为开发者提供高性价比、高集成度、高扩展性的解决方案。其核心芯片“旭日®”系列持续迭代,推动AI与机器人深度融合,助力实现从感知到控制的全链路自主化。 本文将深入对比当前主流的四款RDK开发套件:RDK X3、RDK X5、RDK S100、RDK S100P,并提供详细的资源对比图与应用场景分析,帮助你快速完成技术选型,降低开发门槛,提升项目落地效率。 一、产品定位概览 在深入参数前,先明确每款产品的核心定位,以便根据项目阶段、预算和性能需求做出合理选择。 ● RDK X3:轻量级边缘AI计算模组,适合入门级机器人、智能摄像头、无人机等低功耗、小体积场景。是初学者和教育项目的理想起点,具备基础AI推理能力,可快速搭建视觉识别系统。 ● RDK

By Ne0inhk