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-urlmodel,业务代码无需改动:

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
相关推荐
ai小陈1 小时前
LoRA微调显存怎么估?32GB GPU训练配置与常见问题排查
人工智能·深度学习·机器学习·ai·gpu算力
腾视科技-AI2 小时前
超低功耗 性能卓越|腾视科技重磅推出TS-SG-SM9系列AI算力模组,引领边缘智能计算新篇章!
人工智能·科技·ai·ai算力模组·ai模组·腾视科技·ai算力盒
武子康2 小时前
商业比较词进入 AI Overview:Semrush 60 万关键词研究能说明什么
人工智能·ai·架构·agent·claude·codex·semrush
lifallen6 小时前
短暂 Agent 与持久化工程:让理解脱离对话
人工智能·学习·ai·重构·ai编程
举个栗子。8 小时前
Marin:开源基础模型研究与开发框架,从数据到模型全链路可复现
人工智能·ai·开源
undsky_8 小时前
【n8n教程】:Email Trigger IMAP节点,实现邮件自动化处理
人工智能·ai·aigc·ai编程
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ8 小时前
new AllMiniLmL6V2EmbeddingModel(); 相关方法介绍
springai
云卷云舒___________8 小时前
OpenAI内测GPT-6 Sol,Claude Fable 5.2泄密,GLM-5.3-CYBERSECURITY 攻防安全模型炸场 | 9月7日 AI日报
ai·openai·claude·anthropic·ai日报·gpt6·glm53
liulilittle8 小时前
为什么需要回程闲置保护?
ai·llm·prompt·agent·tools·subagent·opencode