Spring AI 面试题库(2026-05-22 22:04)
【面试题】1. Spring AI 中 ChatClient 和 ChatModel 有什么区别?实际项目该用哪个?
【标准答案】ChatModel 是底层抽象接口,直接对接各厂商 API(OpenAI、Anthropic、Ollama 等),适合简单场景。ChatClient 是 Spring AI 1.0 推出的统一入口,封装了 Prompt 模板、Advisor 链、Memory 管理等能力,Fluent API 风格更优雅。实际项目推荐 ChatClient,代码更简洁,扩展性更好。比如你要加对话记忆、RAG 增强,ChatClient 一行代码链式调用搞定,ChatModel 得自己组装一堆东西。只有极简场景或者需要底层控制时才直接用 ChatModel。
【面试题】2. Spring AI 的 Advisor 机制是什么?能解决什么问题?
【标准答案】Advisor 是 Spring AI 1.0 的核心架构设计,本质是一个拦截器链,可以在请求发往模型前后做增强处理。典型场景:对话记忆(MessageChatMemoryAdvisor)、RAG 增强(QuestionAnswerAdvisor)、日志审计、敏感词过滤等。它统一了横切关注点的处理方式,避免业务代码散落各种切面逻辑。使用时通过 ChatClient 的 advisors() 方法注册,执行顺序可配置,非常灵活。这种设计借鉴了 Spring AOP 的思想,让扩展点更清晰。
【面试题】3. Spring AI 实现 RAG 的完整流程是怎样的?各组件如何配合?
【标准答案】RAG 流程分两阶段:离线索引和在线检索。离线阶段:原始文档 → TokenTextSplitter 分块 → EmbeddingModel 生成向量 → VectorStore 存储向量。在线阶段:用户问题 → EmbeddingModel 编码 → VectorStore.similaritySearch() 检索相似片段 → 组装成 Prompt 上下文 → 发送给 ChatModel 生成答案。Spring AI 1.0 用 QuestionAnswerAdvisor 把检索和组装封装好了,直接注入即可。VectorStore 接口统一了不同向量库的调用,切换底库改配置就行,代码零改动。
【面试题】4. Spring AI 支持哪些向量数据库?如何选择?
【标准答案】Spring AI 官方支持 PGVector、Redis、Pinecone、Chroma、Milvus、Weaviate 等。选择看场景:小规模快速验证用 PGVector,利用现有 PostgreSQL,无需额外运维;生产环境高并发用 Milvus 或 Pinecone,分布式架构扩展性强;需要实时更新选 Redis,内存级读写;预算有限选 Chroma,轻量级易部署。关键点:Spring AI 通过 VectorStore 接口统一抽象,业务代码与具体实现解耦,配置 spring.ai.vectorstore.type 切换即可,迁移成本低。
【面试题】5. Spring AI 的 Function Calling 是如何实现的?@Bean 注册函数有什么讲究?
【标准答案】Spring AI 的 Function Calling 原理:用 @Bean 注册一个返回 Function<Input,Output> 的方法,框架自动扫描生成 JSON Schema,注入到模型请求的 tools 字段。模型返回 tool_call 时,Spring AI 自动反序列化参数、调用函数、把结果回传模型。注意点:输入输出类必须是 POJO,字段要有清晰命名和描述,框架据此生成准确的 Schema;函数名要有语义,模型会根据名字和描述判断何时调用;复杂场景可以手动指定 @Tool 注解定制描述。整个流程对开发者透明,写个 Bean 就能被模型调用。
【面试题】6. Spring AI 如何实现结构化输出(Structured Output)?有什么坑?
【标准答案】结构化输出用 BeanOutputConverter 或 ChatClient 的 entity() 方法,把模型响应映射到 POJO。核心原理是在 Prompt 里注入 JSON Schema,强制模型按格式输出,然后反序列化成对象。常见坑:一是模型输出格式不稳定,尤其是弱模型容易字段缺失或类型错误,建议用强模型(GPT-4、Claude 3)或调低温度;二是 POJO 字段命名要有语义,Schema 生成依赖字段名和描述;三是复杂嵌套对象可能 Schema 生成有问题,必要时手写 Schema;四是 entity() 方法会自动重试修复格式,但会增加 Token 消耗。生产环境务必加兜底校验。
【面试题】7. Spring AI 的 Chat Memory 怎么用?InMemoryChatMemory 能上生产吗?
【标准答案】ChatMemory 接口管理对话历史,InMemoryChatMemory 是默认实现,存 JVM 内存。用法:通过 MessageChatMemoryAdvisor 注入 ChatClient,指定 conversationId 区分会话,配置历史消息条数限制。InMemoryChatMemory 仅适合单机开发测试,生产环境有两个问题:一是内存有限,会话多了 OOM;二是无持久化,重启丢失。生产方案:自己实现 ChatMemory 接口,对接 Redis、数据库或分布式缓存,key 用 conversationId,value 存消息列表,加过期时间自动清理。Spring AI 不内置持久化实现,需要自己写,但接口很简单,几个方法的事。
【面试题】8. Spring AI 1.0 正式版相比之前的 Milestone 版本有什么重大变化?
【标准答案】最大变化是 ChatClient 统一入口,之前各种 Model 直接调用,现在统一走 ChatClient 的 Fluent API,链式调用更清晰。二是 Advisor 架构,把对话记忆、RAG 检索等能力标准化为 Advisor,可插拔组合。三是 VectorStore 接口统一,不同向量库配置方式一致,spring.ai.vectorstore.* 前缀。四是配置体系重构,spring.ai.* 统一前缀,各模块配置更规范。五是 Observability 增强,与 Micrometer 深度集成,自动暴露指标和追踪。迁移注意点:部分 API 包名变了,Maven 坐标变了,配置前缀变了,建议对照官方迁移指南逐步升级。
【面试题】9. 微服务架构下 Spring AI 如何管理 API Key 和做熔断限流?
【标准答案】API Key 管理最佳实践:不要硬编码在配置文件,用 Spring Cloud Config 或 Vault 统一管理,环境变量注入,定期轮换。熔断限流方案:接入 Resilience4j 或 Sentinel,对 ChatModel 调用配置熔断规则(异常比例、响应时间阈值),限流用令牌桶或滑动窗口,防止突发流量打爆后端。向量库高可用:多副本部署,读写分离,向量索引定期备份。微服务间调用加超时配置,ChatModel 默认超时可能不够,需要根据模型响应时间调整。Observability 用 Micrometer + Prometheus + Grafana 监控 Token 消耗、响应延迟、错误率,配置告警规则。
【面试题】10. Spring AI 对 MCP(Model Context Protocol)的支持是什么?有什么应用场景?
【标准答案】MCP 是 Anthropic 推出的模型上下文协议,标准化了 LLM 与外部工具、数据源的连接方式。Spring AI 正在积极支持 MCP,可以作为 MCP Server 暴露 Function Calling 能力,也可以作为 MCP Client 调用外部 MCP 服务。应用场景:一是多 Agent 协作,不同 AI 服务通过 MCP 共享上下文和工具;二是企业系统集成,通过 MCP 标准接口连接数据库、API、文件系统等;三是工具复用,一次定义的 MCP 工具可被多个模型调用。MCP 是 AI 生态互操作的重要趋势,Spring AI 的支持意味着可以无缝接入 Anthropic、OpenAI 等厂商的 MCP 生态。