Skip to content

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

【面试题】1. Spring AI 1.0 中 ChatClient 与传统的 ChatModel 有什么区别?为什么要引入 ChatClient? ​

【标准答案】ChatClient 是 Spring AI 1.0 推荐的统一入口,而 ChatModel 是底层模型抽象。区别主要体现在三点:第一,ChatClient 提供了 Fluent API 链式调用,代码更简洁优雅,比如 chatClient.prompt().user("问题").call().content();第二,ChatClient 内置了 Advisor 机制,可以插拔式地添加对话记忆、RAG 检索等能力,而 ChatModel 需要手动管理;第三,ChatClient 统一了同步和流式响应的调用方式,支持 call() 同步和 stream() 流式两种模式。简单说,ChatModel 是"原材料",ChatClient 是"厨具",实际开发优先用 ChatClient。

【面试题】2. 请解释 Spring AI 中 Advisor 机制的作用和工作原理 ​

【标准答案】Advisor 是 Spring AI 1.0 引入的拦截器机制,类似于 Spring AOP 的概念,但专门针对 AI 调用链路设计。工作原理是:当调用 ChatClient 时,请求会依次经过注册的 Advisor 链,每个 Advisor 可以在请求发送前(前置处理)和响应返回后(后置处理)进行拦截增强。典型应用场景包括:ChatMemoryAdvisor 自动注入历史对话上下文、QuestionAnswerAdvisor 实现 RAG 检索增强、自定义 Advisor 实现日志审计或敏感词过滤。Advisor 通过 advisors() 方法注册,支持顺序控制,执行顺序类似洋葱模型,请求从外到内,响应从内到外。

【面试题】3. Spring AI 实现 RAG 的核心组件有哪些?请描述一次完整的 RAG 调用流程 ​

【标准答案】核心组件包括:EmbeddingModel(将文本转为向量)、VectorStore(向量存储,支持 PGVector/Redis/Pinecone/Chroma/Milvus 等)、TokenTextSplitter(文档切片)、QuestionAnswerAdvisor(RAG 拦截器)。完整流程是:第一步,文档预处理,用 TokenTextSplitter 将大文档切片成合适大小的片段;第二步,向量化存储,通过 EmbeddingModel 将每个切片转为向量并存入 VectorStore;第三步,用户提问时,QuestionAnswerAdvisor 拦截请求,将问题也转为向量,调用 VectorStore 的 similaritySearch 方法检索相似文档;第四步,将检索结果作为上下文拼接到 Prompt 中,发送给 ChatModel 生成答案。整个流程对业务层透明,只需配置 Advisor 即可。

【面试题】4. Spring AI 的 Function Calling 是如何实现的?@Bean 注册函数的底层原理是什么? ​

【标准答案】Spring AI 的 Function Calling 基于 JSON Schema 自动发现和调用机制实现。底层原理:第一步,通过 @Bean 注解注册一个 Function Bean,Spring AI 会自动扫描其方法签名;第二步,Spring AI 利用类型推断自动生成 JSON Schema,包括函数名、参数类型、参数描述等;第三步,当调用 ChatModel 时,Spring AI 将函数描述作为 tools 参数传给大模型;第四步,大模型根据用户问题决定是否需要调用函数,如果需要则返回 tool_call 响应;第五步,Spring AI 自动解析 tool_call,执行对应的 Function Bean,获取结果后再次调用大模型;第六步,大模型基于函数返回结果生成最终回复。整个过程开发者只需定义 @Bean 函数,框架自动完成调度。

【面试题】5. Spring AI 如何实现多模型切换?spring.ai.* 配置前缀的作用是什么? ​

【标准答案】Spring AI 通过统一的 ChatModel 接口抽象实现多模型切换,底层每个模型供应商提供独立的实现类(如 OpenAiChatModel、AnthropicChatModel、OllamaChatModel 等)。配置层面使用 spring.ai.* 前缀区分不同模型,比如 spring.ai.openai.api-key、spring.ai.anthropic.api-key、spring.ai.ollama.base-url。切换方式有三种:第一,通过 spring.ai.chat.model 配置默认模型;第二,通过 Profile 激活不同配置,如 spring.profiles.active=openai 或 anthropic;第三,通过依赖注入时指定具体实现,如 @Qualifier("openAiChatModel")。实际生产中建议配合配置中心动态切换,实现灰度发布或故障转移。

【面试题】6. Spring AI 的 Structured Output 如何将大模型输出映射为 POJO?有哪些常见坑? ​

【标准答案】Spring AI 通过 BeanOutputConverter 实现结构化输出,核心方法是 entity() 将 JSON 响应自动映射为 POJO。原理是:框架根据 POJO 类定义自动生成 JSON Schema,作为约束条件附加到 Prompt 中,大模型按 Schema 输出 JSON,Spring AI 再通过 Jackson 反序列化为对象。常见坑有:第一,POJO 必须有无参构造函数和标准 getter/setter,否则反序列化失败;第二,复杂嵌套对象可能超出模型上下文限制,需要简化结构;第三,枚举类型需要在 Schema 中明确列出所有可选值;第四,不同模型对 JSON Schema 的支持程度不同,OpenAI 较好,某些开源模型可能不稳定;第五,entity() 方法默认使用整个响应内容,如果模型输出了多余文本会导致解析失败,建议在 Prompt 中明确要求"只输出 JSON"。

【面试题】7. Spring AI 的 Chat Memory 如何实现对话记忆持久化?InMemoryChatMemory 有什么局限? ​

【标准答案】Chat Memory 通过 ChatMemory 接口和 MessageChatMemoryAdvisor 实现。InMemoryChatMemory 是内存实现,将对话历史保存在 JVM 内存中,局限是:应用重启后记忆丢失、无法在多实例间共享、内存占用随对话增长。生产级持久化方案:第一,自定义 ChatMemory 实现,底层用 Redis 存储对话历史,以 conversationId 为 key;第二,用数据库存储,设计 conversation 和 message 两张表,通过 JPA 或 MyBatis 操作;第三,结合 VectorStore 将对话摘要向量化,实现语义检索历史对话。MessageChatMemoryAdvisor 负责在每次对话时自动注入历史消息,通过 conversationId 关联会话,支持配置注入的消息条数限制,避免超出上下文窗口。

【面试题】8. Spring AI 在微服务架构下如何管理 API Key 和实现多模型路由? ​

【标准答案】API Key 管理方案:第一,通过 Spring Cloud Config 或 Vault 集中管理,避免明文配置在代码库;第二,使用 Kubernetes Secret 注入环境变量;第三,配合 Spring Cloud Config 实现动态刷新,支持密钥轮换;第四,在网关层统一加解密,服务内部只处理密文。多模型路由方案:第一,基于 Spring Cloud Gateway 实现路由层,根据请求头或路径参数转发到不同模型服务;第二,通过自定义 ChatModel 实现动态代理,内部维护模型池,支持负载均衡和故障转移;第三,结合 Resilience4j 实现熔断降级,当主模型不可用时自动切换到备用模型;第四,通过 Micrometer 监控各模型的响应时间和成功率,动态调整路由权重。实际落地建议在配置中心维护模型路由表,支持灰度发布和 A/B 测试。

【面试题】9. Spring AI 1.0 正式版相比之前版本有哪些重大更新?ChatClient 统一入口的意义是什么? ​

【标准答案】Spring AI 1.0 正式版重大更新包括:第一,ChatClient 作为统一入口,取代了之前分散的 ChatModel 直接调用方式,提供一致的 Fluent API;第二,Advisor 架构标准化,所有增强能力都通过 Advisor 插件实现,替代了之前各模型不同的扩展方式;第三,VectorStore 接口统一,各向量数据库实现遵循相同的 API 规范,切换成本大幅降低;第四,spring.ai.* 配置前缀标准化,之前各模型配置方式不一致的问题得到解决;第五,Observability 支持完善,内置 Micrometer 指标和分布式追踪集成;第六,Streaming 响应支持增强,通过 Flux 实现真正的流式输出。ChatClient 统一入口的意义在于:开发者只需学习一套 API,就能无缝切换底层模型,同时享受 Advisor 带来的能力扩展,降低了学习成本和迁移成本,是 Spring AI 走向成熟的重要标志。

【面试题】10. Spring AI 如何与 Micrometer 集成实现 Observability?可以监控哪些核心指标? ​

【标准答案】Spring AI 与 Micrometer 集成是开箱即用的,只需在 pom.xml 中引入 spring-boot-starter-actuator 和对应的监控后端依赖(如 Prometheus)。核心监控指标包括:第一,调用指标,如 spring.ai.chat.model.calls(调用次数)、spring.ai.chat.model.latency(响应延迟)、spring.ai.chat.model.errors(错误率);第二,Token 使用指标,如 spring.ai.chat.model.tokens.prompt(输入 token 数)、spring.ai.chat.model.tokens.completion(输出 token 数)、spring.ai.chat.model.tokens.total(总 token 消耗);第三,向量检索指标,如 spring.ai.vectorstore.queries(查询次数)、spring.ai.vectorstore.similarity.latency(相似度检索延迟);第四,Function Calling 指标,如 spring.ai.function.calls(函数调用次数)、spring.ai.function.execution.time(函数执行耗时)。实际落地建议配合 Grafana 仪表盘展示,设置告警规则(如错误率超阈值、延迟过高),实现主动监控和快速定位问题。