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 调用各种大模型。

最后

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

相关推荐
回家路上绕了弯1 小时前
ClickHouse 深度解析:从核心特性到实战应用,解锁 OLAP 领域新势能
数据库·后端
xiaok1 小时前
本地用VScode的Live Server监听5500访问页面,ubuntu上不需要在配置5500
后端
雨绸缪1 小时前
ABAP 时间戳
后端
m0_480502641 小时前
Rust 登堂 之 函数式编程(三)
开发语言·后端·rust
艾醒2 小时前
大模型面试题剖析:大模型微调与训练硬件成本计算
人工智能·后端·算法
自由生长20242 小时前
每日知识-设计模式-状态机模式
后端
用户298698530142 小时前
如何使用 Spire.Doc 在 C# 中创建、写入和读取 Word 文档?
后端
林太白2 小时前
项目中的层级模块到底如何做接口
前端·后端·node.js
一枚小小程序员哈2 小时前
基于Android的车位预售预租APP/基于Android的车位租赁系统APP/基于Android的车位管理系统APP
android·spring boot·后端·struts·spring·java-ee·maven
二闹2 小时前
从@Transactional失效场景到传播行为原理
java·后端