Skip to content

Spring AI 面试题库 ​

生成时间:2026-05-21 22:19


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

【面试题】1. Spring AI中ChatClient和ChatModel有什么区别?实际开发中应该用哪个? ​

【标准答案】ChatModel是底层模型接口,直接对接大模型API,适合简单调用场景。ChatClient是Spring AI 1.0推出的统一入口,提供了Fluent API和Advisor机制,支持链式调用、拦截器、对话记忆等高级特性。实际开发中优先使用ChatClient,因为它封装更完善,代码更优雅,扩展性更强。只有在需要直接控制模型参数或做深度定制时才考虑直接用ChatModel。

【面试题】2. 在RAG场景中,TokenTextSplitter的chunkSize和overlap参数如何设置?过大或过小会有什么问题? ​

【标准答案】chunkSize建议800-1200 tokens,overlap建议10%-20%,即100-200 tokens。chunkSize过大:检索精度下降,相似文档多,噪音大,回答不够精准。chunkSize过小:语义被切断,丢失上下文,检索召回率低。overlap的作用是保证相邻chunk有重叠,避免关键信息在边界被截断。实际项目中需要根据文档类型调优,技术文档可以稍大,对话记录要小一些。

【面试题】3. Spring AI中如何实现Function Calling?@Bean注册的函数如何被模型识别和调用? ​

【标准答案】两步实现:第一步,定义方法并加@Bean注解,返回类型为Function<Prompt, Response>或直接用方法名;第二步,在调用ChatClient时通过.functions()或.toolNames()注册函数名。Spring AI会自动生成JSON Schema描述函数签名和参数,随请求发给模型。模型判断需要调用工具时返回tool_call,Spring AI拦截后执行对应方法,拿到结果再回传模型。整个过程对开发者透明,只需关注业务逻辑。

【面试题】4. 对比PGVector、Redis、Pinecone、Chroma、Milvus这几个VectorStore的选型场景? ​

【标准答案】PGVector:适合已有PostgreSQL基础设施,数据量中等,部署简单,但性能不如专业向量库。Redis:适合需要低延迟、已有Redis集群,但向量能力有限,不适合大规模检索。Pinecone:全托管,开箱即用,适合快速原型和小团队,但成本高、数据不在本地。Chroma:轻量级嵌入式,适合单机开发测试,生产环境不推荐。Milvus:高性能分布式,适合大规模向量检索,生产级稳定,但部署运维成本高。选型原则:数据量<10万用PGVector或Redis,>100万用Milvus,快速验证用Pinecone,开发测试用Chroma。

【面试题】5. BeanOutputConverter在Structured Output中如何使用?有什么常见坑? ​

【标准答案】使用步骤:定义POJO类 -> 创建BeanOutputConverter -> 调用converter.getFormat()获取Schema描述 -> 放入Prompt的systemMessage -> 调用模型 -> 用converter.convert()解析结果为POJO。常见坑:第一,POJO字段名要和模型输出JSON字段一致,注意驼峰下划线;第二,复杂嵌套对象可能解析失败,建议扁平化;第三,模型输出格式不稳定时会抛异常,需要加重试或兜底逻辑;第四,Schema描述要精确,不然模型可能漏字段。

【面试题】6. ChatMemory接口和InMemoryChatMemory的区别?生产环境如何做持久化? ​

【标准答案】ChatMemory是接口,定义了add、get、clear等操作。InMemoryChatMemory是内存实现,默认存储在JVM堆中,重启丢失,只适合开发测试。生产环境持久化方案:第一,继承ChatMemory接口,用Redis存储对话历史,key设计为sessionId:userId;第二,用数据库(MySQL/PostgreSQL)存储Message表,字段包括sessionId、role、content、timestamp;第三,注意对话历史截断策略,避免token超限,可以只保留最近N轮或按token数裁剪。MessageChatMemoryAdvisor负责注入历史消息到Prompt。

【面试题】7. Spring AI的Advisor机制是什么?可以用来做哪些事? ​

【标准答案】Advisor是拦截器模式,可以在调用前、调用后插入自定义逻辑。常见用途:第一,日志审计,记录所有请求和响应;第二,敏感词过滤,拦截输入输出;第三,对话记忆注入,MessageChatMemoryAdvisor就是Advisor实现;第四,指标监控,统计调用次数、延迟、token消耗;第五,限流熔断,在beforeAdvisor中检查阈值。实现方式:继承RequestResponseAdvisor接口,重写adviseRequest和adviseResponse方法,然后注册为Bean,ChatClient会自动应用。注意Advisor有执行顺序,可以用@Order控制。

【面试题】8. Spring AI 1.0相比之前版本有哪些重大更新?为什么推荐升级? ​

【标准答案】核心更新:第一,ChatClient统一入口,替代之前分散的ChatModel调用方式,API更优雅;第二,Advisor架构标准化,拦截器机制完善,扩展性更强;第三,VectorStore接口统一,不同向量库实现更一致;第四,配置前缀统一为spring.ai.,之前是spring.ai.openai.等分散配置;第五,Chat Memory标准化,Advisor方式注入历史消息;第六,Observability集成,内置Micrometer指标。升级理由:代码更简洁,维护成本低,生态兼容性好,新特性都在1.0基础上演进。

【面试题】9. 微服务架构下,API Key如何安全管理?不能硬编码在配置文件中怎么办? ​

【标准答案】绝对不能硬编码。方案:第一,环境变量注入,spring.ai.openai.api-key=${OPENAI_API_KEY},容器或K8s中从Secret读取;第二,配置中心(Nacos、Apollo),API Key加密存储,应用启动时拉取;第三,Vault专门管理密钥,应用通过SDK动态获取;第四,API网关统一代理,下游服务不直接接触Key。生产推荐组合:K8s Secret + Vault,网关层做二次校验。另外要定期轮换Key,配置最小权限,监控异常调用。

【面试题】10. 如何在Spring AI中实现多模型路由?不同场景用不同模型怎么设计? ​

【标准答案】多模型路由方案:第一,配置多个ChatModel Bean,每个对应一个模型实现(OpenAI、Anthropic、Ollama);第二,定义RoutingService,根据场景类型(如"chat"、"code"、"embedding")返回对应ChatClient;第三,在Controller层根据请求参数或Header判断路由;第四,使用Spring Profile,不同环境激活不同模型Bean。代码示例:@Bean("openaiChat")和@Bean("anthropicChat"),然后用@Qualifier注入。进阶方案:结合配置中心动态切换,或用AOP做自适应路由(根据请求负载、模型延迟、成本阈值自动选择)。