用 Spring AI 对接大模型,Java 党也能玩 AI 了
用 Spring AI 对接大模型,Java 党也能玩 AI 了
自从 ChatGPT 引爆了新一轮的 AI 浪潮之后,大语言模型(LLM)的开发生态几乎被 Python 一家独大。无论是大名鼎鼎的 LangChain,还是 LlamaIndex,亦或是各种深度学习框架,Python 似乎成了 AI 时代的“唯一指定语言”。
这让很多深耕企业级应用多年的 Java 开发者感到一丝焦虑:难道 Java 在这波 AI 浪潮中要被边缘化了吗?我们的老旧业务系统想要接入 AI,难道必须用 Python 重写,或者维护一套跨语言的微服务架构吗?
其实大可不必。Spring 官方敏锐地察觉到了这一痛点,推出了专门针对 AI 应用开发的框架:Spring AI。今天,我们就来聊聊如何用 Spring AI,让 Java 党也能优雅地玩转大模型。
一、 什么是 Spring AI?
如果你熟悉 Spring 生态,你一定知道 Spring 的核心设计哲学:面向接口编程,提供高度的抽象与统一的接入标准。比如 Spring Data 统一了各种数据库的访问,Spring Cloud 统一了微服务组件。
Spring AI 也是同样的套路。它提供了一套标准的 API 和抽象层,将各大模型厂商(如 OpenAI, Azure, 阿里通义千问, 智谱 AI 等)的底层调用细节屏蔽掉。对于 Java 开发者来说,你不需要去关心每个大模型厂商那些长得完全不一样的 RESTful API,只需要调用 Spring AI 提供的 ChatClient 接口即可。
Spring AI 的核心目标就是:将 AI 能力无缝集成到现有的企业级 Spring Boot 应用中。
二、 Spring AI 的核心概念
在开始写代码之前,我们需要了解 Spring AI 中的几个核心概念,这些概念其实很多借鉴了 LangChain,但融入了 Java 的强类型特性。
- ChatClient (聊天客户端):最核心的接口,用于与大语言模型进行交互。你可以用它发送提示词(Prompt)并获取模型的回复。
- Prompt (提示词):不仅仅是一段字符串,Spring AI 将其封装成了对象,包含了用户的输入(UserMessage)、系统预设指令(SystemMessage)等。
- PromptTemplate (提示词模板):类似于 MyBatis 的动态 SQL,你可以预先写好一段带有占位符的文本,在运行时将动态参数注入进去。
- OutputParser (输出解析器):大模型默认返回的是纯文本,但在企业应用中,我们往往需要结构化的数据(如 JSON)。OutputParser 可以帮我们将模型的文本回复自动反序列化为 Java 的实体类(POJO)。
- Vector Store (向量数据库):Spring AI 提供了对主流向量数据库(如 Chroma, Milvus, Redis 等)的统一抽象,这是实现 RAG(检索增强生成)架构的基础。
三、 快速上手:Hello Spring AI
接下来,我们用最简单的代码体验一下。以对接 OpenAI 兼容接口(如国产大模型或代理)为例。
1. 引入依赖
首先在 pom.xml 中引入 Spring AI 的 Starter(请确保使用较新的 Spring Boot 3.x 版本):
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0-M1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>2. 配置 application.yml
在配置文件中填入你的 API Key 和基础 URL。如果你使用的是国内模型(如通义千问提供了兼容 OpenAI 的接口),只需将 base-url 替换掉即可。
spring:
ai:
openai:
api-key: sk-your-api-key-here
base-url: https://api.openai.com
chat:
options:
model: gpt-3.5-turbo3. 编写 Controller
现在,我们可以直接在 Controller 中注入 ChatClient 来进行交互了!在最新版本的 Spring AI 中,推荐使用 ChatClient.Builder 来构建客户端。
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 AiController {
private final ChatClient chatClient;
public AiController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
@GetMapping("/chat")
public String chat(@RequestParam(value = "message", defaultValue = "讲个程序员的笑话") String message) {
return chatClient.prompt()
.user(message)
.call()
.content(); // 获取纯文本回复
}
}启动应用,访问 http://localhost:8080/chat,你就能看到大模型的回复了!整个过程非常“Spring Boot”,没有复杂的环境配置,没有晦涩的 Python 虚拟环境,一切都是 Java 开发者最熟悉的味道。
四、 进阶:结构化输出与 RAG
如果仅仅是聊天,那也太小看 Spring AI 了。在企业级场景下,我们常常需要 AI 帮我们提取信息并转为实体类。
Spring AI 提供了强大的**结构化输出(Structured Output)**功能。你只需要定义一个 Java Record:
public record MovieInfo(String title, String director, int year) {}然后利用 BeanOutputConverter:
@GetMapping("/movie")
public MovieInfo getMovieInfo(@RequestParam String movieName) {
var converter = new BeanOutputConverter<>(MovieInfo.class);
String prompt = "请告诉我关于电影 {movie} 的信息。严格按照以下格式输出:\n{format}";
PromptTemplate template = new PromptTemplate(prompt);
template.add("movie", movieName);
template.add("format", converter.getFormat());
String response = chatClient.prompt(template.create()).call().content();
// 将大模型返回的 JSON 字符串自动转换为 Java Record
return converter.convert(response);
}这样一来,大模型就像一个极其智能的微服务接口,直接吐出你能用的 Java 对象,这对于传统的业务系统对接简直是福音。
五、 总结
AI 的浪潮浩浩荡荡,Python 确实在模型训练和底层研究上占据绝对统治地位。但当 AI 走向落地,走向千行百业的业务系统时,工程化、稳定性、以及与现有系统的集成能力将成为关键。
Java 在企业级后台有着不可撼动的基本盘,Spring AI 的出现,补齐了 Java 生态在 AI 应用层的最后一块拼图。它让我们能够用最熟悉的工具栈,去拥抱最前沿的技术。
Java 党们,别再观望了,现在就可以把 Spring AI 引入你的项目中,给你们的老业务系统装上一个 AI 的大脑吧!