Spring AI:让大模型更好用的“桥梁”

Spring AI:让大模型更好用的"桥梁"

大语言模型越来越火,OpenAI、智谱、DeepSeek、通义千问等不断推出新版本。

但在 Java 里,开发者经常遇到几个问题:

  • 调用方式不统一:每个厂商的 API 格式都不一样。
  • 缺少抽象层:调用大模型接口像写 demo,而不是写生产级应用。
  • 和 Spring 生态割裂:项目是 Spring Boot 的,AI 却要单独封装。

Spring 团队在 2023 年底发布了 Spring AI ,目标就是提供一套抽象层,让开发者能用 统一的方式 接入不同的大模型服务,同时和 Spring Boot 生态无缝集成。


一、Spring AI 是什么?

一句话:Spring AI = Spring Boot for AI

它帮你屏蔽不同厂商的 SDK 差异,只需要改配置就能切换模型。

功能上主要分为几部分:

  1. Client 抽象:无论你用的是 OpenAI、Azure OpenAI、Anthropic 还是 Ollama,本地都通过统一的接口调用。
  2. Prompt 模板:支持模板化 prompt,变量替换。
  3. Memory 支持:可以保存上下文,做连续对话。
  4. 向量数据库集成:支持 Milvus、Pinecone、PGVector 等,方便做 RAG。
  5. Spring 生态集成:配置、依赖注入、Starter,都和 Spring Boot 一致。

二、Spring AI 的底层原理

Spring AI 的核心思路,其实就是 抽象一层"统一协议" ,再为不同的模型厂商做适配器。

可以用三句话总结:

  1. 抽象接口

    Spring AI 定义了一组通用接口,比如:

    • ChatClient → 统一的对话接口
    • EmbeddingClient → 向量生成接口
    • ImageClient → 图片生成接口

    这些接口就是"标准协议",和 JdbcTemplate 抽象数据库访问有点像。

  2. 适配器实现

    每个厂商(OpenAI、Azure、Ollama、Anthropic...)都提供自己的实现,底层还是 HTTP/SDK 调用,只是被封装成统一的接口。

    • OpenAI → OpenAiChatClient
    • Azure → AzureOpenAiChatClient
    • Ollama → OllamaChatClient

    换句话说,你在代码里调用的都是 ChatClient,但具体是哪家模型,是由配置文件 + Spring Boot Starter 决定的。

  1. Spring Boot 自动装配

    • 当你引入 spring-ai-openai-spring-boot-starter 时,Spring Boot 会自动创建 OpenAiChatClient Bean,并注入到容器里。
    • 你换成 spring-ai-azure-openai-spring-boot-starter,不用改业务代码,只要改配置。

这种机制,其实就是 Spring Boot Starter + 适配器模式 的组合。


三、快速上手:Spring Boot + Spring AI

1. 添加依赖

Maven:

xml 复制代码
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
    <version>0.8.1</version>
</dependency>

(如果用 Azure、Ollama,只需要替换对应 starter)

2. 配置文件

yaml 复制代码
spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
      chat:
        options:
          model: gpt-4o-mini

这样就完成了 OpenAI 接口的接入。

3. 编写代码

直接注入 ChatClient,就能发起对话:

arduino 复制代码
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.stereotype.Service;

@Service
public class AiService {

    private final ChatClient chatClient;

    public AiService(ChatClient chatClient) {
        this.chatClient = chatClient;
    }

    public String ask(String question) {
        return chatClient.prompt()
                .user(question)
                .call()
                .content();
    }
}

是不是很像 RestTemplate?这就是 Spring AI 的价值:熟悉的开发体验


四、实战:做一个"文档摘要器"

假设我们上传一段长文本,希望 AI 帮我们生成摘要。

Controller 示例:

kotlin 复制代码
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/ai")
public class SummaryController {

    private final AiService aiService;

    public SummaryController(AiService aiService) {
        this.aiService = aiService;
    }

    @PostMapping("/summary")
    public String summary(@RequestBody String content) {
        String prompt = "请帮我总结以下内容的核心要点,输出为 3 条:\n\n" + content;
        return aiService.ask(prompt);
    }
}

输入一段长文章,输出就是 3 条要点摘要。


五、Spring AI 的高级玩法

  1. Prompt 模板

    sql 复制代码
    String result = chatClient.prompt()
        .user(u -> u.text("翻译成英文: {input}").param("input", "你好,世界"))
        .call()
        .content();
  2. 上下文记忆

    支持简单的对话状态保存,比如连续追问。

  3. RAG 支持

    结合向量数据库,比如 Milvus:

    • 将文档向量化存储
    • 根据用户问题召回相关片段
    • 拼接到 Prompt 中再交给模型

    这一块上次文章已经实战过,就不展开了。


六、总结

Spring AI 的价值不是"帮你写更聪明的 AI",而是 让 AI 调用在 Java 项目里更规范、更统一、更容易维护

从底层原理上看:

  • 通过 抽象接口 统一调用方式
  • 通过 适配器模式 屏蔽厂商差异
  • 借助 Spring Boot 自动装配 实现零侵入切换

这让 Java 开发者能像用 JdbcTemplate 访问数据库一样,用 ChatClient 调用各种大模型。

最后

如果文章对你有帮助,点个免费的赞鼓励一下吧!关注公众号:加瓦点灯, 每天推送干货知识!

相关推荐
数据知道18 分钟前
Go基础:一文掌握Go语言泛型的使用
开发语言·后端·golang·go语言
楼田莉子1 小时前
python学习:爬虫+项目测试
后端·爬虫·python·学习
阿挥的编程日记1 小时前
基于SpringBoot的高校(学生综合)服务平台的设计与实现
java·spring boot·后端·spring·mybatis
她说彩礼65万2 小时前
Asp.net core appsettings.json` 和 `appsettings.Development.json`文件区别
后端·json·asp.net
用户21411832636022 小时前
国产化算力实战:手把手教你在魔乐社区用华为昇腾 NPU 跑通模型推理
后端
IT_陈寒2 小时前
SpringBoot性能飞跃:5个关键优化让你的应用吞吐量提升300%
前端·人工智能·后端
M1A12 小时前
你的认知模式,决定了你的人生高度
后端
追逐时光者3 小时前
Everything替代工具,一款基于 .NET 开源免费、高效且用户友好文件搜索工具!
后端·.net
QX_hao3 小时前
【Go】--数据类型
开发语言·后端·golang
桦说编程3 小时前
线程池拒绝策略避坑:谨慎使用抛弃策略,可能导致系统卡死
java·后端