🚀 前言:Java 开发者的 AI 破局之路
在过去的一两年里,Python 凭借 LangChain 等框架几乎统治了 AI 应用层开发。作为 Java 开发者,我们难道只能看着或者被迫转语言吗?
当然不是! Spring 官方重磅推出的 Spring AI 框架,正是为了解决这个问题而来。它将 Spring 生态的设计理念(依赖注入、POJO 编程、抽象接口)带入了 AI 领域,让我们能够用最熟悉的 Java 代码,轻松对接 OpenAI、Ollama、Azure 等各种大模型。
今天,我们就来深度拆解 Spring AI,手把手教你构建一个智能应用。
📚 一、什么是 Spring AI?
Spring AI 是一个应用框架,旨在简化包含人工智能功能的应用程序开发,避免与特定模型提供商(如 OpenAI)过度耦合。
核心理念:Portable API(可移植 API)
就像 Spring Data 让我们切换数据库只需改配置一样,Spring AI 让我们切换大模型也只需改一行配置。
核心特性
- 统一的模型接口:支持 Chat(聊天)、Image(绘图)、Audio(语音)。
- Prompt Management :支持模板化的提示词管理 (
.st文件)。 - Function Calling:允许大模型回调 Java 方法(例如查数据库、调 API)。
- RAG(检索增强生成):内置了向量数据库(Vector Store)和文档加载器(Document Reader)的抽象。
- 结构化输出:自动将 AI 的回复映射为 Java Bean。
🛠️ 二、快速上手:5分钟搭建 AI 助手
我们将基于 Spring Boot 3.2+ 和 JDK 17+ ,对接 OpenAI 协议(也可以轻松换成本地的 Ollama)。
1. 引入依赖
在 pom.xml 中添加 Spring AI 的 Milestone 仓库(注意:Spring AI 迭代较快,建议关注官网最新版本,这里以 Milestone 为例):
xml
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring AI OpenAI Starter -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<!-- 务必添加 Spring Milestone 仓库 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
2. 配置文件
在 application.yml 中配置 API Key。如果你用的是第三方中转服务,记得修改 base-url。
yaml
spring:
application:
name: spring-ai-demo
ai:
openai:
api-key: sk-xxxxxxxxxxxxxxxxxxxxxxxx # 替换你的 Key
base-url: https://api.openai.com # 或者你的中转地址
chat:
options:
model: gpt-3.5-turbo # 指定模型
💻 三、实战代码详解
3.1 基础对话:使用 ChatClient
Spring AI 提供了 ChatClient,这是一个流式(Fluent)风格的 API,非常优雅。
java
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ChatController {
private final ChatClient chatClient;
// 构造器注入,Spring AI 自动配置好了 builder
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@GetMapping("/chat")
public String chat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.call()
.content(); // 直接获取文本内容
}
}
启动调用:
访问 http://localhost:8080/chat?message=给我讲个笑话,你将直接收到 AI 的回复。
3.2 进阶:Prompt Template(提示词模板)
在实际开发中,我们不会硬编码 Prompt。Spring AI 支持类似 MessageFormat 的占位符。
java
@GetMapping("/analyze")
public String analyzeSentiment(@RequestParam String product, @RequestParam String comment) {
String template = """
你是一个电商情感分析师。
请分析用户对产品 {product} 的评论:"{comment}"。
只返回以下三个单词之一:正面、负面、中性。
""";
return chatClient.prompt()
.user(u -> u.text(template)
.param("product", product)
.param("comment", comment))
.call()
.content();
}
3.3 核心杀手锏:结构化输出 (Structured Output)
这是 Java 开发者最喜欢的功能!不用再费劲去正则匹配 JSON 了,Spring AI 能自动把 LLM 的回复转成 Java Bean。
定义 POJO:
java
public record MovieReview(String title, String summary, double rating) {}
Controller 实现:
java
import org.springframework.core.ParameterizedTypeReference;
import java.util.List;
@GetMapping("/recommend")
public List<MovieReview> recommendMovies(@RequestParam String category) {
return chatClient.prompt()
.user(u -> u.text("推荐3部高分的{category}电影")
.param("category", category))
.call()
.entity(new ParameterizedTypeReference<List<MovieReview>>() {});
// 👆 这里神奇的事情发生了,直接返回 List<MovieReview> 对象
}
原理解析:
Spring AI 会自动在 Prompt 后面追加一段 Schema 指令,告诉 LLM 必须返回符合该 JSON 结构的文本,然后利用 BeanOutputParser 自动反序列化。
🧩 四、Spring AI vs LangChain4j
很多朋友会问,市面上还有 LangChain4j,该怎么选?
| 维度 | Spring AI | LangChain4j |
|---|---|---|
| 背景 | Spring 官方团队出品(VMware/Broadcom) | 社区驱动 |
| 设计风格 | 极致的 Spring 风格,依赖注入、自动配置 | 模仿 Python LangChain 的设计 |
| 集成度 | 与 Spring Boot 浑然天成 | 也是主要适配 Java,但更独立 |
| 生态位 | 适合追求标准化、企业级稳定性的项目 | 适合想要快速尝试新特性、灵活度高的项目 |
建议: 如果你的项目已经是重度 Spring Boot 项目,首选 Spring AI。
🔗 五、接入本地大模型 (Ollama)
想免费跑 AI?用 Ollama 部署 Llama3 或 DeepSeek。Spring AI 切换过去只需要改几行配置!
- 安装 Ollama 并运行
ollama run llama3。 - 修改依赖 :将
spring-ai-openai换成spring-ai-ollama。 - 修改配置:
yaml
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
model: llama3
**Java 代码一行都不用动!**这就是 Spring AI 抽象层的威力。
📝 总结
Spring AI 的出现标志着 Java 正式进入了大模型应用开发的"正规军"时代。它不仅解决了 Python 难以集成到现有 Java 企业系统的问题,还通过优雅的抽象屏蔽了不同大模型厂商的 API 差异。
未来展望:
随着 Spring AI 的不断迭代,RAG(检索增强生成)和 Agent(智能体)的支持会越来越完善。作为 Java 开发者,现在正是上车学习的最佳时机!
