Spring AI:让大模型更好用的"桥梁"
大语言模型越来越火,OpenAI、智谱、DeepSeek、通义千问等不断推出新版本。
但在 Java 里,开发者经常遇到几个问题:
- 调用方式不统一:每个厂商的 API 格式都不一样。
- 缺少抽象层:调用大模型接口像写 demo,而不是写生产级应用。
- 和 Spring 生态割裂:项目是 Spring Boot 的,AI 却要单独封装。
Spring 团队在 2023 年底发布了 Spring AI ,目标就是提供一套抽象层,让开发者能用 统一的方式 接入不同的大模型服务,同时和 Spring Boot 生态无缝集成。
一、Spring AI 是什么?
一句话:Spring AI = Spring Boot for AI 。
它帮你屏蔽不同厂商的 SDK 差异,只需要改配置就能切换模型。
功能上主要分为几部分:
- Client 抽象:无论你用的是 OpenAI、Azure OpenAI、Anthropic 还是 Ollama,本地都通过统一的接口调用。
- Prompt 模板:支持模板化 prompt,变量替换。
- Memory 支持:可以保存上下文,做连续对话。
- 向量数据库集成:支持 Milvus、Pinecone、PGVector 等,方便做 RAG。
- Spring 生态集成:配置、依赖注入、Starter,都和 Spring Boot 一致。
二、Spring AI 的底层原理
Spring AI 的核心思路,其实就是 抽象一层"统一协议" ,再为不同的模型厂商做适配器。
可以用三句话总结:
-
抽象接口 :
Spring AI 定义了一组通用接口,比如:
ChatClient
→ 统一的对话接口EmbeddingClient
→ 向量生成接口ImageClient
→ 图片生成接口
这些接口就是"标准协议",和
JdbcTemplate
抽象数据库访问有点像。 -
适配器实现 :
每个厂商(OpenAI、Azure、Ollama、Anthropic...)都提供自己的实现,底层还是 HTTP/SDK 调用,只是被封装成统一的接口。
- OpenAI →
OpenAiChatClient
- Azure →
AzureOpenAiChatClient
- Ollama →
OllamaChatClient
换句话说,你在代码里调用的都是
ChatClient
,但具体是哪家模型,是由配置文件 + Spring Boot Starter 决定的。 - OpenAI →

-
Spring Boot 自动装配:
- 当你引入
spring-ai-openai-spring-boot-starter
时,Spring Boot 会自动创建OpenAiChatClient
Bean,并注入到容器里。 - 你换成
spring-ai-azure-openai-spring-boot-starter
,不用改业务代码,只要改配置。
- 当你引入
这种机制,其实就是 Spring Boot Starter + 适配器模式 的组合。
三、快速上手:Spring Boot + Spring AI
1. 添加依赖
Maven:
xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>0.8.1</version>
</dependency>
(如果用 Azure、Ollama,只需要替换对应 starter)
2. 配置文件
yaml
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
chat:
options:
model: gpt-4o-mini
这样就完成了 OpenAI 接口的接入。
3. 编写代码
直接注入 ChatClient
,就能发起对话:
arduino
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.stereotype.Service;
@Service
public class AiService {
private final ChatClient chatClient;
public AiService(ChatClient chatClient) {
this.chatClient = chatClient;
}
public String ask(String question) {
return chatClient.prompt()
.user(question)
.call()
.content();
}
}
是不是很像 RestTemplate
?这就是 Spring AI 的价值:熟悉的开发体验。
四、实战:做一个"文档摘要器"
假设我们上传一段长文本,希望 AI 帮我们生成摘要。
Controller 示例:
kotlin
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/ai")
public class SummaryController {
private final AiService aiService;
public SummaryController(AiService aiService) {
this.aiService = aiService;
}
@PostMapping("/summary")
public String summary(@RequestBody String content) {
String prompt = "请帮我总结以下内容的核心要点,输出为 3 条:\n\n" + content;
return aiService.ask(prompt);
}
}
输入一段长文章,输出就是 3 条要点摘要。
五、Spring AI 的高级玩法
-
Prompt 模板
sqlString result = chatClient.prompt() .user(u -> u.text("翻译成英文: {input}").param("input", "你好,世界")) .call() .content();
-
上下文记忆
支持简单的对话状态保存,比如连续追问。
-
RAG 支持
结合向量数据库,比如 Milvus:
- 将文档向量化存储
- 根据用户问题召回相关片段
- 拼接到 Prompt 中再交给模型
这一块上次文章已经实战过,就不展开了。
六、总结
Spring AI 的价值不是"帮你写更聪明的 AI",而是 让 AI 调用在 Java 项目里更规范、更统一、更容易维护。
从底层原理上看:
- 通过 抽象接口 统一调用方式
- 通过 适配器模式 屏蔽厂商差异
- 借助 Spring Boot 自动装配 实现零侵入切换
这让 Java 开发者能像用 JdbcTemplate
访问数据库一样,用 ChatClient
调用各种大模型。
最后
如果文章对你有帮助,点个免费的赞鼓励一下吧!关注公众号:加瓦点灯, 每天推送干货知识!