Skip to content

Spring AI 面试题库 ​

生成时间:2026-05-21 23:07 (Asia/Shanghai) 题目数量:10 道


【面试题】1. Spring AI 中 ChatClient 和直接用 ChatModel 有什么区别?为什么推荐用 ChatClient? ​

【标准答案】ChatModel 是底层抽象接口,直接调用只能传 Prompt 拿 ChatResponse,功能单一。ChatClient 是 Spring AI 1.0 引入的统一入口,基于 Fluent API 链式调用,核心优势有三点:第一,它内置了 Advisor 机制,可以在不修改业务代码的前提下插入对话记忆、RAG 检索、日志拦截等横切逻辑;第二,它支持结构化输出,一行 .entity(MyPojo.class) 就能把模型响应直接映射成 Java 对象,省去手动解析 JSON;第三,它统一了同步和 Streaming 两种调用模式,API 风格一致。面试中回答重点就是:ChatModel 是"裸调用",ChatClient 是"带装备的增强版入口",生产环境一律用 ChatClient。


【面试题】2. Spring AI 的 Advisor 机制怎么理解?和 Spring MVC 的拦截器有什么异同? ​

【标准答案】Advisor 是 Spring AI 的请求/响应拦截机制,类似 Filter 链。核心接口是 CallAroundAdvisor(同步)和 StreamAroundAdvisor(流式),可以在请求发给模型之前拦截修改 Prompt,也可以在模型返回后拦截修改 Response。和 Spring MVC 拦截器的相似点:都是链式执行、都支持前置/后置处理、都能控制是否继续传递。不同点:Advisor 操作的是 Prompt 和 ChatResponse 这个 AI 领域对象,不是 HttpServletRequest;另外 Advisor 天然配合 ChatClient 使用,不需要额外注册,通过 .defaultAdvisors() 或 .advisors() 就能挂载。典型场景:MessageChatMemoryAdvisor 在请求前注入历史消息,QuestionAnswerAdvisor 在请求前注入检索到的上下文。


【面试题】3. Spring AI 实现 RAG 的完整流程是怎样的?每个环节用什么组件? ​

【标准答案】RAG 分两大阶段——离线索引和在线检索。离线阶段:先用 TokenTextSplitter 把长文档按 token 切分成小段,再用 EmbeddingModel 把每段转成向量,最后存入 VectorStore(PGVector/Redis/Milvus 等任选)。在线阶段:用户提问时,先通过 VectorStore 的 similaritySearch 检索出最相关的文档片段,把这些片段拼接到 Prompt 的上下文里,再交给 ChatModel 生成答案。Spring AI 提供了 QuestionAnswerAdvisor 封装了在线检索+拼接的全流程,使用时只需 .advisors(new QuestionAnswerAdvisor(vectorStore)) 一行搞定。面试官追问细节时,重点说清楚:切分粒度影响检索精度、Embedding 模型要和向量库配套、similaritySearch 的 topK 参数控制召回量。


【面试题】4. Spring AI 的 Function Calling 怎么用?底层调度流程是什么? ​

【标准答案】使用方式分三步:第一步,写一个普通 Java 函数,用 @Bean 注册到 Spring 容器,Spring AI 自动根据函数签名和参数类型生成 JSON Schema;第二步,在 spring.ai.openai.chat.options.functions 配置中声明函数名,或者在 ChatClient 调用时通过 .functions("getWeather") 动态指定;第三步,模型判断需要调用工具时返回 tool_call,Spring AI 框架自动拦截、执行对应函数、把结果拼回 Prompt 再次调用模型,整个循环对业务代码透明。底层流程:用户 Prompt → ChatModel → 模型返回 tool_call → 框架匹配 Bean 函数并执行 → 函数结果作为 tool message 回传 → 模型生成最终回答。关键点:函数注册方式是 @Bean,不是注解标注;JSON Schema 自动生成不需要手写;多轮 tool_call 框架自动循环直到模型不再请求工具。


【面试题】5. Spring AI 切换不同模型(比如从 OpenAI 切到智谱)需要改什么?配置怎么管理? ​

【标准答案】Spring AI 的多模型切换核心就是换依赖和改配置前缀。第一步,换 Maven 依赖:从 spring-ai-openai-spring-boot-starter 换成 spring-ai-zhipuai-spring-boot-starter;第二步,改配置:spring.ai.openai.* 前缀换成 spring.ai.zhipuai.*,包括 api-key、base-url、chat.options.model 等;第三步,代码层面零改动,因为 ChatClient 和 ChatModel 都是接口抽象,注入的是同一个类型。如果需要同时对接多个模型,可以手动创建多个 ChatModel 的 Bean,用 @Qualifier 区分注入。Spring AI 1.0 统一了 spring.ai.* 配置前缀规范,各厂商实现都遵循相同的自动配置模式,切换成本极低。面试加分点:提到可以在运行时通过 ChatClient 动态切换 options,实现 A/B 测试或灰度路由。


【面试题】6. Spring AI 的 Structured Output 结构化输出怎么实现?有哪些常见坑? ​

【标准答案】核心方式两种:第一种,BeanOutputConverter,传入目标类的 JSON Schema,模型按 Schema 输出,再用 converter 的 .parse() 反序列化;第二种,ChatClient 的 .entity(MyPojo.class) 方法,一行搞定,底层自动生成 Schema、自动解析。常见坑有三个:第一,模型不一定严格遵守 Schema,尤其复杂嵌套对象容易漏字段,需要加上 @JsonProperty(required=true) 约束并在 Prompt 里强调格式;第二,LLM 的输出本质是文本,entity() 底层还是 JSON 解析,格式不合法会抛异常,生产环境必须 try-catch 或加重试;第三,枚举类型的字段容易出问题,模型可能输出不在枚举内的值,建议加 @JsonCreator 做容错。面试官问最佳实践就说:简单 POJO 用 .entity(),复杂场景用 BeanOutputConverter + 手动校验。


【面试题】7. Spring AI 的对话记忆怎么实现?生产环境怎么持久化? ​

【标准答案】Spring AI 的对话记忆核心是 ChatMemory 接口 + MessageChatMemoryAdvisor。内置实现 InMemoryChatMemory 直接用 Map 存储,适合单机开发和测试。使用方式:创建 advisor 时指定 conversationId 和最大保留条数,挂到 ChatClient 的 .defaultAdvisors() 上,框架自动在每次请求前注入历史消息、请求后保存新消息。生产环境持久化方案:自定义实现 ChatMemory 接口,add() 方法写数据库(MySQL/Redis/MongoDB),get() 方法按 conversationId 查询,clear() 方法删除记录。推荐用 Redis 存储,因为对话记忆是高频读写、有过期时间的场景,Redis 的 TTL 机制天然适合。面试加分:提到 MessageChatMemoryAdvisor 的 topK 参数控制窗口大小,防止上下文超 token 限制;多实例部署时必须用集中式存储而非 InMemory。


【面试题】8. Spring AI 项目上线时 API Key 怎么安全管理?超时和限流怎么配? ​

【标准答案】API Key 管理三原则:第一,绝不硬编码,spring.ai.openai.api-key 用环境变量或 Vault 注入,配置文件里用 ${OPENAI_API_KEY} 占位;第二,不同环境(dev/staging/prod)用不同的 Key,通过 Spring Profile 隔离;第三,Key 轮换要无感,结合配置中心(Nacos/Apollo)热更新。超时配置:spring.ai.openai.chat.options 下可以设 temperature、max-tokens 等参数,连接超时和读超时通过 spring.ai.openai.connection.timeout 和 spring.ai.openai.read.timeout 控制。限流熔断:Spring AI 本身不带限流,生产环境要配 Resilience4j 或 Sentinel,在 ChatModel 调用外层加 @CircuitBreaker 和 @RateLimiter,降级策略返回预设话术或走备用模型。面试总结一句话:Key 外置+环境隔离,超时兜底,限流熔断用 Spring 生态成熟组件。


【面试题】9. Spring AI 1.0 正式版相比之前里程碑版本有哪些关键变化? ​

【标准答案】四大核心变化:第一,ChatClient 成为统一入口,之前各个 ChatModel 实现的调用方式不统一,1.0 后统一用 ChatClient 的 Fluent API,.prompt().user().call() 一套搞定;第二,Advisor 架构正式确立,之前叫 Interceptor/Advisor 名词混用,1.0 统一为 Advisor 体系,分 CallAroundAdvisor 和 StreamAroundAdvisor,语义清晰;第三,VectorStore 接口统一,之前各向量库的 add/delete/search 方法签名不一致,1.0 统一了 VectorStore 接口规范,切换向量库只需换实现 Bean;第四,spring.ai.* 配置前缀标准化,所有厂商实现的配置项都遵循 spring.ai.<provider>.* 的命名规范,不再各写各的。面试要点:1.0 不是小版本迭代,是 API 稳定性承诺,从 SNAPSHOT 到 GA 意味着核心接口不再频繁 breaking change,可以放心上生产。


【面试题】10. Spring AI 的 MCP 支持是什么?和 Function Calling 有什么关系? ​

【标准答案】MCP 是 Model Context Protocol,Anthropic 提出的开放标准,定义了 AI 模型与外部工具/数据源的标准化通信协议。Spring AI 从 1.0 开始支持 MCP,核心价值是:让 AI 应用可以通过统一协议对接任意工具服务器,不需要为每个工具单独写 Function Calling 的 @Bean。具体来说,Function Calling 是 Spring AI 的本地工具调用机制,工具函数必须在同一个 JVM 里注册;而 MCP 是远程工具发现协议,工具可以部署在独立进程甚至远程服务器上,通过 MCP 协议动态发现和调用。关系:MCP 是 Function Calling 的超集和标准化扩展,Spring AI 的 MCP 客户端会自动把远程 MCP 工具转换成本地的 Function Calling 注册,上层 ChatClient 代码无需改动。面试回答重点:Function Calling 解决"本地工具调用",MCP 解决"跨进程/跨服务工具发现与调用",两者互补而非替代,MCP 是 AI Agent 编排的基础设施。