开篇引入
在Java开发领域,Spring AI(Spring官方为Java生态打造的AI应用开发框架)的出现,彻底改变了Java开发者接入大语言模型的方式——不再需要学习Python、不再需要手动封装各家API的HTTP请求。很多学习者依然面临共同的困境:只会调用、不懂原理、概念容易混淆、面试一问就卡壳。本文将手把手带你搭建一个名为“酸奶AI助手”的Spring Boot AI应用,从集成DeepSeek大模型到理解提示工程(Prompt Engineering)与RAG(Retrieval-Augmented Generation,检索增强生成)两大核心概念,让你真正看懂逻辑、记住考点,建立起从入门到进阶的完整知识链路。

一、痛点切入:为什么需要Spring AI?
传统实现方式:手写HTTP调用大模型

在没有Spring AI之前,Java开发者要调用大模型API,通常是这样写的:
// 传统方式:手写HTTP请求 HttpClient client = HttpClient.newHttpClient(); String jsonBody = """ { "model": "deepseek-chat", "messages": [{"role": "user", "content": "你好"}] } """; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://api.deepseek.com/v1/chat/completions")) .header("Authorization", "Bearer YOUR_API_KEY") .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(jsonBody)) .build(); // 然后还要手动解析JSON,处理异常...
传统方式的痛点
耦合度高:API的URL、请求格式、认证方式硬编码在代码中,换一个模型厂商就要全部重写。
扩展性差:想支持流式输出、函数调用(Function Calling)、结构化输出等高级功能,需要自行封装大量代码。
维护困难:各家API的接口规范五花八门——OpenAI的格式、Claude的参数名、国内模型的签名机制各不相同,代码中充斥着厂商特定的逻辑-6。
测试不便:无法像Spring Bean一样方便地进行Mock和单元测试。
Spring AI的设计初衷
Spring AI正是为了解决上述痛点而生。它由Spring官方团队主导开发,旨在为Java/Spring生态系统提供一个统一、模块化、企业级友好的AI应用开发框架,让开发者能够像使用RestTemplate一样,以惯用的Spring风格集成大模型能力-3。
二、核心概念讲解:Spring AI
定义
Spring AI(Spring官方AI应用开发框架)是Spring生态中用于集成AI能力的统一抽象层。它屏蔽了不同AI模型厂商的API差异,提供了一套标准化的接口(如ChatClient、EmbeddingClient、VectorStore),让Java开发者用熟悉的依赖注入和自动配置方式调用大模型。
拆解关键词
统一抽象层:无论底层是OpenAI的GPT-4、Anthropic的Claude,还是国内的DeepSeek、通义千问,调用代码完全一样,切换模型只需修改一个配置参数-3。
Spring风格:遵循“约定优于配置”的设计哲学,通过
@Bean注入、application.yml配置,与现有Spring Boot项目无缝集成-6。企业级能力:支持流式响应、函数调用、RAG、结构化输出等现代AI能力,同时具备Micrometer监控、重试、熔断等生产级特性-3。
生活化类比
可以把Spring AI想象成一个通用的AI电源转换头:你去不同国家旅行(对接不同大模型),不用重新学当地插座标准(不用学每家API),只需带一个转换头(Spring AI),所有设备都能正常使用。
三、关联概念讲解:提示工程(Prompt Engineering)
定义
提示工程(Prompt Engineering)是设计、优化和迭代输入提示词(Prompt),以引导生成式AI模型产生准确、相关、高质量输出的策略性过程-32。它不是直接修改模型参数,而是通过精心设计的输入来控制模型的输出行为。
三种核心提示类型
在实际应用中,提示工程主要围绕以下三种提示类型展开-31:
| 类型 | 作用 | 示例 |
|---|---|---|
| 用户提示词(User Prompt) | 用户直接向AI提出的问题或指令 | “请解释一下什么是RAG” |
| 系统提示词(System Prompt) | 设定AI的角色定位和行为规则(用户不可见) | “你是一位资深的Java架构师,回答需包含代码示例” |
| 助手提示词(Assistant Prompt) | AI的响应内容,在多轮对话中作为历史上下文 | 系统预设或模型生成的回答 |
生活化类比
提示工程就像给员工下指令的艺术:你说“整理文件”,他可能随便堆在一起;你说“按日期排序,放到红色文件夹,每份文件标注页码”,他就能精准完成任务。提示词越清晰、越有结构,AI的输出就越符合预期。
四、概念关系与区别总结
核心关系一句话概括
Spring AI是“基础设施框架”,负责“怎么连”大模型;提示工程是“应用方法论”,负责“怎么问”才能得到好答案。
对比表格
| 维度 | Spring AI | 提示工程(Prompt Engineering) |
|---|---|---|
| 本质 | 技术框架 / 开发工具 | 方法论 / 交互策略 |
| 解决的问题 | 统一调用接口、简化集成复杂度 | 控制输出质量、引导模型行为 |
| 操作对象 | 模型API、配置参数、依赖注入 | 提示词文本、系统角色设定 |
| 适用人群 | Java/Spring开发者 | AI应用设计者、产品经理 |
| 是否改动模型 | 否(仅调用) | 否(仅优化输入) |
| 能否独立使用 | 可以(不写提示工程也能调用) | 不可以(必须有模型接口) |
两者的关系类似于:Spring AI提供了“打电话的工具”,提示工程决定了“通话内容怎么说”。二者相辅相成,缺一不可。
五、代码示例:从0到1搭建酸奶AI助手
准备工作
JDK 17+(Spring Boot 3要求JDK 17及以上)-11
Maven或Gradle
DeepSeek API Key(免费注册即可获取,且无需科学上网)-11
💡 为什么选DeepSeek? DeepSeek的API完全兼容OpenAI接口规范,我们可以直接使用spring-ai-starter-model-openai依赖,只需把base-url指向DeepSeek即可,真正做到“一行配置换模型”-11。
第1步:添加依赖(pom.xml)
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.0</version> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>1.0.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- Spring Boot Web Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring AI OpenAI Starter(兼容DeepSeek) --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-openai</artifactId> </dependency> </dependencies>
第2步:配置文件(application.yml)
spring: ai: openai: api-key: ${DEEPSEEK_API_KEY} 使用环境变量,不要硬编码! base-url: https://api.deepseek.com chat: options: model: deepseek-chat temperature: 0.7
⚠️ 安全提醒:生产环境绝对不要将API Key直接写在配置文件中,请使用环境变量或密钥管理服务-11。
第3步:编写酸奶AI助手核心服务
@Service public class YogurtAIAssistant { private final ChatClient chatClient; // 依赖注入:Spring AI 自动配置好 ChatClient.Builder public YogurtAIAssistant(ChatClient.Builder builder) { // 配置系统提示词(提示工程的典型应用) this.chatClient = builder .defaultSystem("你是一位专业的酸奶营养顾问。" + "你的回答要亲切、易懂,帮助用户了解酸奶的营养价值。" + "回答时尽量提供科学依据,避免夸大宣传。") .build(); } // 简单对话:一行代码完成AI调用 public String chat(String userMessage) { return chatClient.prompt(userMessage).call().content(); } // 带系统提示词的对话 public String chatWithSystem(String systemPrompt, String userMessage) { return chatClient.prompt() .system(systemPrompt) .user(userMessage) .call() .content(); } // 流式输出:实现打字机效果 public Flux<String> streamChat(String userMessage) { return chatClient.prompt(userMessage) .stream() .content(); } }
第4步:编写REST Controller
@RestController @RequestMapping("/api/yogurt") public class YogurtAIController { private final YogurtAIAssistant assistant; public YogurtAIController(YogurtAIAssistant assistant) { this.assistant = assistant; } @GetMapping("/chat") public Map<String, String> chat(@RequestParam String message) { String response = assistant.chat(message); return Map.of("response", response); } // 流式输出:SSE @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> stream(@RequestParam String message) { return assistant.streamChat(message); } }
关键代码解读
ChatClient.Builder的自动注入:Spring AI通过自动配置,将ChatClient.Builder注册为Spring Bean,你只需要在构造函数中声明即可注入-2。.defaultSystem():这就是提示工程的应用——设置全局的系统提示词,让AI在整个会话中保持“酸奶营养顾问”的角色定位。.prompt().call().content():一行代码完成完整的AI调用链路,Spring AI内部处理了HTTP请求、JSON解析、错误重试等所有细节。.stream():返回Flux<String>,配合Spring WebFlux自动转换为SSE(Server-Sent Events)流,实现逐字输出的“打字机”效果-2。
运行效果
启动Spring Boot应用后,访问http://localhost:8080/api/yogurt/chat?message=酸奶有什么好处,你会得到一段来自DeepSeek大模型的专业回答,而且AI的回答会始终保持在“酸奶营养顾问”的角色设定内。
六、底层原理与技术支撑
Spring AI的底层依赖
Spring AI之所以能如此简洁地调用大模型,底层主要依赖以下技术:
动态代理与反射:Spring AI通过动态代理将
ChatClient接口的方法调用,动态转换为特定厂商的HTTP请求。你写的chatClient.prompt("你好").call(),在运行时被代理成了对应模型(如DeepSeek)的API调用。Spring Boot自动配置:利用
@ConditionalOnClass、@ConfigurationProperties等机制,根据application.yml中的配置自动创建相应的ChatModelBean。核心逻辑在spring-ai-autoconfigure模块中实现。HTTP客户端抽象:Spring AI内部封装了WebClient或RestClient,统一处理HTTP连接池、超时、重试、熔断等企业级能力。
JSON Schema自动生成:在结构化输出功能中,Spring AI会根据你的Java POJO类,自动生成JSON Schema供大模型使用,然后自动将返回的JSON反序列化为Java对象-2。
大模型调用的本质
无论你用Spring AI还是手写HTTP,大模型调用的本质都是向云端API发送HTTP请求,模型在服务器端完成推理后返回结果。Spring AI的价值在于把这个过程“Spring化”——让AI调用变得像调用本地方法一样简单,同时提供可观测、可测试、可扩展的企业级能力。
七、高频面试题与参考答案
Q1:Spring AI是什么?它解决了什么问题?
参考答案:
Spring AI是Spring官方推出的AI应用开发框架,它为Java开发者提供了统一的API抽象层来集成大语言模型。主要解决了三个问题:一是接口不统一——屏蔽了OpenAI、Claude、DeepSeek等不同厂商的API差异;二是开发复杂度高——将复杂的HTTP调用、JSON解析封装成一行chatClient.prompt().call();三是企业级能力缺失——内置了监控、重试、熔断、流式响应等生产级特性-3。
踩分点:官方框架、统一抽象、降低复杂度、企业级能力。
Q2:提示工程(Prompt Engineering)和RAG有什么区别?
参考答案:
提示工程和RAG都是优化AI输出的方法,但角度不同。提示工程是通过优化输入文本(提示词)来引导模型输出,不引入外部数据,属于“问问题的方式”优化。RAG(检索增强生成)则是先从外部知识库检索相关信息,再把这些信息作为上下文注入提示词中,属于“给模型补充知识”的优化-41。简单说:提示工程教AI“怎么答”,RAG给AI“答什么资料”。
踩分点:提示工程=优化输入格式,RAG=检索外部知识后注入上下文,两者可组合使用。
Q3:Spring AI如何实现多模型切换?
参考答案:
Spring AI通过统一的ChatClient接口屏蔽了底层差异,多模型切换只需要修改application.yml中的三个配置:api-key、base-url和model。因为DeepSeek、OpenAI、通义千问等都通过统一的spring-ai-starter-model-openai依赖接入(只要厂商兼容OpenAI规范),修改配置即可无缝切换,业务代码完全不用改动-11。
踩分点:统一抽象层、配置驱动、OpenAI兼容规范、业务代码零改动。
Q4:Spring AI中的流式响应(Streaming)是如何实现的?
参考答案:
Spring AI的流式响应基于Reactor响应式编程实现。调用chatClient.prompt().stream()会返回Flux<String>对象,底层通过SSE(Server-Sent Events)协议将大模型逐字生成的内容推送给客户端。相比等待完整响应,流式响应能在300ms内返回第一个字符,显著提升用户体验-2。Spring WebFlux会自动将Flux转换为HTTP流式响应。
踩分点:Reactor、Flux、SSE协议、首字延迟优化。
Q5:使用Spring AI时,API Key等敏感信息应该如何管理?
参考答案:
生产环境中绝对不要将API Key硬编码在配置文件或代码中。推荐使用环境变量(${DEEPSEEK_API_KEY})或配置中心(如Spring Cloud Config、Apollo),以及专业的密钥管理服务(如AWS Secrets Manager、HashiCorp Vault)。Spring AI支持spring.ai.openai.api-key配置项的占位符解析,可以直接引用环境变量-11。
踩分点:禁止硬编码、环境变量、配置中心、密钥管理服务。
八、结尾总结
核心知识点回顾
Spring AI:Spring官方的AI集成框架,提供统一抽象层,让Java开发者用熟悉的方式调用大模型。
提示工程:通过优化提示词(特别是系统提示词)来控制AI的输出质量和角色定位,是AI应用开发的核心技能。
RAG:检索增强生成,从外部知识库检索信息后注入上下文,解决大模型知识过时和幻觉问题。
三者关系:Spring AI是“工具”,提示工程是“方法”,RAG是“增强手段”。组合使用才能构建生产级AI应用。
重点与易错点
⚠️ 不要硬编码API Key:生产环境务必使用环境变量或密钥管理服务。
⚠️ 提示词不是万能药:对于需要最新知识或私有数据的场景,必须配合RAG使用。
⚠️ 不要忽略流式响应:大模型响应通常需要2-5秒,没有流式输出的体验会很差。
✅ 从Spring AI 1.0开始学习:Spring AI 2.0目前还在里程碑版本(2.0.0-M4),生产环境推荐使用稳定版1.x-2。
进阶预告
下一篇文章我们将深入讲解Spring AI中的RAG实战:如何将企业知识库(PDF、Word、数据库)向量化存储,在用户提问时实时检索相关内容注入提示词,让AI真正“懂”你的业务数据。同时还会讲解@Tool注解实现函数调用(Function Calling),让AI能够调用你的Java方法完成天气查询、订单处理等实际业务操作。
敬请期待!
扫一扫微信交流