Spring AI 从零开始学习(2026最新版)—— 从入门到实战,Java开发者快速上手
Spring AI 从零开始学习(2026最新版)—— 从入门到实战,Java开发者快速上手
前言:随着大模型技术的普及,越来越多Java开发者希望将AI能力快速集成到Spring项目中,但不同大模型(OpenAI、DeepSeek、百度文心一言等)的API差异大、开发繁琐,且需手动处理Prompt设计、上下文管理等问题。Spring AI的出现,正是为了解决这个痛点——它作为Spring生态官方的AI集成框架,让开发者用熟悉的Spring方式(依赖注入、注解驱动),无需关注底层差异,快速开发AI应用。本文面向零基础开发者,从核心认知、环境搭建、实战案例到进阶方向,一步步带你吃透Spring AI,全程附完整代码,复制即可运行。
一、Spring AI 核心认知(新手必懂)
1.1 什么是Spring AI?
Spring AI 是 Spring 官方生态下的子项目,并非“创造新的大模型”,而是一个「大模型集成框架」。它的核心目标是简化Spring应用与各类大模型的集成过程,提供标准化的API、统一的交互模式,以及丰富的辅助特性,让开发者专注于业务逻辑,而非大模型的调用细节。
类比理解:Spring AI 之于大模型,就像 Spring Data 之于数据库——无需手动编写JDBC代码,通过统一接口即可操作不同数据库;同样,无需手动封装大模型的HTTP API,通过Spring AI的统一接口,即可切换调用不同厂商的大模型。
1.2 Spring AI 核心优势(为什么值得学)
-
统一API抽象:封装了大模型的调用逻辑,提供ChatClient(对话交互)、EmbeddingClient(向量生成)等统一接口,切换OpenAI、DeepSeek等大模型时,无需修改业务代码。
-
无缝集成Spring生态:支持Spring Boot自动配置、依赖注入、AOP等特性,符合Spring开发者的使用习惯,学习成本极低,Java开发者可快速上手。
-
丰富的辅助特性:内置Prompt模板、对话记忆、结构化输出、自定义Advisor等功能,解决AI开发中的常见痛点(如硬编码Prompt、上下文丢失、输出格式混乱)。
-
轻量级设计:无侵入式集成,可按需引入对应大模型的依赖,不增加项目冗余;同时支持本地模型(如Ollama部署的DeepSeek),零成本调试。
-
完善的生态支持:支持所有主流AI模型提供商(OpenAI、Anthropic、Google等)和向量数据库(Redis、Milvus等),满足各类AI应用场景需求。
1.3 核心组件(新手先掌握这4个)
Spring AI的核心组件不多,新手只需先掌握以下4个,就能应对大部分基础场景,后续进阶再补充其他组件:
-
ChatClient:对话交互核心客户端,是开发者与大模型交互的入口,负责发送Prompt、接收响应,支持同步/异步调用。
-
Prompt:提示信息封装,包含用户输入、系统指令等内容,是大模型的“输入载体”。
-
PromptTemplate:Prompt模板,解决硬编码Prompt问题,支持参数化替换、外部文件加载,提升代码复用性。
-
ConversationMemory:对话记忆,负责存储多轮对话上下文,让AI能够“记住”之前的对话内容,实现连续交互。
二、环境搭建(零基础手把手操作)
本文以「Spring Boot 3.2 + Spring AI 1.1.4(2026最新稳定版)」为基础,提供两种搭建方案:① 对接OpenAI云端模型(需API Key);② 本地部署DeepSeek模型(零成本,无需API Key),新手可根据自身情况选择。
2.1 环境要求(必看)
-
JDK:17+(Spring AI对JDK版本有最低要求,推荐JDK 17/21,与Spring Boot 3.x适配)。
-
Spring Boot:3.2+(推荐3.2.4,与Spring AI 1.1.4版本兼容)。
-
构建工具:Maven 3.6+ 或 Gradle 7.0+(本文以Maven为例)。
-
可选依赖:Lombok(简化实体类代码,非必需但推荐)。
2.2 方案1:对接OpenAI云端模型(需API Key)
2.2.1 创建Spring Boot项目
通过Spring Initializr(https://start.spring.io/)创建项目,选择:
-
Spring Boot版本:3.2.4
-
依赖:Spring Web(用于提供接口测试)、Lombok(可选)
2.2.2 引入Spring AI依赖
在pom.xml中添加Spring AI OpenAI依赖和BOM(统一版本管理),避免版本冲突:
<!-- Spring AI BOM 统一版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.1.4</version>
pom<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Spring Boot Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring AI OpenAI 依赖(对接OpenAI大模型) -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<!-- Lombok 依赖(可选) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.2.3 配置OpenAI信息
在src/main/resources/application.yml中配置OpenAI的API Key和模型信息,Spring AI会自动配置ChatClient实例,无需手动创建:
spring:
ai:
openai:
api-key: 你的OpenAI API Key # 替换为自己的API Key(从OpenAI官网获取)
chat:
model: gpt-3.5-turbo # 模型名称,可选gpt-4等
temperature: 0.7 # 随机性,0-1之间,值越小越严谨
timeout: 30000 # 超时时间,单位ms
提示:API Key获取方式:登录OpenAI官网(https://platform.openai.com/),进入API Keys页面创建,注意保密,不要硬编码到生产环境(可通过环境变量配置)。
2.3 方案2:本地部署DeepSeek模型(零成本,无需API Key)
如果没有OpenAI API Key,可通过Ollama本地部署DeepSeek模型,全程零成本,数据不出本机,适合新手调试。
2.3.1 安装Ollama(本地模型运行工具)
-
Windows/macOS:访问https://ollama.com/,下载对应平台安装包,双击安装即可。
-
Linux:执行命令:curl -fsSL https://ollama.com/install.sh | sh
安装完成后,Ollama会作为后台服务自动启动,默认监听localhost:11434。
2.3.2 拉取并运行DeepSeek模型
打开终端,执行以下命令,拉取并启动DeepSeek模型(以1.5B版本为例,约1.1GB,低配电脑也能运行):
ollama run deepseek-r1:1.5b
提示:模型大小选择参考(根据自身硬件配置):1.5B(2GB内存)、7B(8GB内存)、14B(16GB内存),越大效果越好。
2.3.3 配置Spring AI对接本地模型
修改pom.xml,替换OpenAI依赖为Ollama依赖:
<!-- 替换OpenAI依赖为Ollama依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
修改application.yml配置:
spring:
ai:
ollama:
base-url: http://localhost:11434 # Ollama默认服务地址
chat:
model: deepseek-r1 # 模型名称,与终端启动的模型一致
options:
temperature: 0.7
num-predict: 2048 # 最大输出长度
2.4 验证环境是否搭建成功
启动Spring Boot项目,若控制台无报错,且能看到“Started Application in xxx seconds”,说明环境搭建成功。
三、核心实战(4个案例,从简单到复杂)
以下案例均基于两种环境(OpenAI/本地DeepSeek)通用,只需确保配置正确,代码无需修改,复制即可运行。
案例1:单次对话(无上下文,一问一答)
最基础的用法:通过ChatClient发送单次Prompt,获取大模型响应,无需保存对话上下文。
3.1.1 编写Service层(核心逻辑)
import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.ChatClient;
import org.springframework.stereotype.Service;
/**
* Spring AI 基础对话服务
*/
@Service
@RequiredArgsConstructor // 构造器注入ChatClient(Spring AI自动配置)
public class ChatService {
private final ChatClient chatClient;
/**
* 单次对话(无上下文)
* @param prompt 用户输入的提示词
* @return 大模型响应结果
*/
public String singleChat(String prompt) {
// 直接调用ChatClient的prompt方法,发送提示词并获取响应
return chatClient.prompt().user(prompt).call().content();
}
}
3.1.2 编写Controller层(提供接口测试)
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
public class ChatController {
private final ChatService chatService;
// 接口地址:http://localhost:8080/chat/single?prompt=你的问题
@GetMapping("/chat/single")
public String singleChat(@RequestParam String prompt) {
return chatService.singleChat(prompt);
}
}
3.1.3 测试接口
启动项目后,访问:http://localhost:8080/chat/single?prompt=用一句话解释Spring AI,即可看到大模型的响应结果,说明单次对话功能正常。
案例2:Prompt模板(解决硬编码问题)
实际开发中,Prompt通常需要参数化(如动态替换用户需求),使用PromptTemplate可实现模板复用,避免硬编码。
3.2.1 编写Service层扩展方法
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class ChatService {
private final ChatClient chatClient;
// 案例1:单次对话(无上下文)
public String singleChat(String prompt) {
return chatClient.prompt().user(prompt).call().content();
}
// 案例2:Prompt模板(参数化)
public String templateChat(String user需求, String 语言类型) {
// 定义Prompt模板,{}中的是参数,可动态替换
String promptTemplate = "作为一名Java开发者,请用{语言类型}回答用户需求:{user需求},要求简洁明了,不超过50字。";
// 创建PromptTemplate实例,替换参数
PromptTemplate template = new PromptTemplate(promptTemplate);
String prompt = template.create(Map.of("user需求", user需求, "语言类型", 语言类型));
// 发送Prompt并获取响应
return chatClient.prompt().user(prompt).call().content();
}
}
3.2.2 编写Controller扩展接口
@RestController
@RequiredArgsConstructor
public class ChatController {
private final ChatService chatService;
// 案例1接口
@GetMapping("/chat/single")
public String singleChat(@RequestParam String prompt) {
return chatService.singleChat(prompt);
}
// 案例2接口:http://localhost:8080/chat/template?user需求=Spring AI怎么用&语言类型=中文
@GetMapping("/chat/template")
public String templateChat(@RequestParam String user需求, @RequestParam String 语言类型) {
return chatService.templateChat(user需求, 语言类型);
}
}
案例3:多轮对话(保存上下文,连续交互)
单次对话无法保存上下文,多轮对话需要使用ConversationMemory存储历史对话,让AI“记住”之前的内容。
3.3.1 编写Service层扩展方法
import org.springframework.ai.chat.Conversation;
import org.springframework.ai.chat.ConversationMemory;
import org.springframework.ai.chat.memory.InMemoryConversationMemory;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class ChatService {
private final ChatClient chatClient;
// 案例1:单次对话(无上下文)
public String singleChat(String prompt) {
return chatClient.prompt().user(prompt).call().content();
}
// 案例2:Prompt模板(参数化)
public String templateChat(String user需求, String 语言类型) {
String promptTemplate = "作为一名Java开发者,请用{语言类型}回答用户需求:{user需求},要求简洁明了,不超过50字。";
PromptTemplate template = new PromptTemplate(promptTemplate);
String prompt = template.create(Map.of("user需求", user需求, "语言类型", 语言类型));
return chatClient.prompt().user(prompt).call().content();
}
// 案例3:多轮对话(保存上下文)
public String multiChat(String prompt, String sessionId) {
// 1. 创建对话记忆(基于内存,生产环境可替换为Redis等持久化存储)
ConversationMemory memory = new InMemoryConversationMemory();
// 2. 创建对话实例,关联ChatClient和对话记忆
Conversation conversation = new Conversation(chatClient, memory);
// 3. 发送当前Prompt,自动关联历史对话
conversation.prompt().user(prompt).call();
// 4. 返回最新响应
return conversation.getLatestResponse().get().getContent();
}
}
提示:生产环境中,InMemoryConversationMemory(内存存储)会随服务重启丢失,建议替换为RedisConversationMemory(Redis存储),实现会话持久化。
案例4:结构化输出(将AI响应映射为Java实体)
AI默认返回文本字符串,实际开发中常需要将响应映射为Java实体(如用户信息、商品信息),Spring AI支持结构化输出,无需手动解析JSON。
3.4.1 定义Java实体类
import lombok.Data;
/**
* 结构化输出实体:用户信息
*/
@Data
public class UserInfo {
private String name; // 姓名
private Integer age; // 年龄
private String city; // 城市
private String job; // 职业
}
3.4.2 编写Service层扩展方法
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.chat.response.JsonResponseExtractor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class ChatService {
private final ChatClient chatClient;
// 案例4:结构化输出(映射为Java实体)
public UserInfo structuredOutput(String prompt) {
// 定义Prompt,指定输出格式为JSON(对应UserInfo实体)
String promptTemplate = "根据用户需求:{prompt},返回一个UserInfo对象,格式为JSON,不要多余文本,字段严格匹配实体类。";
PromptTemplate template = new PromptTemplate(promptTemplate);
String finalPrompt = template.create(Map.of("prompt", prompt));
// 调用ChatClient,指定JSON响应提取器,自动映射为UserInfo实体
return chatClient.prompt()
.user(finalPrompt)
.call()
.extract(new JsonResponseExtractor<>(UserInfo.class));
}
}
3.4.3 编写Controller扩展接口
@RestController
@RequiredArgsConstructor
public class ChatController {
private final ChatService chatService;
// 案例4接口:http://localhost:8080/chat/structured?prompt=生成一个25岁、广州、Java后端开发者的用户信息
@GetMapping("/chat/structured")
public UserInfo structuredOutput(@RequestParam String prompt) {
return chatService.structuredOutput(prompt);
}
}
测试接口后,会直接返回UserInfo实体的JSON格式,无需手动解析,极大提升开发效率。
四、常见问题与避坑指南
新手学习过程中,容易遇到以下问题,提前规避可节省大量调试时间:
4.1 配置相关问题
-
API Key错误:启动报错“Invalid API Key”,检查application.yml中的api-key是否正确,OpenAI API Key需避免空格、换行,建议通过环境变量配置。
-
模型连接超时:报错“ConnectTimeoutException”,检查网络是否通畅,OpenAI需科学上网,本地模型检查Ollama服务是否正常启动(localhost:11434可访问)。
-
版本冲突:Spring AI与Spring Boot版本不兼容,建议使用本文推荐的版本组合(Spring Boot 3.2.4 + Spring AI 1.1.4),并通过BOM统一版本。
4.2 代码相关问题
-
ChatClient注入失败:检查是否引入了对应大模型的Starter依赖(如OpenAI/Ollama),Spring AI会自动配置ChatClient,无需手动创建。
-
结构化输出失败:确保Prompt中明确要求输出JSON格式,且字段与Java实体类严格匹配(大小写、字段名一致),避免多余文本。
-
对话记忆丢失:InMemoryConversationMemory仅适用于测试,生产环境需使用Redis等持久化存储,确保会话上下文不丢失。
4.3 性能与优化建议
-
启用日志调试:在application.yml中设置日志级别为DEBUG,可查看Prompt发送、响应接收的完整过程,便于排查问题。
-
配置重试机制:大模型调用可能失败,可通过Spring AI的重试配置,设置重试次数和超时时间。
-
本地模型优化:部署DeepSeek模型时,根据硬件配置选择合适的模型大小,避免内存不足导致服务崩溃。
五、进阶学习方向(新手进阶路线)
掌握基础用法后,可按照以下方向进阶,提升Spring AI实战能力,适配企业级开发需求:
-
向量数据库集成:学习Spring AI与Redis、Milvus等向量数据库的集成,实现RAG(检索增强生成),解决大模型“失忆”和知识更新问题。
-
函数调用(Function Calling):学习让大模型调用外部工具(如数据库查询、接口调用),实现更复杂的业务逻辑(如AI客服查询订单)。
-
流式输出:实现AI响应的流式返回(类似ChatGPT的打字效果),提升用户体验,适用于对话类应用。
-
多模型集成:学习切换不同大模型(如OpenAI、DeepSeek、文心一言),根据场景动态选择最优模型,提升应用灵活性。
-
企业级部署:学习Spring AI应用的容器化部署(Docker)、集群部署,以及API Key的安全管理、流量控制。
六、学习资源推荐(官方+实用)
-
官方文档(最权威):Spring AI 官方参考文档 https://docs.spring.io/spring-ai/reference/index.html
-
官方示例:Spring AI GitHub示例库 https://github.com/spring-projects/spring-ai/tree/main/samples
-
版本更新:Spring AI 官方博客 https://spring.io/blog/categories/spring-ai(获取最新版本和特性)
-
本地模型:Ollama 官方文档 https://ollama.com/docs(部署本地大模型)
总结
Spring AI 是Java开发者集成AI能力的最佳选择,它降低了大模型集成的门槛,让开发者无需关注底层细节,专注于业务逻辑。本文从零基础出发,讲解了Spring AI的核心认知、环境搭建、4个实战案例,以及常见问题和进阶方向,全程附完整代码,新手可直接复制运行。
学习Spring AI的关键是多动手实践,从简单的单次对话到复杂的RAG应用,逐步积累经验。随着大模型技术的不断发展,Spring AI的生态会越来越完善,掌握它将成为Java开发者的核心竞争力之一。
最后,祝大家学习顺利,早日用Spring AI开发出自己的AI应用!如果本文对你有帮助,欢迎点赞、收藏、关注,后续会持续更新Spring AI进阶内容~
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)