Skip to content

Spring AI 面试题库 ​

生成时间:2026-05-21 23:17


本轮 Spring AI 面试题库(带答案) ​

【面试题】1. Spring AI 的 ChatClient 和直接用 ChatModel 有什么区别?什么时候用哪个? ​

【标准答案】ChatModel 是底层抽象,你传 Prompt,它返回 ChatResponse,够用但代码比较"裸"。ChatClient 是 Spring AI 1.0 推荐的统一入口,封装了 Fluent API、Advisor 机制、对话记忆、结构化输出等功能,一行链式调用就能完成复杂流程。

简单说:写 Demo 或简单调用用 ChatModel,生产环境复杂场景用 ChatClient。ChatClient 的优势在于可插拔的 Advisor 链,比如加个 QuestionAnswerAdvisor 就能做 RAG,加个 ChatMemoryAdvisor 就能记住上下文,不用自己拼 Prompt。


【面试题】2. RAG 里的 EmbeddingModel 和 VectorStore 是什么关系?文档入库的完整流程是什么? ​

【标准答案】EmbeddingModel 负责"向量化",把文本转成数值向量;VectorStore 负责"存和检索",把向量存起来、支持相似度查询。两者配合才能做 RAG。

入库流程四步走:第一,用 DocumentReader 读原始文档;第二,用 TokenTextSplitter 分块,控制每块大小和重叠;第三,调用 EmbeddingModel.embed() 把每块转成向量;第四,调用 VectorStore.add() 把 Document(含原文、向量、元数据)存进去。检索时用 similaritySearch(queryEmbedding, k) 取 Top-K,然后拼到 Prompt 里送给大模型。


【面试题】3. Spring AI 的 Function Calling 怎么用?@Bean 注册函数的原理是什么? ​

【标准答案】用很简单:写一个普通方法,加 @Bean 注解,返回类型是函数式接口(如 Function<String, String>),Spring AI 会自动扫描注册。调用时,大模型判断需要调用工具,返回 tool_call,Spring AI 自动执行你的函数,把结果返回给模型,模型再生成最终答案。

原理:Spring AI 会根据方法签名自动生成 JSON Schema,告诉模型这个工具叫什么、参数是什么类型。模型决定调用后,框架通过函数名找到 Bean,反射执行。整个过程你不用手写调度逻辑,Spring AI 帮你把 round-trip 全干了。


【面试题】4. QuestionAnswerAdvisor 是什么?它是怎么实现 RAG 的? ​

【标准答案】QuestionAnswerAdvisor 是 Spring AI 内置的 RAG Advisor,挂到 ChatClient 上就能自动做检索增强。它的核心逻辑:用户提问时,它先调用 VectorStore.similaritySearch() 检索相关文档,然后把文档拼到 Prompt 的系统提示里,相当于给模型"开卷考试"。

使用方式:ChatClient.builder(chatModel).defaultAdvisors(new QuestionAnswerAdvisor(vectorStore)).build()。还能配参数:topK 控制检索数量、similarityThreshold 控制相似度阈值、userTextAdvise 自定义提示模板。不用自己写检索逻辑,一行配置搞定。


【面试题】5. BeanOutputConverter 怎么用?结构化输出有什么坑? ​

【标准答案】BeanOutputConverter 用来把大模型输出转成 Java POJO。用法:定义一个类加 @Description 注解描述字段,然后 new BeanOutputConverter<>(MyPojo.class).convert(response),或者用 ChatClient 的 .entity(MyPojo.class) 直接映射。

坑主要有三个:一是大模型可能返回非法 JSON,要加重试或兜底;二是 Schema 不支持复杂嵌套结构,嵌套太深会解析失败;三是模型可能"加戏",多输出解释文字导致 JSON 不纯。解决方案:在 Prompt 里明确说"只返回 JSON,不要任何额外文字",或者用 entity() 时设置 strict 模式。


【面试题】6. ChatMemory 的 InMemoryChatMemory 能在生产用吗?持久化方案有哪些? ​

【标准答案】InMemoryChatMemory 只能存内存,服务重启就丢,单机调试够用,生产环境不行。生产方案有两种:一是自己实现 ChatMemory 接口,底层接 Redis 或数据库,存消息历史;二是用 Spring AI 生态提供的持久化实现(如 Redis ChatMemory)。

关键点:ChatMemory 只存原始消息,不存对话状态。真正让模型"记住"的是 MessageChatMemoryAdvisor,它从 ChatMemory 读历史消息拼到 Prompt 里。配置:.defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory, conversationId, 10)),第三个参数是保留多少轮历史。


【面试题】7. Spring AI 怎么做多模型切换?比如 OpenAI 和国产模型并存? ​

【标准答案】Spring AI 通过 spring.ai.* 配置前缀区分模型提供商。比如 spring.ai.openai.api-key、spring.ai.zhipu.api-key,各模型独立配置。代码层面,每个模型有对应的 ChatModel 实现类(OpenAiChatModel、ZhipuChatModel),通过 @Autowired 注入或 ChatClient.builder() 指定。

动态切换:可以用 Map<String, ChatModel> 注入所有实现,根据请求参数或路由规则选模型;或者用 Spring AI 的多模型路由特性,配置权重或规则自动切换。注意不同模型的 Prompt 格式和参数差异,必要时做适配。


【面试题】8. 生产环境 API Key 怎么管理?硬编码在代码里有什么风险? ​

【标准答案】绝对不能硬编码。风险:代码泄露直接暴露 Key,Git 历史会留下痕迹,多人协作无法隔离权限。生产方案:用配置中心(如 Spring Cloud Config、Nacos、Vault)或环境变量注入,Spring AI 支持 spring.ai.openai.api-key=${OPENAI_API_KEY},从环境变量读。

更安全:用密钥管理服务(AWS Secrets Manager、阿里云 KMS),应用启动时动态拉取,内存中缓存,不落盘。再加 API 网关统一鉴权,内网服务不直接访问外部 API,都走网关转发。


【面试题】9. Spring AI 1.0 相比 0.8 版本有什么重大变化? ​

【标准答案】最大变化是 ChatClient 统一入口,之前各模型有独立的调用方式,现在全走 ChatClient,API 一致。Advisor 架构升级,所有增强逻辑(RAG、Memory、工具调用)都变成可插拔的 Advisor,不用自己拼 Prompt。VectorStore 接口统一,各向量库实现同一套 API,换库只改配置。

配置前缀从 spring.ai.model 改成 spring.ai.openai.model,更清晰。整体趋势:更贴近 Spring 生态风格,自动配置更强,扩展点更灵活。


【面试题】10. Spring AI 怎么做流式输出(Streaming)?有什么注意事项? ​

【标准答案】用 ChatClient 的 .stream() 方法替代 .call(),返回 Flux<String> 或 StreamingChatResponse,响应式流式返回 token。前端用 SSE(Server-Sent Events)或 WebSocket 接收,体验更流畅。

注意事项:一是流式返回时无法一次性校验完整输出,结构化输出要小心;二是错误处理更复杂,流中途断了要处理重连;三是要配超时和背压,防止客户端消费太慢导致内存溢出。可以用 .doOnError() 和 .timeout() 加兜底逻辑。


共 10 题,覆盖:核心架构、RAG、Function Calling、结构化输出、Chat Memory、多模型切换、生产安全、版本更新、流式输出等核心考点。