Spring AI 实战(11):收官!10 道面试高频题 + 一张脑图带走全系列
本篇是 Spring AI 系列第 11 篇,也是收官篇。前 10 篇我们把"用"(#1–#9)和"原理"(#10)都铺完了。最后这一篇把全系列收成一张可收藏的知识网,再给你10 道面试高频题 + 一份避坑清单——既能当面试弹药,也能当复习地图。如果你正在准备 Java / 后端 / AI 应用岗的面试,这篇建议直接收藏。
这篇怎么用最高效
- 面试前:把第五节「10 道高频题」过一遍,每题能口述 3 句话就算过关。
- 复习时:脑图当目录,哪块模糊回对应篇重读(前文回顾已给你链好)。
- 做项目时:避坑清单贴在显示器边,比查文档快。
一、全系列知识脑图(文字版,建议收藏)
Spring AI 全栈 ├─ 核心抽象 │ ├─ ChatClient 统一门面(prompt/call/stream) │ ├─ ChatModel 模型抽象(OpenAI/DeepSeek/Ollama…) │ └─ 分层思想 业务只依赖接口,换实现不改代码 ├─ 输入增强 │ ├─ PromptTemplate 外部 .st 模板,参数填充 │ ├─ ChatMemory 记忆(InMemory / Alibaba MySQL+Redis) │ └─ Advisor 链 拦截器,order 定顺序(日志→记忆→RAG→模型) ├─ 输出控制 │ ├─ 结构化输出 BeanOutputConverter → Java 对象 │ └─ 多模态输入 UserMessage + Media(看图) ├─ 能力扩展 │ ├─ Tool Calling @Tool 暴露 Java 方法给 AI 调 │ ├─ MCP 标准协议接外部工具/数据源(N×M→N+M) │ └─ 文生图 ImageModel(DALL·E / 万相) ├─ 知识增强(RAG) │ ├─ 文档加载 Reader Text/PDF/Tika │ ├─ 切分 Splitter TokenTextSplitter(粒度定召回) │ ├─ 向量化 Embedding 维度必须与向量库一致 │ ├─ 存储 VectorStore PgVector(默认)/ Redis / Milvus(海量) │ └─ 检索增强 QuestionAnswerAdvisor + SearchRequest └─ 工程化 ├─ 自动装配 starter + @ConditionalOnClass └─ 选型对比 Spring AI vs LangChain4j vs Alibaba这棵树从下往上看:越往下越偏工程化(自动装配、选型),越往上越偏业务价值(RAG、多模态)。记不住细节时,先记住这六层,再往里填。
二、10 道面试高频题(附答题要点)
1. Spring AI 和直接调 OpenAI SDK 比,优势在哪?
答:统一抽象屏蔽厂商差异,换模型只换 starter+配置;内置 PromptTemplate、记忆、RAG、工具调用、Advisor 等工程能力;与 Spring 生态无缝集成(DI、配置中心、监控)。直接调 SDK 则每家 API 碎片化、换模型重写、缺工程化。
2. ChatClient 和 ChatModel 是什么关系?
答:ChatClient是面向开发者的统一门面(fluent API),ChatModel是底层模型抽象接口。ChatClient 内部委托 ChatModel 发请求。业务代码依赖 ChatClient,与具体厂商解耦。
3. 结构化输出怎么实现?为什么模型返回的是 JSON 却能变 Java 对象?
答:用BeanOutputConverter<T>(或其他StructuredOutputConverter),它把目标类的字段结构生成格式说明塞进 Prompt,模型按格式输出 JSON,converter 再反序列化。要点:字段名要对齐、数字别带单位、必要时@JsonProperty。
4. 工具调用(Tool Calling)的原理?
答:用@Tool把 Java 方法描述(名称+参数 schema+说明)交给模型;模型根据用户意图决定是否调用、提取参数;框架执行方法并把结果回传模型;模型整合后给出自然语言回答。description 写不清,模型就不调。面试加分项:一次"带工具的回答"可能触发两次ChatModel.call——第一次拿 tool_calls,第二次拿最终答案。
5. RAG 的完整链路是什么?切分粒度为什么重要?
答:加载文档 →TokenTextSplitter切分 →EmbeddingModel向量化 → 存入VectorStore;问答时把问题向量化,检索 topK 相似块,QuestionAnswerAdvisor拼进 Prompt。切分粒度直接决定召回质量:太大杂糅、太小语义断裂。
6. 向量库怎么选型?
答:先复用已有的(已在用 PG 选 PgVector,已在用 Redis 选 Redis);默认 PgVector(运维最省、百万级够用);知识上千万/专业检索再上 Milvus。第一死穴:向量维度必须和 Embedding 模型一致。
7. MCP 解决了什么问题?和 @Tool 有什么区别?
答:MCP 是标准化的"模型-工具/数据源"协议,把 N 个模型 × M 个工具的连接降到 N+M(统一协议)。@Tool是 Spring AI 内把方法暴露给模型的注解,作用域在单个应用内;MCP 让任意兼容的 server 能力可被任意模型复用,解耦更彻底。
8. Advisor 责任链是什么?顺序错了会怎样?
答:Advisor 是拦截器,在请求发出前和响应回来后各介入一次,getOrder()定顺序(典型:日志→记忆→RAG→模型)。顺序错会导致记忆/RAG 失效(如记忆在 RAG 之后注入,模型看不到历史)。
9. 多模态在 Spring AI 里怎么分?
答:分两半——"看图"靠UserMessage+Media(ChatModel),"画图"靠ImageModel(文生图)。二者独立抽象,模型必须本身支持对应能力。
10. 自动装配是怎么把 ChatClient 造出来的?
答:starter 含AutoConfiguration.imports,@ConditionalOnClass检测 SDK 类存在才装配;读取spring.ai.*配置创建ChatModel和ChatClient默认 bean。换 starter 即换底层实现,业务零改。
三、避坑清单(直接背)
| 坑 | 正确做法 |
|---|---|
| 换 Embedding 模型 | 必须重建向量索引(维度绑定) |
| 记忆 / RAG 顺序 | 记忆 Advisor 必须在 RAG Advisor 之前 |
| 多 starter 并存 | @Autowired ChatClient可能多 bean 冲突,用@Primary |
| 工具不调用 | @Tool的 description 写清,模型才认 |
| 文生图 URL | 返回的是临时 URL,要持久化得自己落库 |
| 纯文本模型硬塞图 | DeepSeek 等不支持多模态,塞Media会失败 |
| 切分粒度 | 远比"用什么向量库"更影响 RAG 效果 |
| 流式调用 | .stream()返回Flux,非 WebFlux 环境要.block()或正确订阅 |
| Advisor 没生效 | 用defaultAdvisors(...)(全局)而非advisor(...)(单次) |
四、Spring AI vs LangChain4j vs Spring AI Alibaba
| 维度 | Spring AI | LangChain4j | Spring AI Alibaba |
|---|---|---|---|
| 定位 | Spring 官方抽象 | Java 版 LangChain | Spring AI 的阿里增强(社区) |
| 生态 | Spring 原生 | 框架中立 | 绑定阿里云(通义/百炼) |
| 记忆/存储 | 标准接口 | 自带实现 | 提供 Alibaba MySQL/Redis Starter |
| 图形化/低码 | 无 | 无 | 有部分增强 |
| 选择建议 | 已在 Spring 体系、要标准抽象 | 想框架中立、快速上手 | 深度用阿里云模型/基础设施 |
三者不互斥:Spring AI 是底座,Alibaba 是在其上补阿里云适配与开箱即用组件。
五、后续学习路径
- 动手:把本系列示例收敛到一个 GitHub 仓库(part01~part11),跑通每个 demo。
- 深入源码:读
ChatClient默认实现与至少一个模型的ChatModel实现,看 Advisor 链怎么驱动。 - 做项目:用 internal-knowledge-base(企业内部知识库)这类真实场景串起 Tool Calling + RAG + 记忆,比单篇练更有体感。
- 关注版本:Spring AI 1.0 GA 后迭代快,盯官方 migration guide,避免 API 漂移。
小结
这是本系列收官篇,把前 10 篇收成一张网:
- 脑图:核心抽象 → 输入增强 → 输出控制 → 能力扩展 → 知识增强(RAG) → 工程化,六块串成全栈。
- 10 道面试题:覆盖 ChatClient/ChatModel 关系、结构化输出、工具调用、RAG 链路、向量库选型、MCP、Advisor 链、多模态、自动装配——基本是 Java AI 岗的高频弹药。
- 避坑清单:维度绑定、Advisor 顺序、多 bean 冲突、description 写清、URL 落库、模型能力矩阵、切分粒度、流式处理、Advisor 注册方式,共 9 条。
- 三者关系:Spring AI 是底座,LangChain4j 框架中立,Alibaba 补阿里云适配,按需选用。
到这里,Spring AI 从"为什么用"到"怎么用"再到"为什么能这么用",整条线就通了。感谢一路看到这里——收藏这张脑图和面试题,面试前翻一遍,比临时抱佛脚管用得多。
如果这篇对你有帮助,点个关注 👀 我会持续更新 Spring AI 实战系列,从聊天、RAG 到原理篇篇带完整代码,关注不迷路。
博主:10 年 Java 全栈开发,优质创作者。专注 Spring 源码、架构设计与 Spring AI 实战。
前文回顾:
- Spring AI 实战(1):Java 开发者如何优雅接入大模型(附完整代码)
- Spring AI 实战(2):ChatClient+Prompt+记忆三件套,手把手搭 AI 对话(附代码)
- Spring AI 实战(3):Alibaba 三行配置搞定 MySQL+Redis 记忆存储
- Spring AI 实战(4):结构化输出让大模型返回 Java 对象(附完整 Demo)
- Spring AI 实战(5):Tool Calling 让 AI 自动调用你的 Java 方法(附完整代码)
- Spring AI 实战(6):RAG 从文档切分到向量检索搭建知识库(全流程)
- Spring AI 实战(7):向量库怎么选?PgVector/Redis/Milvus 横向对比
- Spring AI 实战(8):别再重复造轮子!MCP 让 AI 直接调用任意外部工具
- Spring AI 实战(9):别让 AI 只会打字!Spring AI 多模态:读懂图片还能生图(附完整代码)
- Spring AI 实战(10):加个 starter 就能 @Autowired?扒开 Spring AI 自动装配与 Advisor 责任链
