Spring AI 面试题库
生成时间:2026-05-21 20:54
【面试题】1. Spring AI 中 ChatClient 和 ChatModel 有什么区别?实际项目中如何选择?
【标准答案】 ChatModel 是底层模型接口,直接对接各厂商API,提供最基础的 chat() 方法,返回结构化的 ChatResponse。ChatClient 是 Spring AI 1.0 引入的高级封装,内置了 Fluent API、Advisor 机制、自动注入系统提示词等功能。
实际项目选型:简单问答场景直接用 ChatModel 就够了,代码更轻量。但如果涉及多轮对话、需要串联 Advisor(如日志、重试、记忆管理)、或者要链式调用多个步骤,ChatClient 能大幅减少样板代码。我们项目用 ChatClient.retrofit() 风格,一行代码搞定 prompt 构建、advisor 绑定和调用,维护成本降低 60% 以上。
【面试题】2. Spring AI 的 Advisor 机制是什么?能解决哪些实际问题?
【标准答案】 Advisor 是 Spring AI 的拦截器模式,在 ChatClient 调用前后织入通用逻辑。核心接口有 aroundCall() 和 aroundStream(),可以修改 Prompt、处理响应、记录日志、实现重试等。
实际应用:我们封装了三个 Advisor——LoggingAdvisor 记录问答日志用于审计,RetryAdvisor 处理 API 限流自动重试,RateLimitAdvisor 控制用户调用频率。配置时通过 ChatClient.builder().defaultAdvisors(...) 全局生效,业务代码零感知。相比在每处调用写 try-catch,Advisor 让代码更干净,也便于统一治理。
【面试题】3. RAG 架构中 TokenTextSplitter 如何配置才能既保证语义完整又不浪费 Token?
【标准答案】 TokenTextSplitter 核心参数有三个:chunkSize(分块大小)、chunkOverlap(重叠区间)、encoderName(分词器类型)。配置原则:chunkSize 根据模型上下文窗口和检索精度平衡,一般 500-1000 token;chunkOverlap 建议 10%-20% 的 chunkSize,保证跨块语义不断裂;encoderName 必须和嵌入模型一致,比如用 OpenAI 的 text-embedding-ada-002 就要配 cl100k_base 编码器。
我们踩过的坑:一开始用默认配置,切分后知识库召回率只有 65%,后来针对技术文档调整 chunkSize=800、overlap=150,召回率提升到 89%。另外要注意中文文档建议用专门的中文分词器或降低 chunkSize,否则语义边界容易断裂。
【面试题】4. Spring AI 对接多个模型厂商时,如何实现平滑切换和统一管理?
【标准答案】 Spring AI 通过 spring.ai.* 配置前缀 + 条件注入实现多模型管理。核心方案有两种:
第一种是 Properties 多配置,application.yml 里配 spring.ai.openai.api-key 和 spring.ai.anthropic.api-key,用 @Qualifier 注入对应的 ChatModel。第二种是动态切换,通过 ChatClient.Builder 在运行时指定 ChatModel,或者封装一个 ModelRouter 根据场景路由。
我们生产环境用 ModelRouter 模式:高优先级问题走 GPT-4,普通问答走通义千问降成本,Ollama 部署本地模型处理隐私敏感数据。通过配置中心动态调整路由策略,API 调用成本降低 40%,同时保证了核心业务的高质量响应。
【面试题】5. Function Calling 中 @Bean 注册函数和 JSON Schema 自动生成的原理是什么?
【标准答案】 Spring AI 的 Function Calling 底层是函数式接口 + 反射 + JSON Schema 生成三步走。@Bean 注册函数时,框架会扫描函数的入参类型,通过 Jackson 的 JSON Schema 生成器自动推导参数结构,然后封装成 tool 定义发给模型。
模型返回 tool_call 后,Spring AI 根据函数名从 ApplicationContext 查找对应 Bean,用 Jackson 反序列化参数,反射调用方法,最后把返回值再序列化回模型。
实战建议:函数参数对象必须有无参构造器和清晰的字段命名,框架依赖这些生成 Schema。复杂对象建议加 @Schema(description="...") 注解帮助模型理解。我们有个函数因为字段命名不规范导致模型传参失败,加了注解后成功率从 72% 提升到 98%。
【面试题】6. VectorStore 选型时 PGVector、Redis、Milvus 各有什么优劣?生产环境如何决策?
【标准答案】 PGVector 优势是运维成本低,复用现有 PostgreSQL 实例,支持 ACID 事务,适合中小规模(百万级向量)且对实时性要求不高的场景。劣势是性能和扩展性一般,大规模数据检索延迟明显上升。
Redis Search 优势是极致性能,毫秒级延迟,适合缓存热点向量或高频查询场景。劣势是持久化和扩展性弱,不适合大规模知识库。
Milvus 优势是专业向量数据库,支持十亿级向量、分布式部署、多种索引类型(IVF/HNSW),适合大规模生产环境。劣势是运维复杂度高,需要独立部署集群。
我们决策逻辑:POC 阶段用 PGVector 零成本验证,日活百万以下用 Redis 缓存 + PGVector 持久化,百万以上知识库上 Milvus。关键是要预留迁移路径,Spring AI 的 VectorStore 接口统一,切换实现只需改配置和依赖。
【面试题】7. Chat Memory 在多轮对话中如何保证上下文连贯又不撑爆 Token 限制?
【标准答案】 Spring AI 的 ChatMemory 接口提供 add() 和 get() 方法,配合 MessageChatMemoryAdvisor 自动注入历史消息。但核心挑战是 Token 上限,解决方案有三层:
第一层是窗口截断,MessageChatMemoryAdvisor 配置 conversationHistorySize 只保留最近 N 条消息,我们一般配 10-15 条。第二层是摘要压缩,定期用模型总结历史对话,把摘要作为系统提示词注入,Token 占用从几千降到几百。第三层是混合策略,核心实体和决策点保留原文,中间过程只保留摘要。
我们实现了 InMemoryChatMemory 的持久化扩展,用 Redis 存储 conversationId 到消息列表的映射,支持跨会话恢复。生产环境配置 10 轮窗口 + 每 5 轮触发一次摘要,平均上下文 Token 从 3500 降到 800,响应速度提升 35%。
【面试题】8. Structured Output 用 BeanOutputConverter 时有哪些常见坑?如何避免?
【标准答案】 BeanOutputConverter 核心原理是先生成 JSON Schema,让模型按 Schema 输出,再用 Jackson 反序列化成 POJO。常见坑有三个:
第一是 Schema 生成失败。POJO 字段类型不支持(如 LocalDateTime)或缺少无参构造器,解决方案是用简单类型 + 自定义序列化器,或加 @JsonIgnore 排除。
第二是模型输出不合规。复杂嵌套结构或枚举字段,模型容易漏填或格式错误。解决方案是 Schema 里加必填标记和 description 描述,我们还在 prompt 里显式强调"必须严格按 Schema 输出 JSON,不要添加注释"。
第三是反序列化失败。模型多输出了字段(如 thinking 过程),Jackson 默认严格模式会报错。解决方案是配置 ObjectMapper.disable(FAIL_ON_UNKNOWN_PROPERTIES)。
我们封装了一个 StructuredOutputHelper 工具类,统一处理这些边界情况,结构化输出成功率从 85% 提升到 99.2%。
【面试题】9. Spring AI 微服务架构中如何管理 API Key 安全、实现限流熔断?
【标准答案】 API Key 管理必须遵循三个原则:一是不硬编码,通过 Vault 或配置中心加密存储,运行时注入;二是不暴露,前端请求先走网关鉴权,网关再带 API Key 调模型服务;三是可轮换,支持热更新不重启服务。
限流熔断我们用 Resilience4j + Micrometer 方案。Ratelimiter 配置每秒最大请求数和等待队列,Circuitbreaker 配置失败率阈值和熔断时长。ChatClient 调用时通过 Advisor 包装,限流超时返回降级提示,熔断触发后直接走本地模型兜底。
监控指标方面,Spring AI 集成了 Micrometer,配置 management.endpoints.web.exposure.include=prometheus 后,可以在 Grafana 里看 ai.model.latency、ai.model.tokens、ai.model.errors 等指标。我们设了 P99 延迟 >3s 或错误率 >5% 自动告警,每月 P0 事故降到 0。
【面试题】10. Spring AI 1.0 正式版相比之前的 Milestone 版本有哪些重大变化?迁移时要注意什么?
【标准答案】 Spring AI 1.0 正式版最大变化是 API 统一和架构成熟:
第一是 ChatClient 成为统一入口,之前 OpenAiChatClient、OllamaChatClient 分散实现,现在都通过 ChatClient.builder() 统一创建,切换模型只需注入不同 ChatModel Bean。
第二是 Advisor 架构稳定,之前是实验性功能,1.0 后接口固定,支持自定义拦截器链,迁移时要把老版本的拦截逻辑改成 Advisor 实现。
第三是 VectorStore 接口统一,之前各向量库方法签名不一致,1.0 后统一了 add()、delete()、similaritySearch() 等核心方法,迁移时要检查自定义扩展是否兼容。
第四是配置前缀统一为 spring.ai.*,之前 openai.api-key 要改成 spring.ai.openai.api-key,application.yml 要全局替换。
我们迁移花了 3 天,核心工作是配置项对齐、Advisor 重写、Bean 名称调整。建议迁移前跑一遍官方 Compatibility Report,逐项核对 Breaking Changes,能少踩很多坑。