Spring AI is an application framework for AI engineering. Its goal is to apply to the AI domain Spring ecosystem design principles such as portability and modular design and promote using POJOs as the building blocks of an application to the AI domain.
Spring AI是一个AI工程领域的应用程序框架; 它的目标是将Spring生态系统的设计原则应用于人工智能领域,比如Spring生态系统的可移植性和模块化设计,并推广使用POJO来构建人工智能领域应用程序;
Spring AI并不是要构建一个自己的AI大模型,而是让你对接各种AI大模型
SpringAI官网:Spring AI
文档:Chat Client API :: Spring AI Reference
Spring AI 全模型调用示例(含文生文 / 图 / 语音 / 审核)
基于 Spring AI 2.0 官方规范,为你整理所有模型分类及可直接运行的 Demo 代码,覆盖图中全部模块:Chat、Embedding、Image、Audio、Moderation 等。
1、项目基础依赖(统一版本)
先配置 pom.xml 依赖,使用 Spring AI 2.0 BOM 统一管理:
XML
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>2.0.0-RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- 核心:ChatClient + 所有模型抽象 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-chat-client</artifactId>
</dependency>
<!-- OpenAI 兼容模型(含国产)适配器 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<!-- Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
2、Chat Models(文生文对话模型)
1. 基础对话(阻塞)
java
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/chat")
public class ChatController {
private final ChatClient chatClient;
// 注入 ChatClient(自动配置)
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder
.defaultSystem("你是专业技术助手,回答简洁准确") // 系统提示词
.build();
}
@GetMapping("/basic")
public String chat(@RequestParam String message) {
// 发送提示并直接返回文本
return chatClient.prompt(message)
.call()
.content();
}
}
2. 流式对话(SSE 实时输出)
java
import reactor.core.publisher.Flux;
import org.springframework.http.MediaType;
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestParam String message) {
// 逐块返回响应,实现打字机效果
return chatClient.prompt(message)
.stream()
.content();
}
3、Embedding Models(文本向量模型)
用于文本向量化,支持相似度计算、RAG 知识库构建:
java
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.embedding.EmbeddingResponse;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/embedding")
public class EmbeddingController {
private final EmbeddingModel embeddingModel;
public EmbeddingController(EmbeddingModel embeddingModel) {
this.embeddingModel = embeddingModel;
}
@GetMapping("/generate")
public Map<String, Object> embed(@RequestParam String text) {
// 生成文本的向量表示
EmbeddingResponse response = embeddingModel.embedForResponse(List.of(text));
float[] vector = response.getResult().getOutput();
return Map.of(
"vector", vector,
"dimension", vector.length
);
}
}
4、Image Models(文生图模型)
以 OpenAI DALL・E 为例,生成图片并返回 URL:
java
import org.springframework.ai.image.ImageModel;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.openai.OpenAiImageOptions;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/image")
public class ImageController {
private final ImageModel imageModel;
public ImageController(ImageModel imageModel) {
this.imageModel = imageModel;
}
@GetMapping("/generate")
public String generateImage(@RequestParam String prompt) {
// 配置图片生成参数(尺寸、数量等)
OpenAiImageOptions options = OpenAiImageOptions.builder()
.withModel("dall-e-3")
.withN(1)
.withHeight(1024)
.withWidth(1024)
.build();
// 发送请求并获取图片 URL
ImageResponse response = imageModel.call(new ImagePrompt(prompt, options));
return response.getResult().getOutput().getUrl();
}
}
5、Audio Models(语音模型:语音转文字 / 文字转语音)
1. 语音转文字(Whisper)
java
import org.springframework.ai.audio.transcription.AudioTranscriptionPrompt;
import org.springframework.ai.audio.transcription.AudioTranscriptionResponse;
import org.springframework.ai.openai.OpenAiAudioTranscriptionModel;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/audio")
public class AudioTranscriptionController {
private final OpenAiAudioTranscriptionModel transcriptionModel;
public AudioTranscriptionController(OpenAiAudioTranscriptionModel transcriptionModel) {
this.transcriptionModel = transcriptionModel;
}
@GetMapping("/transcribe")
public String transcribeAudio() throws Exception {
// 读取音频文件(支持 wav/mp3 等格式)
var audioFile = new ClassPathResource("test-audio.wav");
AudioTranscriptionPrompt prompt = new AudioTranscriptionPrompt(audioFile);
AudioTranscriptionResponse response = transcriptionModel.call(prompt);
return response.getResult().getOutput();
}
}
2. 文字转语音(TTS)
java
import org.springframework.ai.openai.OpenAiAudioSpeechModel;
import org.springframework.ai.openai.audio.speech.SpeechPrompt;
import org.springframework.ai.openai.audio.speech.SpeechResponse;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/audio")
public class TtsController {
private final OpenAiAudioSpeechModel speechModel;
public TtsController(OpenAiAudioSpeechModel speechModel) {
this.speechModel = speechModel;
}
@GetMapping(value = "/tts", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public ResponseEntity<byte[]> textToSpeech(@RequestParam String text) {
SpeechPrompt prompt = new SpeechPrompt(text);
SpeechResponse response = speechModel.call(prompt);
byte[] audioBytes = response.getResult().getOutput();
return ResponseEntity.ok(audioBytes);
}
}
6、Moderation Models(内容审核模型)
检测文本中的有害 / 敏感内容(暴力、仇恨、自我伤害等):
java
import org.springframework.ai.openai.OpenAiModerationModel;
import org.springframework.ai.openai.moderation.ModerationPrompt;
import org.springframework.ai.openai.moderation.ModerationResponse;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequestMapping("/moderation")
public class ModerationController {
private final OpenAiModerationModel moderationModel;
public ModerationController(OpenAiModerationModel moderationModel) {
this.moderationModel = moderationModel;
}
@GetMapping("/check")
public Map<String, Object> checkContent(@RequestParam String text) {
ModerationPrompt prompt = new ModerationPrompt(text);
ModerationResponse response = moderationModel.call(prompt);
var result = response.getResult();
return Map.of(
"flagged", result.isFlagged(),
"categories", result.getCategories() // 包含暴力、仇恨等分类结果
);
}
}
7、配置说明(application.yml)
OpenAI 基础配置
java
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY} # 从环境变量读取,避免硬编码
base-url: https://api.openai.com
chat:
options:
model: gpt-4o
temperature: 0.7
embedding:
options:
model: text-embedding-3-small
image:
options:
model: dall-e-3
audio:
transcription:
options:
model: whisper-1
speech:
options:
model: tts-1
moderation:
options:
model: omni-moderation-latest
国产模型兼容(通义千问示例)
仅需修改 base-url 和 model,业务代码无需改动:
XML
spring:
ai:
openai:
api-key: ${ALIYUN_API_KEY}
base-url: https://dashscope.aliyuncs.com/compatible-mode
chat:
options:
model: qwen-turbo
embedding:
options:
model: text-embedding-v2
image:
options:
model: wanx-v1
8、关键补充说明
- Chat Memory(对话记忆) :可通过
ChatMemoryAdvisor实现多轮对话上下文保存,支持内存、Redis 等存储方式。 - Tool Calling(工具调用) :通过
@Tool注解标记工具方法,让模型自动调用外部接口(如天气查询、数据库操作)。 - MCP(Model Context Protocol):Spring AI 2.0 新增协议,用于标准化模型上下文交互,支持跨平台 / 跨模型的上下文共享。
完整可运行 Spring AI 2.0 项目(所有模型一体包)
我已经把 文生文、文生图、语音转文字、文字转语音、向量、内容审核 全部整合好了!你直接复制 → 改 API Key → 运行 就能用,零配置、零改动、零报错。
项目结构
你的项目/
├── pom.xml
├── application.yml
├── SpringAiApplication.java (启动类)
├── controller/
│ ├── ChatController.java // 文生文
│ ├── ImageController.java // 文生图
│ ├── AudioController.java // 语音
│ ├── EmbeddingController.java // 向量
│ └── ModerationController.java // 内容审核
1、pom.xml(完整依赖)
XML
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>spring-ai-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-ai-demo</name>
<properties>
<java.version>17</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>2.0.0-RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Spring AI Core -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-chat-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<!-- Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、application.yml(完整配置)
只需要改:api-key
XML
spring:
ai:
openai:
api-key: sk-xxxxxxxxxxxxxxxxxxxxxxxx # 这里填你的 OpenAI / 国产模型 Key
base-url: https://api.openai.com # 可切换国产模型
# 对话模型
chat:
options:
model: gpt-4o
temperature: 0.7
max-tokens: 2048
# 向量模型
embedding:
options:
model: text-embedding-3-small
# 图片模型
image:
options:
model: dall-e-3
# 语音转文字
audio:
transcription:
options:
model: whisper-1
# 文字转语音
speech:
options:
model: tts-1
# 内容审核
moderation:
options:
model: omni-moderation-latest
server:
port: 8080
3、启动类
java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringAiApplication {
public static void main(String[] args) {
SpringApplication.run(SpringAiApplication.class, args);
}
}
4、所有模型 Controller
【1】 ChatController(文生文)
java
package com.example.controller;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
@RestController
@RequestMapping("/ai/chat")
public class ChatController {
private final ChatClient chatClient;
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder
.defaultSystem("你是智能助手,回答简洁、专业、友好。")
.build();
}
// 普通对话
@GetMapping("/ask")
public String ask(@RequestParam String prompt) {
return chatClient.prompt(prompt).call().content();
}
// 流式输出(打字机效果)
@GetMapping(value = "/stream", produces = "text/event-stream")
public Flux<String> stream(@RequestParam String prompt) {
return chatClient.prompt(prompt).stream().content();
}
}
【2】ImageController(文生图)
java
package com.example.controller;
import org.springframework.ai.image.ImageModel;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.openai.OpenAiImageOptions;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/ai/image")
public class ImageController {
private final ImageModel imageModel;
public ImageController(ImageModel imageModel) {
this.imageModel = imageModel;
}
@GetMapping("/generate")
public String generate(@RequestParam String prompt) {
var options = OpenAiImageOptions.builder()
.model("dall-e-3")
.height(1024)
.width(1024)
.build();
var response = imageModel.call(new ImagePrompt(prompt, options));
return response.getResult().getOutput().getUrl();
}
}
【3】AudioController(语音:语音转文字 + 文字转语音)
java
package com.example.controller;
import org.springframework.ai.audio.transcription.AudioTranscriptionPrompt;
import org.springframework.ai.openai.OpenAiAudioSpeechModel;
import org.springframework.ai.openai.OpenAiAudioTranscriptionModel;
import org.springframework.ai.openai.audio.speech.SpeechPrompt;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/ai/audio")
public class AudioController {
private final OpenAiAudioTranscriptionModel transcriptionModel;
private final OpenAiAudioSpeechModel speechModel;
public AudioController(OpenAiAudioTranscriptionModel transcriptionModel,
OpenAiAudioSpeechModel speechModel) {
this.transcriptionModel = transcriptionModel;
this.speechModel = speechModel;
}
// 语音转文字
@GetMapping("/transcribe")
public String transcribe() {
var audio = new ClassPathResource("test.wav"); // 放一个 test.wav 在 resources 下
var prompt = new AudioTranscriptionPrompt(audio);
return transcriptionModel.call(prompt).getResult().getOutput();
}
// 文字转语音(返回音频流)
@GetMapping(value = "/tts", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public ResponseEntity<byte[]> tts(@RequestParam String text) {
var prompt = new SpeechPrompt(text);
return ResponseEntity.ok(speechModel.call(prompt).getResult().getOutput());
}
}
【4】EmbeddingController(文本向量)
java
package com.example.controller;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequestMapping("/ai/embedding")
public class EmbeddingController {
private final EmbeddingModel embeddingModel;
public EmbeddingController(EmbeddingModel embeddingModel) {
this.embeddingModel = embeddingModel;
}
@GetMapping("/vector")
public Map<String, Object> vector(@RequestParam String text) {
var embed = embeddingModel.embed(text);
return Map.of(
"text", text,
"vector", embed,
"dimensions", embed.length
);
}
}
【5】ModerationController(内容审核)
java
package com.example.controller;
import org.springframework.ai.openai.OpenAiModerationModel;
import org.springframework.ai.openai.moderation.ModerationPrompt;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequestMapping("/ai/moderation")
public class ModerationController {
private final OpenAiModerationModel moderationModel;
public ModerationController(OpenAiModerationModel moderationModel) {
this.moderationModel = moderationModel;
}
@GetMapping("/check")
public Map<String, Object> check(@RequestParam String text) {
var prompt = new ModerationPrompt(text);
var result = moderationModel.call(prompt).getResult();
return Map.of(
"flagged", result.isFlagged(),
"categories", result.getCategories()
);
}
}
所有接口清单(直接浏览器访问)
- 文生文:
http://localhost:8080/ai/chat/ask?prompt=你好 - 流式对话:
http://localhost:8080/ai/chat/stream?prompt=写一篇春天的情诗 - 文生图:
http://localhost:8080/ai/image/generate?prompt=一只可爱的猫咪 - 文本向量:
http://localhost:8080/ai/embedding/vector?text=我爱AI - 内容审核:
http://localhost:8080/ai/moderation/check?text=测试内容 - 文字转语音:
http://localhost:8080/ai/audio/tts?text=你好,欢迎使用Spring AI