你是否曾经幻想过,在Spring Boot项目中像调用本地Service一样调用大模型?无需学习各家SDK的差异,也无需处理复杂的HTTP请求封装?其实这一切,Spring AI早已为你实现。本文将带你从零到一,深度解析Spring AI这个官方框架,通过ChatClient优雅地集成大模型,构建属于你的类似AI助手。
一、痛点切入:传统Java集成大模型的困境

在Spring AI出现之前,Java开发者要在项目中接入大模型能力,通常需要这样做:
// 调用OpenAI的SDKOpenAiClient client = new OpenAiClient(apiKey); ChatCompletionRequest request = ChatCompletionRequest.builder() .model("gpt-4") .messages(List.of(new Message("user", "讲个笑话"))) .build(); ChatCompletionResponse response = client.chat(request); String answer = response.getChoices().get(0).getMessage().getContent();
而换到通义千问时,代码几乎要完全重写——API签名、请求对象、响应解析方式全部不同。这种方案的缺点显而易见:
高耦合:业务代码与具体厂商SDK绑定,切换模型成本极高
缺乏统一抽象:每个模型有自己的请求/响应格式,无法复用
Prompt管理困难:提示词硬编码在代码中,难以维护和版本控制
RAG/向量检索等高级能力缺失:需要开发者自行实现文档切片、向量化和检索逻辑
Spring AI正是在这样的背景下诞生的——让Java开发者像使用Spring Boot一样方便地调用AI模型。-1
二、核心概念讲解:ChatModel
2.1 什么是ChatModel?
ChatModel是Spring AI中定义的核心接口,代表与AI大模型进行对话的能力。它屏蔽了不同厂商(OpenAI、阿里通义、Ollama等)的API差异,提供统一的调用方式。
用大白话来解释:把ChatModel想象成一个“智能对话机器人”,你给它发消息,它回复你答案。-1
// 在任何Service或Controller中注入ChatModel @Resource private ChatModel chatModel; // 发送一条消息,获取完整回复 String response = chatModel.call("你好,介绍一下你自己");
ChatModel的主要方法包括:
call(String message):发送一条消息,获取完整回复stream(String message):以流式方式获取回复(实现打字机效果)
2.2 ChatModel的自动配置机制
ChatModel的强大之处在于:无论底层用的是OpenAI、通义千问还是Ollama,Controller中注入的都是同一个类型——ChatModel。-1不同的AI厂商各自提供自己的Starter依赖和自动配置类来实现这个接口,开发者只需要切换依赖和配置文件,业务代码一行都不用改。
三、关联概念讲解:ChatClient
3.1 什么是ChatClient?
如果说ChatModel是“发动机”,那么ChatClient就是“方向盘+仪表盘”——它是在ChatModel之上封装的应用层Fluent客户端,让开发者用更自然、更链式的方式构建Prompt、配置参数和执行调用。-9
@RestController public class ChatController { private final ChatClient chatClient; // 通过构造函数注入Builder并创建ChatClient public ChatController(ChatClient.Builder builder) { this.chatClient = builder.build(); } // 极简调用:一行代码完成 @GetMapping("/chat") public String chat(@RequestParam String message) { return chatClient.prompt(message).call().content(); } }
这个例子中,只需要注入ChatClient.Builder,调用builder.build()即可获得ChatClient实例,然后一行prompt().call().content()就完成了大模型调用。
3.2 ChatClient的进阶能力:结构化输出
ChatClient最强大的能力之一是可以直接让AI返回Java对象,无需手动解析JSON:
@GetMapping("/movie") public MovieList recommendMovies() { return chatClient.prompt("推荐3部科幻电影") .call() .entity(MovieList.class); // 自动将AI输出映射为Java对象 }
Spring AI会自动处理JSON Schema生成和结果解析,开发者完全不需要关心底层序列化细节。-16
3.3 ChatClient的Fluent API关键点
| 方法 | 作用 |
|---|---|
prompt() | 开始构建请求 |
system(String) | 设置系统提示词(设定AI“人设”) |
user(String) | 设置用户输入 |
call() | 阻塞式调用,等待完整响应 |
stream() | 流式调用,返回Flux<String> |
entity(Class) | 将AI输出自动解析为Java对象 |
四、ChatModel与ChatClient的关系总结
这两者的关系可以这样理解:
ChatModel是“思想”层——定义“怎么发请求、怎么收响应”的统一标准
ChatClient是“实现”层——封装Fluent API,让开发者写得更爽、更符合业务习惯
一句话概括:ChatModel负责统一底层协议,ChatClient负责提升上层开发体验。
五、完整代码示例:从零搭建Spring AI智能助手
5.1 添加Maven依赖
<!-- 以OpenAI为例,接入GPT/Gemini/Claude等 --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency>
5.2 配置文件(application.yml)
spring: ai: openai: api-key: ${OPENAI_API_KEY} base-url: https://api.openai.com chat: options: model: gpt-4 temperature: 0.7 max-tokens: 4096
5.3 实现类似AI助手的Controller
@RestController @RequestMapping("/ai-assistant") public class AiAssistantController { private final ChatClient chatClient; public AiAssistantController(ChatClient.Builder builder) { this.chatClient = builder.build(); } // 1. 基础对话 @GetMapping("/chat") public String chat(@RequestParam String message) { return chatClient.prompt(message).call().content(); } // 2. 带系统角色的智能助手 @GetMapping("/assistant") public String assistant(@RequestParam String question) { return chatClient.prompt() .system("你是一个专业的编程助手,擅长Java和Spring生态。请用简洁、准确的语言回答问题。") .user(question) .call() .content(); } // 3. 流式输出(打字机效果) @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> streamChat(@RequestParam String message) { return chatClient.prompt(message).stream().content(); } }
执行流程解析:
用户通过HTTP请求发送消息
Spring AI将请求参数封装成Prompt对象
ChatClient调用底层ChatModel发送请求到AI服务商
获取响应后返回给前端(普通模式)或逐字推送(流式模式)
六、底层原理与技术支撑
Spring AI的分层架构可以拆解为五层:-9
| 层级 | 作用 |
|---|---|
| 通用模型层 | 定义Model、ModelRequest、ModelResponse等最底层接口 |
| 领域模型层 | 针对聊天、向量、图片等场景增加领域语义对象 |
| Fluent客户端层 | 提供ChatClient链式API,提升开发体验 |
| 增强层 | 提供Tool Calling、Advisor、Memory、RAG、VectorStore等扩展能力 |
| 厂商适配层 | OpenAI、Ollama、Google Gemini等具体实现 |
这种设计让Spring AI能够灵活扩展新厂商、新能力,同时保持上层业务代码的稳定性。其底层依赖Spring生态的自动配置机制和依赖注入,开发者只需添加Starter依赖并配置参数,框架就能自动完成所有组件的装配。
七、高频面试题与参考答案
Q1:什么是Spring AI?它解决了什么问题?
参考答案:Spring AI是Spring官方推出的AI应用开发框架,可以理解为“Spring Boot版的LangChain”。它解决的核心问题是统一不同大模型的调用方式——以前调OpenAI要用OpenAI的SDK,调通义千问要用阿里的SDK,代码写法完全不一样。Spring AI抽象了一层ChatModel接口,不管底层是哪个模型,上层代码都一样。换模型只需要改配置,代码不用动。此外它还提供了RAG、Function Calling、向量数据库等AI应用常用能力,与Spring生态无缝集成。-27
Q2:Spring AI的核心设计目标是什么?
参考答案:四个核心目标——①模型无关性:一套代码,切换模型不用改业务;②Spring生态原生集成:自动配置、依赖注入、Starter机制;③简化AI工程化:封装Prompt、Embedding、VectorStore、RAG;④低学习成本:Java开发者不用懂AI底层也能快速开发。-22
Q3:ChatModel和ChatClient有什么区别?
参考答案:ChatModel是Spring AI的核心接口,代表与AI大模型对话的能力,负责定义统一的请求/响应协议;ChatClient是在ChatModel之上封装的Fluent客户端,提供链式API(prompt().system().user().call())来构建Prompt和执行调用。二者关系是:ChatModel负责“底层统一”,ChatClient负责“上层好用”。
Q4:Spring AI如何实现流式输出?
参考答案:Spring AI通过StreamingChatModel接口返回Flux<ChatResponse>,后端使用text/event-stream格式向前端逐字推送数据,实现打字机效果。用户在300ms内就能看到第一个字,体验远优于等待完整响应。-22
Q5:Spring AI和LangChain的区别是什么?
参考答案:Spring AI是Java第一、Spring生态原生的轻量级框架,工程化强,学习成本低;LangChain以Python为主,功能丰富但复杂,Java支持较弱。Spring AI更适用于企业级Java应用的AI能力集成,而LangChain更适合Python生态的AI原型探索。-22
八、结尾总结
回顾全文,我们一步步认识了Spring AI这个Java生态中AI应用开发的官方框架:
痛点驱动:传统Java集成大模型存在耦合高、无统一抽象的问题
核心概念:ChatModel是统一接口,ChatClient是Fluent客户端
关系要点:ChatModel负责底层统一,ChatClient负责上层体验
示例落地:几行代码即可实现类似AI助手的完整能力
底层支撑:分层架构+自动配置机制,保证可扩展性
重点掌握:ChatModel的自动配置原理、ChatClient的Fluent API使用、结构化输出能力、流式响应实现。这些既是开发必备技能,也是面试高频考点。
下一篇我们将深入讲解Spring AI中的Function Calling机制——如何让大模型自主调用你的Java方法,打造真正的智能体(Agent)。欢迎持续关注!

扫一扫微信交流