AI - Java之SpringAI使用

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、关键补充说明

  1. Chat Memory(对话记忆) :可通过 ChatMemoryAdvisor 实现多轮对话上下文保存,支持内存、Redis 等存储方式。
  2. Tool Calling(工具调用) :通过 @Tool 注解标记工具方法,让模型自动调用外部接口(如天气查询、数据库操作)。
  3. 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
相关推荐
玩泥巴的2 小时前
MAF + 飞书:让大模型干活,但别让它乱干
ai·c#·.net·飞书·agent
我才是银古3 小时前
OpenGIS 技能插件开发与使用:在 DeepSeek Harness 里按需加载 GIS 知识
ai·gis·dsh
sbjdhjd5 小时前
从签名重放到 Agent Harness:一堂安全课程如何把前端逆向、MCP 与工程约束串起来
网络安全·ai·github·agent·webshell·mcp·harness
奇牙coding5 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai
全栈练习生5 小时前
AI安全与红队测试
python·ai
七夜zippoe6 小时前
Spring AI 是什么?Java 工程师的 AI 开发第一站
java·人工智能·spring·ai·开发
海带紫菜菠萝汤6 小时前
PostgreSQL 19 延期一个月:AI 把找 bug 变便宜了,修 bug 还是人工价
人工智能·ai·程序员·架构·大模型
运维开发王义杰6 小时前
AI 视频怎么选格式?从 MP4、MP3 到编码、剪辑与流媒体
ai
老牛日常随笔7 小时前
把ElevenLabs装进电脑:VoiceStudio如何用35K Star把语音克隆从云端搬到本地
人工智能·ai·电脑
运维开发王义杰7 小时前
Kokoro 和微软 TTS 怎么选?先分清本地模型与在线服务
ai