Spring AI 面试题库(2026-05-21 23:28)
【面试题】1. Spring AI中ChatClient和ChatModel的核心区别是什么?实际项目如何选择?
【标准答案】 ChatModel是底层模型接口,直接对接各个AI供应商(OpenAI、Anthropic等),提供基础的chat能力。ChatClient是Spring AI 1.0推出的统一入口,在ChatModel之上封装了Fluent API、Advisor机制、对话记忆等高级特性。
实际选择很简单:
- 直接用ChatClient:绝大多数业务场景,需要对话记忆、工具调用、Prompt模板等高级功能时
- 直接用ChatModel:只需要裸模型调用、性能敏感、或者需要更底层控制的场景
简单说:ChatClient是Spring AI推荐的"标准姿势",ChatModel是给高级玩家的"底座"。
【面试题】2. Spring AI的Advisor机制是什么?在RAG场景中如何应用?
【标准答案】 Advisor是Spring AI 1.0引入的拦截器机制,允许在请求发送到模型前后插入自定义逻辑,类似于Spring MVC的Interceptor或AOP。
在RAG场景中的典型应用:
- QuestionAnswerAdvisor:自动执行向量检索,将相关文档注入Prompt
- 自定义检索Advisor:在请求前做Query改写、关键词提取
- 后处理Advisor:对模型输出做合规过滤、格式校验
核心优势是把横切关注点(检索、记忆、日志)从业务代码中剥离,实现可插拔的架构设计。面试时强调:Advisor让RAG从"硬编码流程"变成"可配置管道",符合Spring的设计哲学。
【面试题】3. Spring AI的TokenTextSplitter有哪些参数?生产环境如何调优?
【标准答案】 核心参数:
- chunkSize:单个文本块的最大token数(默认800)
- chunkOverlap:相邻块的token重叠数(默认100)
- keepSeparator:是否保留分隔符(如段落、标题)
生产调优策略:
- 根据模型上下文窗口调整:GPT-4可用更大chunk(1500-2000),小模型用800-1000
- 重叠率10-15%为宜:太小丢失上下文,太大增加存储和检索成本
- 保留语义分隔符:按段落、章节切分比硬切效果好
- 监控召回率:向量检索命中率低时,适当增大overlap或降低chunkSize
面试加分点:提到可以自定义Splitter,比如按Markdown标题层级切分,或者结合语义相似度做动态切分。
【面试题】4. Spring AI的Function Calling中,JSON Schema是如何自动生成的?有哪些坑?
【标准答案】 Spring AI通过反射读取@Bean注册的函数,提取参数类型和泛型信息,然后自动生成符合OpenAI规范的JSON Schema。
主要坑点:
- 复杂嵌套类型支持有限:List<Map<String, Object>>这种复杂结构可能生成失败,建议定义明确的POJO
- Optional类型处理:Spring AI默认将Optional视为可选参数,但某些模型(如智谱)对optional支持不一致
- 枚举类型:需要用@Schema注解显式声明allowedValues
- 默认值丢失:Java的默认参数无法映射到Schema,需用@Schema(defaultValue="xxx")补充
- 递归引用:自引用类型会导致死循环,需用@Schema(ref)手动处理
面试时强调:简单参数用基本类型+String,复杂入参定义DTO,遇到问题先看生成的Schema是否符合预期。
【面试题】5. Spring AI的VectorStore接口支持哪些实现?PGVector和Redis的选型依据是什么?
【标准答案】 官方支持:PGVector、Redis、Pinecone、Chroma、Milvus、Weaviate、Qdrant、Oracle AI等。
PGVector vs Redis选型:
PGVector优势:
- 已有PostgreSQL基础设施直接复用,运维成本低
- 支持事务,向量数据和业务数据可在同一事务中操作
- 生态成熟,pgvector扩展持续迭代
- 适合中小规模(百万级向量)、混合查询场景(SQL+向量)
Redis优势:
- 内存存储,检索性能更高(毫秒级)
- 天然支持缓存语义,适合实时性要求高的场景
- 分布式架构易扩展
- 适合高频查询、对延迟敏感的场景
面试总结:已有PG用PGVector,追求性能用Redis/Milvus,云上直接用Pinecone。
【面试题】6. Spring AI的ChatMemory持久化方案有哪些?生产环境推荐怎么做?
【标准答案】 内置实现:InMemoryChatMemory(内存存储,重启丢失)
生产推荐方案:
- Redis持久化:利用Redis的Hash结构存储对话历史,支持TTL自动过期,适合分布式部署
- 关系型数据库:设计conversation_id、message_order、role、content字段,支持复杂查询和审计
- 分布式缓存:如Caffeine本地缓存 + Redis二级缓存,平衡性能和可靠性
核心要点:
- 分区存储:按conversation_id分组,避免单个会话过大
- 滑动窗口策略:只保留最近N轮对话,避免token超限
- 异步持久化:先写内存再异步落库,避免阻塞主流程
- 过期策略:设置会话TTL,自动清理僵尸对话
面试加分:提到可以结合MessageChatMemoryAdvisor实现自动注入历史,无需业务代码感知。
【面试题】7. Spring AI项目中如何管理多模型切换?配置如何外部化?
【标准答案】 多模型管理策略:
- 配置切换:通过spring.ai.openai.api-key、spring.ai.anthropic.api-key等前缀区分,配合spring.profiles.active激活不同配置
- 动态路由:在代码中注入多个ChatModel Bean,根据业务条件选择:java
@Bean ChatClient openaiClient(OpenAiChatModel model) { ... } @Bean ChatClient anthropicClient(AnthropicChatModel model) { ... } - 配置外部化:API Key、Base URL、Model Name全部放到application-{env}.yml或配置中心(Nacos/Apollo)
生产实践:
- 敏感信息加密:API Key用Jasypt加密,避免明文提交Git
- 动态切换:结合配置中心实现灰度发布、AB测试
- 故障转移:主模型不可用时自动fallback到备选模型
面试强调:Spring AI的spring.ai.*配置前缀是1.0统一规范,各供应商遵循相同模式,易于切换和扩展。
【面试题】8. Spring AI的Structured Output(BeanOutputConverter)如何保证输出符合POJO定义?有哪些常见失败场景?
【标准答案】 BeanOutputConverter通过将POJO的JSON Schema注入到Prompt中,约束模型输出格式,然后解析JSON映射到对象。
保证机制:
- Schema注入:自动生成符合POJO定义的JSON Schema,作为Prompt的一部分
- 格式约束:Prompt中明确要求"输出必须严格符合以下JSON格式"
- 解析校验:解析失败时抛出异常,触发重试或降级
常见失败场景:
- 模型不遵循指令:小模型、中文场景容易输出额外解释文本
- 字段类型不匹配:期望Integer模型返回了带引号的字符串
- 必填字段缺失:模型跳过了某些字段,导致解析失败
- 嵌套对象问题:复杂嵌套结构的Schema描述可能不准确
- 枚举值越界:模型输出了Schema中未定义的枚举值
应对策略:
- 使用entity()方法替代手动Converter
- 在Prompt中增加Few-shot示例
- 对关键场景增加重试机制
- 选择指令遵循能力强的模型(如GPT-4)
【面试题】9. Spring AI项目在生产环境中如何做Observability(可观测性)?
【标准答案】 核心监控维度:
- 指标监控(Metrics):集成Micrometer,监控调用次数、延迟分布、Token消耗、错误率等
- 链路追踪(Tracing):集成Micrometer Tracing + Zipkin/Jaeger,追踪一次对话的完整链路(检索→Prompt组装→模型调用→后处理)
- 日志审计:记录每次对话的输入输出、Token消耗、耗时、模型版本
- 告警机制:调用失败率、延迟P99、Token成本超阈值时触发告警
关键实践:
- 自定义Metrics:用@Timed、@Counted注解,或手动埋点监控业务指标
- 成本监控:累计Token消耗、按用户/场景分组统计,防止成本失控
- 向量库监控:检索延迟、召回数量、索引大小等专用指标
- 健康检查:暴露/actuator/health,包含各AI模型的连通性检查
面试强调:Spring AI天然集成Spring Boot Actuator和Micrometer,开箱即用,无需额外接入成本。
【面试题】10. Spring AI 1.0正式版相比之前的Milestone版本有哪些核心变化?升级时需要注意什么?
【标准答案】 核心变化:
- ChatClient统一入口:替代之前的PromptTemplate手动组装方式,Fluent API更简洁
- Advisor架构:新增拦截器机制,对话记忆、RAG检索等变成可插拔的Advisor
- VectorStore接口统一:各向量库实现遵循统一接口,切换成本低
- 配置前缀规范化:统一为spring.ai.{provider}.*格式,如spring.ai.openai.api-key
- 包名重构:从experimental包迁移到稳定包,部分API命名调整
升级注意点:
- API变化:ChatClient用法不同于旧的PromptTemplate,需重写调用逻辑
- 依赖更新:spring-ai-core、spring-ai-openai等版本号更新,排除旧依赖
- 配置迁移:spring.ai.*前缀替换旧的配置格式,需检查application.yml
- 向量库驱动更新:各VectorStore实现依赖版本变化,注意兼容性
- 测试覆盖:Advisor机制改变了调用链路,需补充单元测试
面试总结:1.0版本标志着Spring AI从实验性质走向生产就绪,API稳定性大幅提升,是企业级AI应用的首选框架。. **配置迁移