本文由 AI 资料搜集助手 完成框架梳理与资料聚合,聚焦 Spring AI 的核心设计理念、ChatClient 与 ChatModel 的架构关系,以及底层自动配置原理。通过痛点分析、极简代码示例和面试高频考点,帮助读者在 20 分钟内建立起 Spring AI 的完整知识链路。
一、开篇引入:为什么每个 Java 开发者都需要了解 Spring AI

大模型技术正在重构软件开发的边界,Java 开发者面临一个两难局面:一边是业务系统对 AI 能力的需求井喷,另一边是 Python 生态的 AI 框架让 Java 团队望而却步。Spring AI(Spring Artificial Intelligence Framework)正是为了解决这一矛盾而生——它是 Spring 官方推出的 AI 应用开发框架,于 2025 年 5 月正式发布 1.0 GA 版本-20。
学习者的常见痛点在于:直接调用各厂商大模型 API 不仅代码冗余,还面临厂商锁定的风险;对 PromptTemplate、ChatModel、ChatClient 等概念理解不清,面试时答不出底层原理;甚至分不清 ChatModel 和 ChatClient 的区别。本文将从痛点切入,逐步拆解 Spring AI 的核心概念与实现机制,配合可运行的代码示例和面试题,帮助读者建立完整的知识链路。

二、痛点切入:为什么需要 Spring AI
2.1 传统调用方式:碎片化的 API
假设你正在开发一个智能客服系统,初期接入 OpenAI 的 GPT-4,后期需要切换到国产模型 DeepSeek 或通义千问。传统方式下,代码会变成这样:
// OpenAI 调用 OpenAiService service = new OpenAiService(apiKey); ChatCompletionRequest request = ChatCompletionRequest.builder() .model("gpt-4") .messages(List.of(new Message("user", "你好"))) .build(); service.createChatCompletion(request); // DeepSeek 调用 — 完全不同的 API DeepSeekClient client = new DeepSeekClient(apiKey); DeepSeekRequest req = new DeepSeekRequest(); req.setPrompt("你好"); client.chat(req);
2.2 痛点分析
这种传统方式的三个核心缺陷:
| 痛点 | 具体表现 |
|---|---|
| 厂商锁定 | 业务代码与具体模型 SDK 强耦合,切换模型需大量重构 |
| 配置冗余 | 每个模型都要重复处理 HTTP 连接、认证、重试等底层逻辑 |
| 可移植性差 | 缺乏统一的抽象层,难以在开发、测试、生产环境之间切换模型 |
2.3 Spring AI 的设计初衷
Spring AI 正是为了解决这些痛点而生。其核心目标可以概括为一句话:用一套统一 API,屏蔽大模型的碎片化差异。它将 Spring 生态的可移植性、模块化设计和 POJO 优先原则引入 AI 工程领域,让开发者用熟悉的 Spring 风格快速构建 AI 应用-1-。
三、核心概念讲解:ChatClient
3.1 标准定义
ChatClient(聊天客户端)是 Spring AI 提供的高层封装接口,基于底层 ChatModel 构建,提供一套通用、灵活且面向未来的 Fluent API,让开发者可以“一次编写,多模型运行”-36。
3.2 拆解关键词
高层封装:ChatClient 是面向日常开发的 API,而非底层基础设施
Fluent API:采用链式调用,语法简洁直观
可移植性:无论底层是 GPT、DeepSeek 还是 Qwen,代码写法保持一致
3.3 生活化类比
把 ChatClient 想象成 USB 接口:无论是鼠标、键盘还是 U 盘,插入电脑的方式都是一样的。开发者不需要关心 USB 设备内部的工作原理,只需要通过统一的接口进行交互。同样,ChatClient 将 OpenAI、DeepSeek、通义千问等不同厂商的大模型统一为一致的调用体验。
3.4 核心价值
ChatClient 解决了三个核心问题:降低学习成本(一套 API 通吃所有模型)、提升代码复用性(模型切换零代码改动)、增强可维护性(统一拦截和增强机制)。
四、关联概念讲解:ChatModel
4.1 标准定义
ChatModel(聊天模型接口)是 Spring AI 的底层抽象接口,定义了与大模型交互的基本契约(如 call(Prompt prompt))。每个模型厂商提供自己的实现类,如 OpenAiChatModel、DeepSeekChatModel、QwenChatModel 等-36。
4.2 ChatClient 与 ChatModel 的关系
二者的关系可以用一句话概括:ChatModel 是底层的“执行者”,ChatClient 是高层的“门面”。
| 对比维度 | ChatModel | ChatClient |
|---|---|---|
| 定位 | 底层模型交互接口 | 高层 Fluent API 封装 |
| 使用场景 | 深度定制、精细控制 | 日常开发、快速集成 |
| API 风格 | 传统方法调用 | 链式 Fluent API |
| 功能丰富度 | 基础模型调用 | 内置系统提示、工具调用、记忆管理、流式响应 |
4.3 运行机制示例
// 使用 ChatModel(底层)—— 需要手动构造 Prompt ChatModel model = new OpenAiChatModel(openAiApi); ChatResponse response = model.call(new Prompt("你好")); String result = response.getResult().getOutput().getContent(); // 使用 ChatClient(高层)—— 链式调用,更简洁 ChatClient chatClient = ChatClient.builder(model).build(); String result = chatClient.prompt() .system("你是一个专业的助手") .user("你好") .call() .content();
五、概念关系与区别总结
5.1 逻辑关系清晰梳理
| 概念 | 本质 | 一句话总结 |
|---|---|---|
| ChatModel | 契约/接口(思想) | “能做什么”——定义了与大模型交互的规范 |
| ChatClient | 封装/实现(落地) | “怎么做得更好”——提供更易用的 API |
5.2 记忆口诀
ChatModel 定标准,ChatClient 更方便;底层实现各不同,上层调用一条链。
核心理念是 面向接口编程,而非具体实现,这正是 Spring AI 避免厂商锁定的架构保障-35。
六、代码示例:从零搭建 Spring AI 应用
6.1 环境准备
在 Spring Boot 项目中添加依赖(以 Ollama 本地部署为例):
<!-- Spring Boot 3.4.x 兼容 Spring AI 1.1.x --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-ollama</artifactId> <version>1.1.0</version> </dependency>
在 application.yml 中配置模型:
spring: ai: ollama: base-url: http://localhost:11434 chat: options: model: qwen2.5:latest
6.2 极简调用示例
import org.springframework.ai.chat.client.ChatClient; import org.springframework.stereotype.Service; @Service public class AIService { private final ChatClient chatClient; // ⭐ 通过构造函数注入 ChatClient.Builder,框架自动配置 public AIService(ChatClient.Builder builder) { this.chatClient = builder.build(); } public String chat(String question) { return chatClient.prompt() .system("你是一个技术助手,回答问题要简洁、准确") .user(question) .call() .content(); // 获取响应文本 } }
关键步骤说明:
ChatClient.Builder由 Spring AI 自动配置注入.prompt().system().user()构建提示词.call().content()发起同步调用并获取响应
6.3 流式响应示例
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; @RestController public class StreamController { private final ChatClient chatClient; public StreamController(ChatClient.Builder builder) { this.chatClient = builder.build(); } // ⭐ 流式返回,适合聊天场景的逐字输出 @GetMapping(value = "/stream", produces = "text/event-stream") public Flux<String> stream(String question) { return chatClient.prompt() .user(question) .stream() .content(); // 返回 Flux<String>,逐字推送 } }
6.4 新旧对比
| 维度 | 传统方式(原生 SDK) | Spring AI 方式 |
|---|---|---|
| 切换模型 | 需重写大量代码 | 仅改配置文件和依赖 |
| 代码量 | 约 50+ 行 | 约 10 行 |
| 流式响应 | 手动处理 SSE | 一行 .stream() |
| 依赖管理 | 手动管理版本冲突 | Starter 统一管理 |
| 企业特性 | 需要自建 | 内置重试、限流、监控 |
七、底层原理与技术支撑
7.1 依赖倒置原则(DIP)—— 解耦的基石
Spring AI 实现多模型切换的秘密并非代码有多复杂,而是对经典软件工程原则的极致应用。核心思想是:高层模块(业务逻辑)不应依赖低层模块(具体 LLM 实现),二者都应依赖抽象(接口)。
在 Spring AI 中的映射:
抽象:
ChatModel、EmbeddingModel接口高层模块:业务 Service 层,永远只依赖
ChatModel接口低层模块:
OpenAiChatModel、QwenChatModel等具体实现类
当从 OpenAI 切换到 Ollama 本地模型时,业务代码不需要修改一行代码——只需要替换 Spring IoC 容器中注入的具体实现类即可-35。
7.2 协议适配层(Adapter Pattern)
每个 spring-ai-starter-model-{provider} 本质上就是一个协议适配器,完成两项核心工作:
输入适配:将 Spring AI 定义的标准输入对象(
Prompt、ChatOptions)转换为特定厂商 API 所需的请求格式输出适配:解析厂商返回的响应,统一封装为
ChatResponse对象
7.3 自动配置(Auto-Configuration)
Spring AI 通过 Spring Boot 的自动配置机制实现“零配置接入”,其工作原理分为四层-46:
┌─────────────────────────────────────────────────────┐ │ 业务代码 (@Service 注入 ChatClient) │ └─────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────┐ │ Starter(聚合依赖)—— spring-ai-starter-model-ollama │ └─────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────┐ │ Auto-Configuration 模块(条件化创建 Bean) │ │ @ConditionalOnClass / @ConditionalOnMissingBean │ └─────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────┐ │ 实现模块(Provider-specific)—— OllamaChatModel │ └─────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────┐ │ 核心 API(Core)—— ChatModel、ChatClient 接口 │ └─────────────────────────────────────────────────────┘
从 1.0 版本开始,Spring AI 将自动配置从单一的 monolithic artifact 拆分为每个模型独立的 artifact,有效避免了版本依赖冲突-44。
7.4 底层支撑总结
| 底层技术 | 在 Spring AI 中的应用 |
|---|---|
| 依赖倒置原则 | 业务层依赖 ChatModel 接口,不依赖具体实现 |
| 适配器模式 | 每个 Starter 包装特定厂商 API,统一输入输出 |
| 条件化配置 | @ConditionalOnClass 按需创建 Bean |
| 责任链模式 | Advisors 链式拦截和增强交互过程 |
八、高频面试题与参考答案
Q1:Spring AI 是什么?它与传统的 TensorFlow/PyTorch 有什么区别?
参考答案:
Spring AI 是 Spring 官方推出的 AI 应用开发框架,将 Spring 生态的可移植性、模块化设计和 POJO 优先原则引入 AI 工程领域。
区别(踩分点):
定位不同:传统 AI 框架(TensorFlow、PyTorch)专注于模型训练,而 Spring AI 更侧重于 AI 能力的生产部署和系统集成-31
集成能力:Spring AI 深度融合 Spring Boot、Spring Cloud 生态,可直接复用依赖注入、事务管理等企业级组件-31
使用门槛:Spring AI 通过统一的 ChatClient 接口屏蔽底层差异,开发者无需深入理解 HTTP 协议和模型 API 细节
Q2:ChatClient 和 ChatModel 的区别是什么?日常开发应该用哪个?
参考答案:
| 维度 | ChatModel | ChatClient |
|---|---|---|
| 定位 | 底层模型交互接口 | 高层 Fluent API 封装 |
| API 风格 | 传统方法调用 | 链式调用,语法简洁 |
| 内置功能 | 基础模型调用 | 系统提示、工具调用、记忆管理、流式响应 |
结论:日常开发优先使用 ChatClient,仅在需要深度定制时使用 ChatModel-36。
Q3:Spring AI 如何避免厂商锁定?底层原理是什么?
参考答案:
核心原理是 依赖倒置原则。业务代码只依赖 ChatModel 抽象接口,不依赖具体的厂商实现类(如 OpenAiChatModel)。当需要切换模型时,只需要:
替换 Maven 依赖(如从
spring-ai-starter-model-openai改为spring-ai-starter-model-ollama)修改配置文件中的模型相关参数
业务代码一行都不需要改-35
Q4:Spring AI 的自动配置是如何工作的?
参考答案:
Spring AI 利用 Spring Boot 的条件化配置机制,分为四层架构:
Starter 层:聚合依赖,方便引入
Auto-Configuration 层:通过
@ConditionalOnClass等注解,按类路径判断是否创建对应的 Bean实现层:各厂商的具体实现代码
核心 API 层:定义
ChatModel、ChatClient等可移植接口
从 1.0 版本开始,自动配置拆分为每个模型独立,避免了版本冲突-44。
Q5:Spring AI 支持哪些大模型?如何选择?
参考答案:
Spring AI 通过 Starter 机制支持主流大模型:
| 模型提供商 | Starter 名称 | 适用场景 |
|---|---|---|
| OpenAI | spring-ai-starter-model-openai | 国际业务、追求模型效果 |
| 阿里通义千问 | spring-ai-starter-model-qwen | 国产化、合规要求 |
| DeepSeek | spring-ai-starter-model-deepseek | 高性价比 |
| Ollama | spring-ai-starter-model-ollama | 本地部署、数据安全 |
| Google Gemini | spring-ai-starter-model-vertex-ai-gemini | 多模态场景 |
选择建议:优先考虑业务场景、合规要求、成本预算和部署方式,Spring AI 允许在不同环境(开发/测试/生产)灵活切换而无需改动代码-16-。
九、结尾总结
9.1 全文核心知识点回顾
Spring AI 定位:Java 生态的大模型集成框架,解决模型碎片化和厂商锁定问题
核心概念:ChatModel(底层契约)+ ChatClient(高层封装)= 统一 API
底层原理:依赖倒置原则 + 适配器模式 + 条件化自动配置
代码要点:
ChatClient.Builder注入 →.prompt()→.call()→.content()
9.2 重点与易错点提醒
⚠️ ChatClient 必须通过
ChatClient.Builder构建,不能直接new-36⚠️ 不同版本 Spring Boot 对应不同的 Spring AI 版本:Spring Boot 3.5.x 对应 Spring AI 1.1.x-46
⚠️ 流式响应返回
Flux<String>,需配合text/event-stream媒体类型
9.3 进阶预告
下一篇文章将深入 Spring AI 的 Tool Calling 机制,讲解如何让大模型调用你的业务 API 实现自动化操作,同时剖析其底层的工作流编排原理。欢迎持续关注由 AI 资料搜集助手 整理的系列技术专栏。
参考资料:
Spring AI 官方文档 [24†L19-L24]
Spring AI 1.0 GA 发布公告 [12†L6-L7]
Spring AI 架构设计解析 [9†L23-L28]
ChatClient 与 ChatModel 详解 [17†L7-L17]