Skip to content

Spring AI 面试题库 ​

生成时间:2026-05-21 21:51


【面试题】1. Spring AI 中 ChatClient 和 ChatModel 的区别是什么?实际项目中用哪个? ​

【标准答案】ChatModel 是底层模型抽象接口,直接接收 Prompt 返回 ChatResponse,偏向"裸调用"。ChatClient 是 Spring AI 1.0 推出的统一高级入口,基于 Fluent API 链式调用,内置了 Advisor 拦截机制、对话记忆、结构化输出等能力。实际项目优先用 ChatClient,因为它把通用横切逻辑(记忆、RAG、日志)都通过 Advisor 统一编排了,代码更简洁、可维护性更高。只有在需要极细粒度控制模型参数或自定义响应解析时,才直接用 ChatModel。

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

【标准答案】Advisor 是 Spring AI 中的请求/响应拦截器,可以在调用模型前后插入逻辑,比如加系统提示、记录日志、增强检索。它分 CallAdvisor(同步)和 StreamAdvisor(流式)两种。和 Spring MVC 拦截器思路一致——都是链式处理、前后增强——但作用域不同:Advisor 作用在 ChatClient 调用链上,处理的是 Prompt 和 ChatResponse;MVC 拦截器作用在 HTTP 请求链上。实际开发中,对话记忆(MessageChatMemoryAdvisor)、RAG 增强(QuestionAnswerAdvisor)都是通过 Advisor 实现的,不需要入侵业务代码。

【面试题】3. RAG 流程中 TokenTextSplitter 的 chunkSize 和 overlap 怎么调?调错了会有什么问题? ​

【标准答案】chunkSize 控制每段文本的 token 上限,overlap 控制相邻段的重叠量。经验值:chunkSize 500-1000、overlap 50-100 比较常用。chunkSize 太大→检索精度下降,一段包含太多无关信息,embedding 被稀释;chunkSize 太小→语义不完整,检索到的片段缺少上下文。overlap 太小→跨段信息丢失;overlap 太大→存储冗余、检索重复。实际做法:先用默认值跑 baseline,再根据召回率和回答质量微调。生产环境建议做 A/B 对比,不能拍脑袋。

【面试题】4. Spring AI 对接多个大模型(OpenAI + 智谱 + Ollama)时,如何实现动态切换? ​

【标准答案】两种主流方案:第一种,利用 spring.ai.* 配置前缀,每种模型配独立的 ChatModel Bean,通过 @Qualifier 注入选择;第二种,自定义路由 ChatModel,内部维护模型映射表,根据请求参数(如用户选择、任务类型、成本预算)动态分发到目标 ChatModel。生产推荐第二种,结合配置中心(Nacos/Apollo)实现运行时热切换。关键点:不同模型的参数名和响应格式可能有差异,建议在路由层做统一适配,业务层只依赖 ChatClient 通用 API,不绑定具体实现。

【面试题】5. Function Calling 中 @Bean 注册的函数,Spring AI 是怎么让大模型"知道"并调用的? ​

【标准答案】核心流程三步:第一,用 @Bean 注册一个 java.util.Function 类型的 Bean,Spring AI 自动扫描;第二,调用时通过 ChatClient 的 .functions("beanName") 声明可用函数,Spring AI 自动根据函数签名+参数类型生成 JSON Schema,作为 tool 定义拼入请求发给模型;第三,模型返回 tool_call 时,Spring AI 自动反序列化参数、执行对应函数、将结果回填到对话上下文再次调用模型。整个过程开发者只需写函数+注册 Bean,Schema 生成和调度编排由框架完成。注意:函数参数类型要简单清晰,复杂嵌套对象可能导致 Schema 生成不准确。

【面试题】6. Structured Output 用 BeanOutputConverter 时有哪些常见坑?怎么避免? ​

【标准答案】常见坑有三个:一是 POJO 字段名和模型输出不匹配,模型可能用中文 key 或不同命名风格,解决方式是加 @JsonProperty 显式映射;二是模型输出不是纯 JSON,可能带 markdown 代码块包裹,BeanOutputConverter 内部有 strip 逻辑但偶尔翻车,建议自己加一层 clean;三是 Schema 约束太松,模型自由发挥导致字段缺失或类型错误,解决方式是用 @NotNull、枚举类型、description 提示来收紧约束。生产建议:entity() 映射失败时加 fallback 逻辑,不要让整个流程直接异常。

【面试题】7. ChatMemory 的 InMemoryChatMemory 能上生产吗?生产环境怎么持久化? ​

【标准答案】InMemoryChatMemory 只适合开发和测试,重启即丢失,多实例部署无法共享,绝对不能直接上生产。持久化方案三种:一是基于数据库(MySQL/PostgreSQL)自建实现 ChatMemory 接口,按 conversationId 存取消息列表;二是用 Redis 存储,利用 TTL 自动过期旧对话,性能好、天然支持分布式;三是结合 Spring Data 抽象,用 JPA 或 Redis Template 实现统一接口。关键设计点:消息要按角色分存储、支持按时间/条数截断避免 token 溢出、高并发下注意读写一致性。推荐 Redis + 定期落库的混合方案。

【面试题】8. VectorStore 选型怎么决策?PGVector、Redis、Milvus 各适合什么场景? ​

【标准答案】选型看三个维度:数据规模、查询性能、运维成本。PGVector 适合已有 PG 基础设施的中等规模场景(百万级向量),零额外运维,但性能上限有限;Redis 适合高并发低延迟场景,利用现有 Redis 集群,但向量检索精度和高级过滤不如专业向量库;Milvus 适合大规模(亿级)生产场景,支持 GPU 加速、多种索引类型、水平扩展,但运维复杂度高。Pinecone 是全托管方案,适合不想运维的团队,但数据出境合规要考虑。我的建议:起步用 PGVector,量级起来后迁移 Milvus,Redis 做缓存层加速热查询。

【面试题】9. Spring AI 在微服务架构下,API Key 和限流熔断怎么做? ​

【标准答案】API Key 管理:不要硬编码在配置文件里,用 Vault 或配置中心加密存储,通过 spring.ai.openai.api-key 等属性外部化注入,多 Key 时做轮询池避免单 Key 限频。限流:模型侧用 Resilience4j 或 Sentinel 做限流熔断,设置 QPS 上限和超时时间;向量库侧也要限流,高并发 similaritySearch 可能打爆数据库。熔断:模型调用超时或异常率超阈值时自动降级,可切换到备用模型或返回缓存结果。监控:通过 Micrometer + Prometheus 采集 ChatClient 调用延迟、token 消耗、错误率等指标,Grafana 告警。核心原则:大模型调用是昂贵且不稳定的 IO 操作,必须当分布式服务来治理。

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

【标准答案】MCP(Model Context Protocol)是 Anthropic 提出的开放协议,定义了模型与外部工具/数据源之间的标准化通信规范。Spring AI 从 1.0 开始支持 MCP,允许通过 MCP Server 注册工具,ChatClient 自动发现和调用,无需手动 @Bean 注册。和 Function Calling 的关系:Function Calling 是模型厂商的能力(让模型输出 tool_call),MCP 是工具注册和调度的协议层。简单说,Function Calling 解决"模型怎么表达要调工具",MCP 解决"工具怎么被发现和执行"。Spring AI 同时支持两种:传统 @Bean 方式走 Function Calling 内部调度,MCP 方式走协议标准对接。未来趋势是 MCP 统一工具生态,一次注册多模型复用。