Spring AI 面试题库
生成时间:2026-05-21 20:49
【面试题】1. Spring AI 中 ChatClient 和 ChatModel 有什么区别?实际项目中该用哪个?
【标准答案】ChatModel 是底层抽象,负责直接调用大模型API,返回原始响应;而 ChatClient 是 Spring AI 1.0 推荐的高层统一入口,内置了 Advisor 链、Fluent API、自动消息管理等能力。
实际项目中首选 ChatClient,原因有三:
- 第一,Fluent API 链式调用更优雅,代码可读性强;
- 第二,内置 Advisor 机制,可以无缝注入 Chat Memory、RAG、日志等横切逻辑;
- 第三,统一抽象层屏蔽了不同模型厂商的差异,切换模型只需改配置。
只有当你需要底层控制、比如自定义请求参数、直接操作原始响应时,才考虑直接用 ChatModel。
【面试题】2. 请解释 Spring AI 的 Advisor 机制是如何工作的?能举几个常用场景吗?
【标准答案】Advisor 是 Spring AI 的横切关注点处理机制,类似 AOP 的概念,但专为 AI 调用设计。每个 Advisor 可以在请求发出前(预处理)和响应返回后(后处理)插入自定义逻辑。
工作流程:请求 → Advisor链(前置处理)→ ChatModel → Advisor链(后置处理)→ 响应。Advisor 通过 CallAroundAdvisor 或 StreamAroundAdvisor 接口实现,可以修改 Prompt、拦截响应、记录日志、注入上下文等。
常用场景:
- Chat Memory:
MessageChatMemoryAdvisor自动维护对话历史; - RAG 增强:
QuestionAnswerAdvisor自动注入检索到的文档上下文; - 日志审计:自定义 Advisor 记录每次调用的 Token 消耗、耗时;
- 敏感词过滤:请求前检测 Prompt,响应后过滤敏感内容。
【面试题】3. 在 Spring AI 中实现 RAG,VectorStore 该如何选型?PGVector、Redis、Pinecone 各有什么优劣势?
【标准答案】选型核心看三点:数据规模、部署环境、成本预算。
PGVector:适合已有 PostgreSQL 的项目,零额外运维成本,生态成熟。劣势是大规模向量检索性能不如专业向量库,适合中小规模(百万级以内)。
Redis:如果项目已经用 Redis 做缓存,复用它能减少运维负担。Redis 的向量搜索基于 RedisSearch 模块,延迟低、支持实时更新,但功能相对简单,复杂查询支持有限。
Pinecone:全托管云服务,性能强、扩展性好,适合生产级大规模应用。但国内访问可能不稳定,且有数据出境合规风险,成本也较高。
我的建议:国内项目优先考虑 PGVector 或 Milvus(开源、高性能、支持私有化部署);海外项目可以直接用 Pinecone 省运维。
【面试题】4. Spring AI 的 Function Calling 是怎么实现的?@Bean 注册函数后,模型是怎么知道函数签名的?
【标准答案】Spring AI 的 Function Calling 完全屏蔽了底层复杂性,核心流程分三步:
- 注册阶段:开发者用
@Bean定义一个返回类型为Function<I, O>的方法,Spring AI 自动扫描注册; - Schema 生成:调用时,Spring AI 通过 Jackson 自动解析函数的输入类型 I,生成符合 OpenAI 规范的 JSON Schema,包含参数名、类型、描述(可配合
@JsonPropertyDescription注解完善); - 调度执行:模型返回
tool_call后,Spring AI 自动反序列化参数、调用对应 Bean、将结果序列化返回给模型继续推理。
关键配置:通过 spring.ai.openai.chat.options.functions 或代码动态指定可用函数列表。整个过程开发者只需写函数逻辑,框架搞定 Schema 和调度。
【面试题】5. Structured Output 结构化输出在实际落地中有哪些坑?BeanOutputConverter 怎么用才稳?
【标准答案】坑主要集中在三方面:
第一,Schema 设计:POJO 字段命名要语义清晰,避免模糊的 field1、data;复杂嵌套对象容易生成失败的 Schema,建议扁平化设计;枚举类型要加 @JsonPropertyDescription 说明可选项。
第二,模型能力差异:不同模型对 Function Calling / JSON Mode 支持程度不同。OpenAI 最稳,国产模型偶尔会"幻觉"出 Schema 之外的字段或格式错乱,务必加一层后端校验。
第三,错误处理:解析失败时要有兜底策略,比如重试时让模型"输出更严格",或降级到提示词工程方式约束格式。
BeanOutputConverter 用法:
BeanOutputConverter<MyPojo> converter = new BeanOutputConverter<>(MyPojo.class);
String format = converter.getFormat(); // 获取提示词约束
String response = chatClient.prompt().user(prompt + format).call().content();
MyPojo result = converter.parse(response); // 解析为对象用 chatClient.prompt().entity(MyPojo.class) 更简洁,框架自动完成上述流程。
【面试题】6. Chat Memory 对话记忆的实现原理是什么?InMemoryChatMemory 能上生产吗?
【标准答案】Chat Memory 的核心是 ChatMemory 接口和 MessageChatMemoryAdvisor,前者负责存储历史消息,后者负责在每次调用前自动注入历史。
实现原理:
- 每次
chatClient.prompt()调用时,Advisor 根据conversationId查询历史消息; - 将历史消息按 Token 限制截断(可配置窗口大小),拼接到当前 Prompt;
- 模型响应后,新消息自动存入 Memory。
InMemoryChatMemory 能否上生产:不能直接上!它是内存实现,重启后丢失,且无分布式共享能力。生产环境需要:
- 用 Redis / 数据库实现持久化 ChatMemory;
- 或者用 Spring AI 提供的
RedisChatMemory等现成实现; - 注意 Token 窗口管理,历史过长会截断关键上下文。
【面试题】7. Spring AI 在微服务架构下部署,API Key 管理和模型切换怎么做才安全又灵活?
【标准答案】API Key 管理遵循"配置外部化 + 动态注入"原则:
安全实践:
- 绝不硬编码:用 Vault、AWS Secrets Manager、阿里云 KMS 等密钥管理服务存储 API Key;
- 配置中心下发:通过 Nacos、Apollo 等配置中心动态下发,支持热更新;
- 环境隔离:不同环境用不同的 Key,开发环境可用额度受限的 Key,生产用主 Key。
模型切换策略:
- 通过
spring.ai.openai.api-key、spring.ai.anthropic.api-key等配置外部化; - 利用
spring.profiles.active切换不同模型的配置文件; - 代码层面通过
ChatClient.Builder动态指定ChatModelBean,实现 A/B 测试或灰度切换; - 高级场景可自研路由层,根据请求类型、成本、延迟智能选择模型。
【面试题】8. Spring AI 1.0 正式版相比之前的 Milestone 版本,有哪些重大更新值得面试官眼前一亮?
【标准答案】Spring AI 1.0 正式版有几个里程碑式更新:
ChatClient 统一入口:之前用 ChatModel.call() 直接调用,现在统一推荐用 ChatClient,Fluent API 风格,支持链式配置、流式响应、Entity 映射,代码优雅很多。
Advisor 架构成熟:CallAroundAdvisor、StreamAroundAdvisor 提供了完整的拦截链,支持前置后置处理,RAG、Memory 都通过 Advisor 实现,扩展性极强。
VectorStore 接口统一:之前各向量库 API 差异大,现在统一为 VectorStore 接口,增删改查方法标准化,切换底层存储只需换 Bean。
配置前缀统一:从散乱的配置项统一为 spring.ai.* 前缀,如 spring.ai.openai.chat.options.model,更符合 Spring Boot 规范。
Observability 集成:原生支持 Micrometer 指标暴露,Token 消耗、调用延迟、成功率都可观测。
【面试题】9. Spring AI 如何实现多模态能力?比如处理图片输入或语音场景?
【标准答案】Spring AI 的多模态能力通过 Media 类和 UserMessage 扩展实现。
图片输入示例:
Resource imageResource = new FileSystemResource("image.png");
UserMessage message = new UserMessage(
"这张图片里有什么?",
new Media(MimeTypeUtils.IMAGE_PNG, imageResource)
);
chatClient.prompt().messages(message).call();框架自动将图片编码为 Base64 或 URL 形式,按不同模型的 API 规范发送。目前 OpenAI GPT-4V、Anthropic Claude 3 系列支持视觉输入。
语音场景:
- 语音输入:前端通过 Whisper 等 ASR 转文字后,走普通 Chat 流程;
- 语音输出:TTS 需调用独立 API(如 OpenAI TTS),Spring AI 暂无内置语音输出抽象,需自行封装。
注意:多模态对 Token 消耗影响大,图片会折算为大量 Token,需评估成本。
【面试题】10. Spring AI 的 Streaming 流式响应如何实现?前端 SSE 对接有什么注意事项?
【标准答案】Spring AI 的 Streaming 通过 stream() 方法实现,底层返回 Flux<String> 响应式流。
后端实现:
Flux<String> stream = chatClient.prompt()
.user("讲个故事")
.stream()
.content();配合 Spring WebFlux 的 ServerSentEvent 封装:
@GetMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<String>> stream(@RequestParam String prompt) {
return chatClient.prompt().user(prompt).stream().content()
.map(chunk -> ServerSentEvent.<String>builder().data(chunk).build());
}前端对接注意事项:
- SSE 连接管理:EventSource 不支持 POST,需用 fetch + ReadableStream 或第三方库;
- 断线重连:网络波动时需自动重连,并处理 lastEventId 恢复;
- 流式渲染:前端要支持增量渲染,避免每次收到 chunk 都重绘整个内容;
- 错误处理:超时、Token 限制、模型过载等情况要有降级提示;
- 停止生成:提供取消按钮,关闭 SSE 连接。
本轮题目覆盖:架构核心(ChatClient vs ChatModel)、机制原理(Advisor、Function Calling)、实战选型(VectorStore)、生产部署(API Key 管理、Streaming)、版本更新(1.0 新特性)、前沿趋势(多模态)。