
Spring全家桶:Spring AI系统性知识体系全解
Spring AI是Spring生态在生成式AI时代的核心扩展,延续了Spring一贯的"抽象与解耦"设计哲学,为Java开发者提供了一套统一、可移植、生产就绪的AI应用开发框架。它解决了AI集成的核心挑战:将企业数据与API和AI模型无缝连接,同时避免厂商锁定风险。
一、Spring AI核心原理与架构设计
1.1 核心设计哲学
- 抽象即自由:通过统一接口屏蔽底层模型和基础设施差异,实现"一次编码,多模型运行"
- Spring原生集成:深度融合Spring Boot自动配置、依赖注入、AOP等核心特性
- 生产就绪:内置可观测性、重试机制、安全控制等企业级能力
- 模块化设计:按需引入依赖,避免不必要的复杂度
1.2 分层架构体系
Spring AI采用三层抽象架构,确保各层解耦与扩展性:
| 架构层级 | 核心职责 | 关键组件/接口 |
|---|---|---|
| 应用层 | 提供开发者直接使用的API和注解 | ChatClient、@ChatClient注解、EmbeddingClient |
| 抽象层 | 定义统一的模型接口和调用协议 | ChatModel、EmbeddingModel、VectorStore、ToolCallback |
| 实现层 | 对接具体的AI提供商和基础设施 | OpenAI、Anthropic、Ollama、PGVector、Milvus等实现 |
1.3 核心模块与依赖关系
spring-ai-bom # 统一版本管理
├── spring-ai-model # 核心模型抽象接口(所有业务代码仅依赖此层)
├── spring-ai-client-chat # ChatClient流式API与Advisor SPI机制
├── spring-ai-rag # RAG完整实现:文档处理、检索、增强
├── spring-ai-vector-store # 向量数据库统一接口与SQL-like过滤DSL
├── spring-ai-agent-utils # AI Agent开发工具集
├── spring-ai-retry # 智能重试与限流机制
└── spring-ai-commons # 通用工具类与数据结构
1.4 关键设计模式
- 策略模式:不同模型提供商实现相同的
ChatModel接口,运行时可动态切换 - 模板方法模式:
ChatClient内部统一执行Advisor链、调用模型、解析响应 - 装饰器模式:通过Advisor机制在不修改核心代码的情况下增强对话能力(如RAG、记忆)
- 适配器模式:将不同厂商的API响应统一转换为Spring AI标准格式
1.5 核心调用流程
一次完整的AI对话调用流程:
- 应用层通过
ChatClient发起请求 - Advisor链依次处理请求(如注入RAG上下文、管理对话记忆)
ChatModel接口调用具体的模型实现- 模型响应经过Advisor链后处理
- 返回最终结果给应用层
二、大模型集成:统一API与多厂商支持
2.1 支持的模型类型与提供商
Spring AI 2.0支持所有主流AI模型提供商,覆盖多种模型类型:
| 模型类型 | 支持的提供商 | 代表模型 |
|---|---|---|
| 聊天补全 | OpenAI、Anthropic、Google、Microsoft、Amazon、Ollama、智谱AI、DeepSeek | GPT-5-mini、Claude 3.5 Sonnet、Gemini 1.5 Pro、通义千问 |
| 嵌入模型 | 上述所有提供商 | text-embedding-3-small、bge-m3、gte-large |
| 图像生成 | OpenAI、Stability AI | DALL-E 3、SDXL |
| 音频处理 | OpenAI、Google | Whisper、Text-to-Speech |
| 内容审核 | OpenAI、Google | Moderation API |
2.2 统一配置方式
Spring AI采用一致的配置模式,所有模型提供商都遵循相同的配置规范:
spring:
ai:
# OpenAI配置
openai:
api-key: ${
OPENAI_API_KEY}
base-url: https://api.openai.com/v1 # 支持反向代理
chat:
enabled: true
options:
model: gpt-5-mini
temperature: 0.7
max-tokens: 4096
# Ollama本地模型配置
ollama:
base-url: http://localhost:11434
chat:
options:
model: qwen2:7b
temperature: 0.5
2.3 统一调用API
通过ChatClient接口实现模型无关的调用:
@Service
public class ChatService {
private final ChatClient chatClient;
// 注入Spring自动配置的ChatModel
public ChatService(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
// 同步调用
public String chat(String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
// 流式调用
public Flux<String> streamChat(String message) {
return chatClient.prompt()
.user(message)
.stream()
.content();
}
}
2.4 模型切换与A/B测试
由于业务代码仅依赖抽象接口,切换模型提供商只需修改配置,无需改动业务代码:
# 从OpenAI切换到Anthropic只需修改配置
spring:
ai:
openai:
enabled: false
anthropic:
api-key: ${
ANTHROPIC_API_KEY}
chat:
options:
model: claude-3-5-sonnet-20241022
三、Prompt工程:结构化与工程化管理
3.1 Prompt核心概念
Spring AI将Prompt抽象为包含多条消息的对象,每条消息有特定的角色:
- System:定义AI的角色、任务、约束和输出格式
- User:用户的输入内容
- Assistant:AI的历史回复
- Tool:工具调用的返回结果
3.2 PromptTemplate模板引擎
Spring AI提供了强大的模板引擎,基于StringTemplate实现,支持变量替换和模板复用:
// 内联模板
PromptTemplate template = new PromptTemplate("请介绍{topic}的基本概念和主要特性");
Prompt prompt = template.create(Map.of("topic", "Spring AI"));
// 从文件加载模板(推荐生产环境使用)
PromptTemplate codeReviewTemplate = new PromptTemplate(
new ClassPathResource("prompts/system-code-review.st")
);
3.3 系统提示词最佳实践
一个高质量的系统提示词应包含以下要素:
- 角色定义:明确AI的身份和专业领域
- 任务描述:说明AI需要完成的具体任务
- 约束条件:规定回答的范围、风格和限制
- 输出格式:指定回答的结构和格式
@Service
public class JavaTechService {
private final ChatClient chatClient;
public JavaTechService(ChatClient.Builder builder) {
this.chatClient = builder
.defaultSystem("""
你是一个专业的Java技术助手,拥有10年以上的开发经验。
职责:
- 回答Java、Spring Boot、Spring AI相关的技术问题
- 帮助用户debug代码并提供优化建议
- 分享行业最佳实践和设计模式
规则:
- 代码示例使用Java 21+语法
- 回答简洁明了,重点突出
- 不确定的内容要明确说明,不要编造
- 非技术问题礼貌拒绝
输出格式:
- 使用Markdown格式
- 代码用```java代码块包裹
""")
.build();
}
}
3.4 结构化输出
Spring AI支持将AI输出直接映射为Java POJO,无需手动解析JSON:
// 定义输出结构
public record BookRecommendation(
String title,
String author,
String summary,
List<String> genres,
int publicationYear
) {
}
// 调用并自动转换
BookRecommendation recommendation = chatClient.prompt()
.user("推荐一本关于人工智能的经典书籍")
.call()
.entity(BookRecommendation.class);
四、RAG实现:检索增强生成
4.1 RAG核心原理
RAG(检索增强生成)通过"先检索后生成"的机制,让AI能够访问外部知识库,解决大模型知识截止、幻觉和私有数据访问问题。
Spring AI RAG的四大核心步骤:
- 文档处理:将原始文档转换为可检索的文本片段
- 向量嵌入:将文本片段转换为向量表示并存储到向量数据库
- 相似检索:根据用户查询检索最相关的文档片段
- 生成增强:将检索结果作为上下文注入Prompt,让AI基于上下文生成回答
4.2 文档处理ETL框架
Spring AI提供了完整的文档处理能力,支持多种文档格式:
// 读取PDF文档
PdfDocumentReader reader = new PdfDocumentReader(
new ClassPathResource("documents/spring-ai-guide.pdf")
);
// 文档分块
TextSplitter splitter = TokenTextSplitter.builder()
.chunkSize(512)
.chunkOverlap(50)
.build();
// 转换为Document对象
List<Document> documents = reader.get().stream()
.flatMap(doc -> splitter.split(doc).stream())
.toList();
// 添加元数据
documents.forEach(doc -> doc.getMetadata().put("source", "spring-ai-guide.pdf"));
4.3 向量数据库集成
Spring AI支持所有主流向量数据库,提供统一的VectorStore接口:
// 注入Spring自动配置的VectorStore
@Autowired
private VectorStore vectorStore;
// 将文档存入向量数据库
vectorStore.add(documents);
// 相似检索
List<Document> similarDocs = vectorStore.similaritySearch(
SearchRequest.query("Spring AI如何集成RAG")
.topK(5)
.similarityThreshold(0.73)
.filterExpression(FilterExpressionBuilder.eq("source", "spring-ai-guide.pdf"))
);
4.4 高级检索策略
- 混合检索:结合向量语义检索与关键词精确匹配
- 重排序:使用专门的重排序模型对检索结果进行精排
- 动态过滤:根据业务上下文动态添加过滤条件
// 混合检索器
HybridRetriever hybridRetriever = HybridRetriever.builder()
.vectorStore(vectorStore)
.keywordIndex(new ElasticsearchKeywordIndex())
.vectorWeight(0.7)
.keywordWeight(0.3)
.build();
// 带重排序的检索器
RerankingRetriever rerankingRetriever = RerankingRetriever.builder()
.vectorStore(vectorStore)
.rerankModel(rerankModel)
.topKForRerank(20)
.topK(5)
.build();
4.5 QuestionAnswerAdvisor:一行代码启用RAG
Spring AI 2.0引入了QuestionAnswerAdvisor,通过Advisor机制将RAG能力无缝注入对话流程:
@Service
public class RagChatService {
private final ChatClient chatClient;
public RagChatService(ChatClient.Builder builder, VectorStore vectorStore) {
this.chatClient = builder
.defaultAdvisors(
QuestionAnswerAdvisor.builder(vectorStore)
.searchRequest(SearchRequest.builder().topK(5).build())
.build()
)
.build();
}
public String chatWithRag(String question) {
// 自动执行检索→注入上下文→生成回答的完整流程
return chatClient.prompt()
.user(question)
.call()
.content();
}
}
五、AI Agent开发:思考与行动的智能体
5.1 Agent核心概念
AI Agent是能够自主感知环境、制定计划、执行行动并从结果中学习的智能系统。Spring AI基于ReAct(Reasoning + Acting)模式提供了完整的Agent开发支持。
5.2 工具调用(Function Calling)
工具调用是Agent与外部世界交互的核心能力。Spring AI通过@Tool注解简化工具定义:
@Component
public class WeatherTools {
// 定义一个获取天气的工具
@Tool("获取指定城市的当前天气信息")
public String getCurrentWeather(@Parameter(description = "城市名称,如北京、上海") String city) {
// 调用实际的天气API
return String.format("%s当前天气:晴,温度25℃,湿度60%%", city);
}
}
5.3 对话记忆管理
Spring AI提供了多层次的记忆管理能力:
- 短期记忆:存储当前对话的历史消息
- 长期记忆:持久化存储跨会话的重要信息
- 自动记忆整理:定期压缩和整理记忆,避免上下文溢出
// 配置带记忆的ChatClient
@Service
public class AgentService {
private final ChatClient chatClient;
public AgentService(ChatClient.Builder builder, WeatherTools weatherTools) {
this.chatClient = builder
.defaultTools(weatherTools)
.defaultAdvisors(
// 会话记忆
MessageChatMemoryAdvisor.builder()
.chatMemory(new InMemoryChatMemory())
.build(),
// 长期自动记忆
AutoMemoryToolsAdvisor.builder()
.memoriesRootDirectory(Paths.get("agent-memories"))
.build()
)
.build();
}
}
5.4 ReAct Agent实现
Spring AI提供了开箱即用的ReAct Agent实现,支持自动推理和工具调用:
@Bean
public ReActAgent weatherAgent(ChatModel chatModel, WeatherTools weatherTools) {
return ReActAgent.builder()
.chatModel(chatModel)
.tools(weatherTools)
.systemPrompt("""
你是一个智能天气助手。
当用户询问天气时,使用getCurrentWeather工具获取准确信息。
如果需要多个城市的天气,可以多次调用工具。
回答要简洁明了,包含温度、天气状况和出行建议。
""")
.maxIterations(5)
.build();
}
// 使用Agent
String response = weatherAgent.call("北京今天的天气怎么样?适合出门吗?");
5.5 高级Agent能力
- 任务规划:将复杂任务分解为多个子任务
- 多Agent协作:多个Agent分工合作完成复杂任务
- 人类介入:在不确定时请求人类确认
- 可观测性:完整记录Agent的思考过程和工具调用
六、生产就绪与最佳实践
6.1 可观测性
Spring AI集成了Micrometer,提供完整的指标、日志和追踪支持:
- 模型调用次数、延迟、成功率
- 工具调用指标
- RAG检索性能指标
- 分布式追踪
6.2 安全与合规
- API密钥安全管理
- 内容审核
- 数据脱敏
- 访问控制
6.3 性能优化
- 提示词缓存
- 向量检索优化
- 批量处理
- 异步调用
6.4 错误处理与重试
- 智能重试机制
- 降级策略
- 超时控制
- 限流保护
总结
Spring AI为Java开发者提供了一套完整、统一、生产就绪的AI应用开发框架。它通过分层抽象和统一API,屏蔽了底层AI模型和基础设施的差异,让开发者能够专注于业务逻辑而非技术细节。
从简单的聊天机器人到复杂的RAG系统和AI Agent,Spring AI都提供了开箱即用的组件和最佳实践。随着Spring AI 2.0的发布,其在Agent开发、多模型支持和企业级特性方面得到了进一步增强,已经成为Java生态中AI应用开发的事实标准。
Spring AI面试高频问答卡片(背诵版)
一、核心原理与架构设计
Q1:Spring AI的核心设计哲学是什么?
标准答案:
- 抽象即自由:通过统一接口屏蔽底层模型和基础设施差异,实现"一次编码,多模型运行"
- Spring原生集成:深度融合Spring Boot自动配置、依赖注入、AOP等核心特性
- 生产就绪:内置可观测性、重试机制、安全控制等企业级能力
- 模块化设计:按需引入依赖,避免不必要的复杂度
Q2:Spring AI的三层架构体系及各层核心组件是什么?
标准答案:
| 架构层级 | 核心职责 | 关键组件/接口 |
|---|---|---|
| 应用层 | 提供开发者直接使用的API和注解 | ChatClient、@ChatClient注解、EmbeddingClient |
| 抽象层 | 定义统一的模型接口和调用协议 | ChatModel、EmbeddingModel、VectorStore、ToolCallback |
| 实现层 | 对接具体的AI提供商和基础设施 | OpenAI、Anthropic、Ollama、PGVector等实现 |
Q3:Spring AI的核心模块及各自作用是什么?
标准答案:
spring-ai-bom:统一版本管理spring-ai-model:核心模型抽象接口(业务代码仅依赖此层)spring-ai-client-chat:ChatClient流式API与Advisor SPI机制spring-ai-rag:RAG完整实现(文档处理、检索、增强)spring-ai-vector-store:向量数据库统一接口与SQL-like过滤DSLspring-ai-agent-utils:AI Agent开发工具集spring-ai-retry:智能重试与限流机制spring-ai-commons:通用工具类与数据结构
Q4:Spring AI中使用了哪些关键设计模式,分别解决什么问题?
标准答案:
- 策略模式:不同模型提供商实现相同的
ChatModel接口,实现运行时动态切换模型 - 模板方法模式:
ChatClient内部统一执行Advisor链、调用模型、解析响应的流程 - 装饰器模式:通过Advisor机制在不修改核心代码的情况下增强对话能力(如RAG、记忆)
- 适配器模式:将不同厂商的API响应统一转换为Spring AI标准格式
Q5:描述Spring AI一次完整的AI对话调用流程
标准答案:
- 应用层通过
ChatClient发起请求 - Advisor链依次预处理请求(如注入RAG上下文、管理对话记忆)
ChatModel接口调用具体的模型实现- 模型响应经过Advisor链后处理
- 返回最终结果给应用层
二、大模型集成:统一API与多厂商支持
Q6:Spring AI 2.0支持哪些主要的模型类型和代表提供商?
标准答案:
- 聊天补全:OpenAI、Anthropic、Ollama、智谱AI、DeepSeek等
- 嵌入模型:上述所有提供商
- 图像生成:OpenAI、Stability AI
- 音频处理:OpenAI、Google
- 内容审核:OpenAI、Google
Q7:Spring AI统一配置和调用API的核心优势是什么?
标准答案:
- 厂商无关性:业务代码仅依赖抽象接口,与具体模型提供商解耦
- 一致的开发体验:所有模型遵循相同的配置规范和调用方式
- 快速模型切换:仅需修改配置文件,无需改动业务代码
- 简化开发:屏蔽不同厂商API的差异,降低学习和维护成本
Q8:如何在Spring AI中实现模型切换,为什么能做到零代码改动?
标准答案:
- 实现方式:只需修改application.yml配置文件,禁用原模型并启用目标模型,配置对应的API密钥和模型参数
- 零代码原因:Spring AI采用依赖注入和面向接口编程,业务代码仅依赖
ChatModel等抽象接口,具体实现由Spring容器根据配置动态注入
三、Prompt工程:结构化与工程化管理
Q9:Spring AI将Prompt抽象为哪几种消息角色,各自的作用是什么?
标准答案:
- System:定义AI的角色、任务、约束和输出格式
- User:用户的输入内容
- Assistant:AI的历史回复
- Tool:工具调用的返回结果
Q10:Spring AI的PromptTemplate有什么作用,支持哪些使用方式?
标准答案:
- 作用:实现Prompt的模板化、变量替换和复用,提升Prompt工程的可维护性
- 使用方式:
- 内联模板:直接在代码中定义模板字符串并进行变量替换
- 文件模板:从ClassPath资源文件加载模板(推荐生产环境使用)
Q11:一个高质量的系统提示词应包含哪些核心要素?
标准答案:
- 角色定义:明确AI的身份和专业领域
- 任务描述:说明AI需要完成的具体任务
- 约束条件:规定回答的范围、风格和限制
- 输出格式:指定回答的结构和格式(如Markdown、JSON)
Q12:Spring AI如何实现AI输出的结构化映射?
标准答案:
Spring AI支持将AI输出直接映射为Java POJO,无需手动解析JSON。只需定义对应的Java Record或类,然后调用ChatClient的entity(Class<T> type)方法即可自动完成类型转换。
四、RAG实现:检索增强生成
Q13:什么是RAG,它解决了大模型的哪些核心问题?
标准答案:
- 定义:RAG(检索增强生成)通过"先检索后生成"的机制,让AI能够访问外部知识库
- 解决的问题:
- 大模型知识截止问题
- 大模型幻觉问题
- 私有数据访问问题
Q14:Spring AI中RAG的四大核心步骤是什么?
标准答案:
- 文档处理:将原始文档转换为可检索的文本片段
- 向量嵌入:将文本片段转换为向量表示并存储到向量数据库
- 相似检索:根据用户查询检索最相关的文档片段
- 生成增强:将检索结果作为上下文注入Prompt,让AI基于上下文生成回答
Q15:Spring AI的文档处理ETL流程包括哪些环节?
标准答案:
- 文档读取:使用
DocumentReader读取多种格式的文档(如PDF、TXT) - 文本分块:使用
TextSplitter将长文档分割为合适大小的文本块(如TokenTextSplitter) - 元数据添加:为每个文本块添加来源、作者等元数据
- 向量转换:使用
EmbeddingModel将文本块转换为向量 - 向量存储:将向量和元数据存入
VectorStore
Q16:Spring AI 2.0的QuestionAnswerAdvisor有什么作用?
标准答案:QuestionAnswerAdvisor通过Advisor机制将RAG能力无缝注入对话流程,实现"一行代码启用RAG"。它会自动执行检索→注入上下文→生成回答的完整流程,开发者无需手动处理检索和上下文拼接逻辑。
五、AI Agent开发:思考与行动的智能体
Q17:什么是AI Agent,Spring AI基于什么模式实现Agent?
标准答案:
- 定义:AI Agent是能够自主感知环境、制定计划、执行行动并从结果中学习的智能系统
- 实现模式:Spring AI基于ReAct(Reasoning + Acting)模式实现Agent,即先推理再行动,根据行动结果继续推理,直到完成任务
Q18:Spring AI中如何定义和使用工具(Function Calling)?
标准答案:
- 定义工具:创建一个Spring Bean,在方法上添加
@Tool注解描述工具功能,在参数上添加@Parameter注解描述参数 - 使用工具:将工具Bean注册到
ChatClient或ReActAgent中,AI会根据任务需求自动调用工具并处理返回结果
Q19:Spring AI提供了哪些层次的对话记忆管理能力?
标准答案:
- 短期记忆:存储当前对话的历史消息,用于上下文理解
- 长期记忆:持久化存储跨会话的重要信息
- 自动记忆整理:定期压缩和整理记忆,避免上下文溢出
Q20:Spring AI的ReAct Agent核心配置有哪些?
标准答案:
chatModel:用于推理的大模型tools:Agent可以调用的工具列表systemPrompt:定义Agent的角色和行为规范maxIterations:最大推理迭代次数,防止无限循环
六、生产就绪与最佳实践
Q21:Spring AI在可观测性方面提供了哪些支持?
标准答案:
Spring AI集成了Micrometer,提供完整的指标、日志和追踪支持:
- 模型调用次数、延迟、成功率指标
- 工具调用指标
- RAG检索性能指标
- 分布式追踪能力
Q22:Spring AI应用的常见性能优化手段有哪些?
标准答案:
- 提示词缓存:缓存相同或相似查询的结果
- 向量检索优化:优化向量索引、调整topK和相似度阈值
- 批量处理:批量处理文档嵌入和向量存储
- 异步调用:使用流式调用和异步API提升并发性能
Q23:Spring AI相比其他AI开发框架的核心优势是什么?
标准答案:
- Spring生态原生集成:无缝融合Spring Boot、Spring Cloud等企业级技术栈
- 统一抽象与可移植性:避免厂商锁定,支持多模型和多向量数据库
- 生产就绪:内置企业级的可观测性、安全、重试和限流能力
- Java开发者友好:符合Java开发习惯,降低学习和迁移成本