Spring AI 面试题库(2026-05-21 20:44)
本轮 Spring AI 面试题库(带答案)
【面试题】1. Spring AI中ChatClient和ChatModel有什么区别?什么时候用哪个?
【标准答案】 ChatModel是底层模型抽象,直接对接各种AI模型的API调用;ChatClient是Spring AI 1.0引入的统一高阶入口,内置了Prompt模板、Advisor链、Memory等增强能力。
简单说:ChatModel是"裸模型调用",ChatClient是"带装备的模型客户端"。
实际项目中90%场景用ChatClient就够了,因为它帮你封装好了记忆、工具调用、RAG等常用能力。只有当你需要极度精细化控制模型参数或直接对接自定义模型时才考虑直接用ChatModel。
代码层面:ChatModel.chat(prompt)直接返回,ChatClient.prompt().user("问题").call().content()走的是流畅API链。
【面试题】2. Spring AI的Advisor机制是什么?能解决什么问题?
【标准答案】 Advisor是Spring AI的拦截器链机制,类似于Spring MVC的HandlerInterceptor或WebFilter。
它能在请求到达模型前后插入自定义逻辑,比如:加系统提示词、注入对话历史、RAG检索、日志埋点、限流熔断等。
典型用法:
- MessageChatMemoryAdvisor - 自动注入历史对话
- QuestionAnswerAdvisor - RAG自动检索相关文档
- 自定义Advisor - 比如加权限校验、敏感词过滤
架构优势是解耦:业务逻辑和AI调用逻辑分离,Advisor可插拔组合。一个ChatClient可以配置多个Advisor,按顺序执行,非常灵活。
【面试题】3. RAG中的TokenTextSplitter怎么用?切分策略有哪些坑?
【标准答案】 TokenTextSplitter是把长文档切成适合向量化的文本块,因为Embedding模型有token长度限制(比如text-embedding-ada-002上限8191 tokens)。
核心参数:
- chunkSize - 每块最大token数
- chunkOverlap - 块间重叠token数(关键!避免语义断裂)
- keepSeparator - 是否保留段落分隔符
常见坑:
- overlap设太小 → 跨块语义丢失,比如表格被切断、代码段截断
- chunkSize设太大 → 检索精度下降,召回到无关内容
- 按字符切而不是按token切 → 实际token数可能翻倍导致API报错
推荐配置:chunkSize=800,overlap=200,中文文档按段落切,代码按函数切。复杂场景用RecursiveCharacterTextSplitter或自定义切分器。
【面试题】4. Spring AI中Function Calling怎么实现?@Bean注册函数的原理是什么?
【标准答案】 Spring AI通过@Bean注解自动注册函数,原理是:
- Spring扫描所有@Bean方法,提取方法签名、参数、返回值类型
- 自动生成JSON Schema描述(参数名、类型、描述)
- 注册到ChatClient的tool registry中
- 模型返回tool_call时,Spring AI自动反序列化参数并调用函数
代码示例:
@Bean
public Function<WeatherRequest, WeatherResponse> getWeather() {
return request -> weatherService.query(request.city());
}调用时:chatClient.prompt().user("北京天气").functions("getWeather").call()
关键点:
- 函数名就是bean名
- 参数对象自动生成Schema
- 返回值会被序列化回传给模型
- 一个ChatClient可注册多个函数,模型自己决定调哪个
【面试题】5. ChatMemory持久化方案有哪些?生产环境怎么选?
【标准答案】 Spring AI提供InMemoryChatMemory作为开箱即用方案,但仅适合单机、会话少的场景。
生产环境推荐方案:
- Redis - 最常见,TTL自动过期,支持分布式,适合短会话
- 数据库 - PostgreSQL/MySQL存储,适合需要长期归档、审计的场景
- MongoDB - 文档结构灵活,适合对话结构复杂的场景
- 向量库 - 部分向量库支持元数据存储,可复用基础设施
实现方式:实现ChatMemory接口,重写add()和get()方法,底层对接你的存储。
注意点:
- 要设计会话隔离(conversationId作为key前缀)
- 要考虑过期清理(避免无限膨胀)
- 要考虑并发(同一会话并发请求时消息顺序)
- 要考虑序列化成本(长对话序列化/反序列化开销)
【面试题】6. VectorStore接口统一后,PGVector和Pinecone选哪个?
【标准答案】 Spring AI 1.0统一了VectorStore接口,切换只需改配置,代码零改动。
选型依据: PGVector:
- 优势:复用现有PostgreSQL,运维成本低,支持混合查询(向量+结构化)
- 劣势:大规模向量性能不如专业向量库
- 适合:中小规模(百万级)、已有PG架构、需要复杂查询
Pinecone:
- 优势:全托管、性能强、自动扩缩容、高可用
- 劣势:成本高、数据出境问题、被厂商锁定
- 适合:大规模(亿级)、纯向量检索、不差钱
其他选项:
- Milvus - 开源、性能强、自建成本可控,适合大规模私有化部署
- Chroma - 轻量级、本地开发友好,适合原型和中小项目
- Redis - 新版本支持向量,适合已有Redis栈、中小规模
我的建议:初创项目用Chroma或PGVector快速验证,量上来后切Milvus,不差钱直接Pinecone。
【面试题】7. BeanOutputConverter实现结构化输出的原理和坑?
【标准答案】 BeanOutputConverter是Spring AI的结构化输出转换器,原理:
- 你定义一个POJO类
- BeanOutputConverter生成JSON Schema约束
- 把Schema塞到系统提示词中,要求模型按格式输出
- 解析模型返回的JSON,映射到POJO
使用方式:
var converter = new BeanOutputConverter<>(MyEntity.class);
var format = converter.getFormat(); // 生成Schema提示词
var result = chatClient.prompt().user(prompt + format).call().content();
MyEntity entity = converter.parse(result);常见坑:
- 模型输出不符合Schema - 特别是弱模型,加few-shot示例提高成功率
- 嵌套对象解析失败 - 复杂POJO建议拆平或用List<Map>
- 字段名不匹配 - 用@JsonProperty注解映射JSON字段
- 必填字段缺失 - 模型可能漏输出,建议加默认值或@NotNull校验
Spring AI 1.0还提供了entity()方法更简洁:chatClient.prompt().user("...").call().entity(MyEntity.class)
【面试题】8. 多模型切换的spring.ai.*配置怎么设计?
【标准答案】 Spring AI用spring.ai.*前缀统一配置,切换模型只需改配置文件。
配置结构:
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
chat:
options:
model: gpt-4o
temperature: 0.7
anthropic:
api-key: ${ANTHROPIC_API_KEY}
chat:
options:
model: claude-3-5-sonnet-20241022
ollama:
base-url: http://localhost:11434
chat:
options:
model: llama3.2切换方式:
- 配置切换 - spring.ai.openai.chat.options.model换模型名
- 多模型注入 - 注入多个ChatModel,代码中按需选择
@Autowired @Qualifier("openaiChatModel") ChatModel openai;
@Autowired @Qualifier("ollamaChatModel") ChatModel ollama;- 动态路由 - 根据请求特征(用户等级、任务类型)路由到不同模型
生产建议:敏感任务用闭源大模型(GPT-4/Claude),批量任务用开源模型(Ollama/智谱)降成本。
【面试题】9. Spring AI微服务架构中,API Key和限流怎么设计?
【标准答案】 API Key管理:
- 不硬编码 - 用环境变量或Vault/Spring Cloud Config管理
- 不透传 - API Gateway统一管理,后端服务不直接拿Key
- Key轮换 - 支持多Key轮换、自动熔断失效Key
- 按租户隔离 - 不同租户用不同Key,配额隔离
限流熔断:
- 应用层 - Spring AI的Advisor中埋点,记录调用次数、token消耗
- 网关层 - Gateway/Sentinel限流,按用户/IP/租户粒度
- SDK层 - Resilience4j熔断,模型API超时或错误率超阈值自动降级
示例配置:
@Bean
public ChatClient chatClient(ChatModel model) {
return ChatClient.builder(model)
.defaultAdvisors(new RateLimitAdvisor(rateLimiter))
.build();
}监控:Micrometer埋点,Grafana看QPS、延迟、token消耗、错误率。设告警阈值。
【面试题】10. Spring AI 1.0相比之前版本有哪些重大更新?
【标准答案】 Spring AI 1.0是里程碑版本,核心更新:
ChatClient统一入口 - 之前ChatModel、PromptTemplate散落各处,现在ChatClient.prompt().user().call()一条链搞定,流畅API更优雅
Advisor架构 - 之前功能硬编码,现在可插拔组合,MessageChatMemoryAdvisor、QuestionAnswerAdvisor开箱即用,自定义也简单
VectorStore接口统一 - 之前各向量库API不统一,现在一个接口,切换改配置就行
spring.ai.*配置前缀 - 之前配置散乱,现在统一前缀,多模型配置清晰
Structured Output增强 - entity()方法一行搞定,不再手动写Converter
Observability集成 - Micrometer监控开箱即用,指标、链路追踪齐全
多模态支持 - 图片、音频输入输出统一抽象
MCP支持 - Model Context Protocol,让AI调用外部工具更标准化
升级建议:老项目逐步迁移,新项目直接用ChatClient API,Advisor优先用官方提供的,少自己造轮子。