大家好,我是工藤学编程 🦉 | 一个正在努力学习的小博主,期待你的关注 |
|---|---|
实战代码系列最新文章😉 | C++实现图书管理系统(Qt C++ GUI界面版) |
SpringBoot实战系列🐷 | 【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案 |
分库分表 | 分库分表之实战-sharding-JDBC分库分表执行流程原理剖析 |
消息队列 | 深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK) |
AI大模型 | 零基础学AI大模型之从0到1调用大模型API |
前情摘要: 1、零基础学AI大模型之读懂AI大模型 2、零基础学AI大模型之从0到1调用大模型API
随着大语言模型(LLM)技术的爆发,AI应用从实验室走向企业生产环境已成为趋势。但对Java开发者而言,长期面临两大痛点:一是不同AI模型(如OpenAI、通义千问、Gemini)接口不统一,集成时需重复适配;二是企业级应用需兼顾模块化、可扩展性与现有Spring生态(Spring Boot、Spring Cloud)的兼容性,传统AI开发框架(如LangChain)难以满足。
SpringAI 的出现恰好填补了这一空白——作为Spring生态下的企业级AI应用开发框架,它将Spring的设计哲学延伸至AI领域,让Java工程师无需深入AI底层技术,即可快速集成大模型能力。同时,LLM的“多模态”技术正成为突破单模态局限的关键,而SpringAI也已原生支持多模态能力,为开发者提供从文本到图像、语音的全场景解决方案。
本文将从SpringAI的核心特性、与主流AI框架的对比、LLM多模态技术解析,到完整的SpringAI项目实战,带您全面掌握Java生态下的AI应用开发。
SpringAI是Spring官方推出的企业级AI应用开发框架,核心定位是“连接大模型与企业系统的桥梁”。它并非替代LLM,而是通过标准化接口、工程化工具链,解决AI模型与企业数据、现有API的连接难题,让Java开发者能以“Spring原生方式”开发AI应用。
其官方定义可概括为:
将Spring的可移植性、模块化、依赖注入等核心原则应用于AI领域,支持聊天、嵌入、向量存储、RAG等完整AI开发栈,兼容20+主流大模型,降低企业级AI应用的开发门槛。
官网与源码地址:
当前AI应用开发框架众多,不同框架侧重不同场景。对Java开发者或企业级项目而言,SpringAI的优势尤为明显:
框架/平台 | 核心优势 | 适用场景 | 对Java友好度 | 企业级支持 |
|---|---|---|---|---|
SpringAI | Spring生态无缝集成、标准化API、工程化工具链 | Java企业级AI应用、现有Spring项目升级 | ★★★★★ | ★★★★★ |
LangChain | 灵活的链(Chain)设计、丰富的工具集成 | 多步骤AI任务(如问答+总结) | ★★★☆☆ | ★★★☆☆ |
LangChain4j | 适配Java生态、轻量级 | 简单Java AI应用 | ★★★★☆ | ★★★☆☆ |
Dify/Coze | 低代码平台、可视化配置 | 非技术人员快速搭建AI应用 | ★★☆☆☆ | ★★★★☆ |
CrewAI | 多智能体协作、任务拆分 | 复杂多角色AI任务(如团队协作) | ★★★☆☆ | ★★★☆☆ |
核心差异:SpringAI并非“从零搭建AI能力”,而是聚焦“企业级集成”——它能直接复用Spring Boot的自动配置、Spring Cloud的分布式能力,让已有Spring项目(如电商后台、CRM系统)快速接入AI功能,无需重构技术栈。
SpringAI的设计围绕“简化企业级AI开发”展开,核心特性可概括为四点:
SpringAI通过抽象接口屏蔽了不同AI提供商的差异,开发者只需一套代码,即可切换不同模型。目前已支持:
示例:切换“OpenAI”与“通义千问”时,仅需修改配置文件的model参数,无需改动业务代码。
SpringAI承担“中间件”角色,解决大模型与企业数据、现有系统的连接问题:
SpringAI提供从“模型调用”到“应用落地”的全流程工具,避免开发者重复造轮子:
对熟悉Spring的开发者而言,SpringAI几乎“零学习成本”:
ChatModel、EmbeddingModel等Bean,无需手动初始化;@Autowired直接注入AI模型实例,与Spring Bean的使用方式一致;SpringAI的企业级特性使其在以下场景中尤为适用:
在了解SpringAI后,我们不得不提当前LLM的核心发展方向——多模态技术。它让AI从“只能处理文本”进化为“能看懂、听懂、生成多种信息”,更贴近人类的交互方式。
早期AI模型多为“单模态”,即只能处理一种信息类型,而多模态则打破了这一局限:
维度 | 单模态模型(如早期ChatGPT、识图软件) | 多模态模型(如GPT-4V、Gemini) |
|---|---|---|
信息处理能力 | 仅支持文本/图像/语音中的一种 | 同时支持文本、图像、语音、视频 |
交互方式 | 单一输入(如文本输入→文本输出) | 多输入多输出(如图文输入→文本/语音输出) |
理解深度 | 无法关联不同类型信息(如图文无关) | 能关联多模态信息(如图像内容+文本提问→精准回答) |
应用场景 | 局限(如纯文本聊天、纯图像识别) | 广泛(如图文内容生成、语音助手+图像分析) |
示例对比:

多模态的核心价值是“拓展AI的感知与表达能力”,常见模态及应用如下:
模态类型 | 输入场景 | 输出场景 | 典型应用案例 |
|---|---|---|---|
文本模态 | 用户提问、文档内容 | 回答、总结、代码生成 | 智能客服文本问答、文档总结 |
图像模态 | 照片、截图、手绘草图 | 图像描述、物体识别、图像生成 | 图文结合的产品介绍、AI绘图 |
语音模态 | 人类语音、环境音 | 语音转文字、文字转语音、语音识别 | 语音助手(如“小爱同学”)、会议录音转文字 |
视频模态 | 短视频、监控录像 | 视频内容分析、字幕生成 | 视频摘要生成、监控异常行为检测 |
生活中的多模态实例: 打开某购物APP的“AI导购”功能,你上传一张“黑色连帽卫衣”的照片(图像输入),说“帮我找类似款式,预算500以内”(语音输入),AI会返回符合条件的商品列表,并语音播报“为您推荐3款连帽卫衣,最低售价399元”(语音输出)——这就是多模态的典型交互。
SpringAI已原生集成多模态能力,开发者可通过统一接口调用不同模态的模型,无需单独适配:
多模态模型类型 | 核心能力 | 支持的主流模型 | 开发示例 |
|---|---|---|---|
聊天模型 | 文本对话、文本生成 | OpenAI GPT-4、通义千问 | 实现“讲个笑话”“总结订单数据”接口 |
嵌入模型 | 文本/图像向量化(用于检索) | OpenAI Embeddings、通义千问Embeddings | 将文档转换为向量,存储到Milvus |
图像生成模型 | 文本→图像、图像→图像编辑 | DALL·E 3、Stable Diffusion | 输入“生成一只在太空漂浮的猫”,返回图像URL |
语音模型 | 语音转文字(ASR)、文字转语音(TTS) | OpenAI Whisper、阿里云语音服务 | 上传录音文件,转换为文本并总结 |
关键优势:SpringAI对多模态模型的封装与“文本模型”一致,开发者无需学习新的调用方式。例如,调用图像生成模型与调用聊天模型的代码结构相似,仅需注入对应的ImageModel实例即可。
理论之后,我们通过实战掌握SpringAI的核心开发流程。本次实战以“集成DeepSeek模型实现文本生成接口”为例,覆盖环境准备、项目搭建、代码开发全流程。
SpringAI对依赖版本有明确要求,需提前配置以下环境:
依赖工具 | 最低版本要求 | 推荐版本 | 说明 |
|---|---|---|---|
JDK | 17 | 21 | Spring Boot 3.x依赖JDK 17+,JDK 21性能更优 |
Spring Boot | 3.2 | 3.5.3 | 需与SpringAI版本兼容(本文用3.5.3) |
Maven | 3.9 | 3.9.6 | 用于依赖管理,避免版本冲突 |
开发工具 | IDEA 2023.1+ | IDEA旗舰版2024 | 支持Spring Boot自动配置提示 |
注意:避免使用低于上述版本的工具,否则可能出现依赖冲突(如Spring Boot 3.1与SpringAI 1.0.0不兼容)。
SpringAI从M7版本开始调整了Starter命名规范和模块结构,旧教程的依赖已失效,需使用新版配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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>
<!-- 父依赖:Spring Boot 3.5.3 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.3</version>
<relativePath/>
</parent>
<groupId>net.xdclass</groupId>
<artifactId>spring-ai-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-ai-demo</name>
<description>SpringAI集成DeepSeek实战</description>
<properties>
<java.version>21</java.version>
<spring-ai.version>1.0.0</spring-ai.version> <!-- SpringAI稳定版 -->
</properties>
<dependencies>
<!-- Spring Web:用于开发HTTP接口 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringAI OpenAI兼容依赖(支持DeepSeek等兼容OpenAI协议的模型) -->
<!-- 旧版本(M7前):spring-ai-openai-spring-boot-starter -->
<!-- 新版本(M7后):命名规范调整为 spring-ai-starter-model-{模型名} -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
<!-- 测试依赖(可选) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 依赖管理:统一SpringAI子模块版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!-- Spring Boot打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!-- 阿里云仓库:加速依赖下载(国内用户必备) -->
<repositories>
<repository>
<id>aliyun</id>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</repository>
<repository>
<id>aliyun-spring</id>
<name>阿里云Spring仓库</name>
<url>https://maven.aliyun.com/repository/spring</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
</plugins>
</pluginRepositories>
</project>spring-ai-{模型名}-spring-boot-starter(如spring-ai-openai-spring-boot-starter)
新版本:spring-ai-starter-model-{模型名}(如spring-ai-starter-model-openai)
原因:统一Starter命名,区分“模型 Starter”与“工具 Starter”(如向量存储 Starter)。
spring-ai-core;
新版本:拆分为3个专注模块,职责更清晰:
spring-ai-commons:基础组件(Document、TextSplitter);spring-ai-model:AI模型抽象(ChatModel、ImageModel);spring-ai-vector-store:向量数据库抽象(支持Redis、Milvus)。在src/main/resources下创建application.yml,配置AI模型的API密钥、基础地址、模型参数:
spring:
application:
name: spring-ai-demo # 项目名称
ai:
openai: # 兼容OpenAI协议的模型(如DeepSeek、通义千问)
api-key: your-api-key # 替换为你的API密钥(从DeepSeek/OpenAI官网获取)
base-url: https://api.deepseek.com # DeepSeek的API基础地址(OpenAI为https://api.openai.com/v1)
chat:
options:
model: deepseek-chat # 模型名称(DeepSeek的对话模型)
temperature: 0.8 # 输出随机性(0~1,0为确定性输出,1为最大随机性)
max-tokens: 2048 # 最大输出 tokens(避免生成过长内容)创建AiController,通过@Autowired注入OpenAiChatModel,开发文本生成接口:
package net.xdclass;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringAiDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringAiDemoApplication.class, args);
}
}package net.xdclass.controller;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("/ai") // 接口根路径
public class AiController {
// 注入OpenAI兼容的聊天模型(SpringAI自动配置)
@Autowired
private OpenAiChatModel chatModel;
/**
* 文本生成接口
* @param message 用户输入的提示词(默认:你是谁)
* @return 模型生成的结果
*/
@GetMapping("/generate")
public Map<String, String> generateText(
@RequestParam(value = "message", defaultValue = "你是谁") String message) {
// 调用模型生成结果(底层调用ChatModel的call方法)
String result = chatModel.call(message);
// 返回JSON格式结果
return Map.of("prompt", message, "generation", result);
}
}运行SpringAiDemoApplication的main方法,控制台输出以下日志表示启动成功:

打开浏览器,输入地址:
http://localhost:8080/ai/generate?message=你是谁

OpenAiChatModel实现了SpringAI的ChatModel接口,该接口是所有聊天模型的抽象入口。我们通过源码解读其核心能力:
/**
* 聊天模型的顶层接口,定义了与AI模型交互的核心方法
*/
public interface ChatModel extends Model<Prompt, ChatResponse>, StreamingChatModel {
/**
* 1. 单个文本消息调用(最常用)
* @param message 用户输入的文本
* @return 模型生成的文本
*/
default String call(String message) {
// 封装用户消息为Prompt对象(包含角色:USER)
Prompt prompt = new Prompt(new UserMessage(message));
// 调用模型并获取结果
Generation generation = this.call(prompt).getResult();
// 返回结果文本(为空时返回空字符串)
return generation != null ? generation.getOutput().getText() : "";
}
/**
* 2. 多消息对话调用(支持上下文)
* @param messages 消息列表(如:系统消息+用户消息+助手消息)
* @return 模型生成的文本
*/
default String call(Message... messages) {
Prompt prompt = new Prompt(Arrays.asList(messages));
Generation generation = this.call(prompt).getResult();
return generation != null ? generation.getOutput().getText() : "";
}
/**
* 3. 基础调用方法(返回完整ChatResponse,包含元数据)
* @param prompt 包含消息、提示词模板的对象
* @return ChatResponse(包含生成结果、模型信息、token使用量)
*/
ChatResponse call(Prompt prompt);
/**
* 4. 流式调用(实时返回结果,适合聊天场景)
* @param prompt 包含消息的Prompt对象
* @return Flux<ChatResponse>(响应式流,逐段返回结果)
*/
default Flux<ChatResponse> stream(Prompt prompt) {
throw new UnsupportedOperationException("streaming is not supported");
}
}SystemMessage(系统提示)、AssistantMessage(助手历史回复),实现上下文记忆(如“先介绍单例模式,再写懒汉式代码”);觉得有用请点赞收藏! 如果有相关问题,欢迎评论区留言讨论~