Spring AI 面试题库
生成时间:2026-05-23 16:17
【面试题】1. Spring AI中ChatModel和ChatClient有什么区别?实际开发中该怎么选?
【标准答案】
这两个都是调用大模型的核心接口,定位不同。
ChatModel是底层抽象,直接对应一个具体的模型实例,比如OpenAI的gpt-4、Anthropic的claude-3。它是"一个模型一个Bean"的概念。你调用它的call方法,就是直接跟这个模型对话,简单直接。
ChatClient是Spring AI 1.0推荐的统一入口,是Fluent API风格。它内部封装了ChatModel,但加了更多能力:Advisor链、ChatMemory、工具调用等。代码写起来更优雅,像builder模式一样链式调用。
实际选型:简单场景用ChatModel足够,一行代码搞定;复杂场景(需要对话记忆、工具调用、RAG)用ChatClient,架构更清晰。我的习惯是新项目统一用ChatClient,省得后期重构。
【面试题】2. Spring AI的Advisor机制是什么?有什么实际用途?
【标准答案】
Advisor是Spring AI的拦截器模式,作用类似Spring MVC的HandlerInterceptor。
核心思路:每次对话前后插入自定义逻辑。比如:
- MessageChatMemoryAdvisor:对话前从内存加载历史消息,对话后保存新消息
- QuestionAnswerAdvisor:对话前检索向量库,把相关文档塞进Prompt
- 自定义Advisor:加日志、限流、敏感词过滤
链式执行,顺序可控。我在项目里做过一个Advisor,对话前先调风控接口,拦截敏感问题,避免模型乱回。
使用方式:ChatClient.prompt().advisors(advisor1, advisor2).call(),配置简单,职责解耦。
【面试题】3. 如何用Spring AI实现一个完整的RAG流程?关键步骤有哪些?
【标准答案】
RAG = 检索增强生成,核心是让模型"先查资料再回答"。
完整流程四步:
- 文档切分:TokenTextSplitter把长文档切成小块,参数设置chunkSize和overlap,避免语义断裂
- 向量化存储:EmbeddingModel把文本转成向量,存进VectorStore(PGVector、Milvus等)
- 相似度检索:用户提问时,用vectorStore.similaritySearch(queryEmbedding, k)找出最相关的k条文档
- 增强生成:把检索结果拼进Prompt,让模型基于资料回答
Spring AI的实现很简单:
ChatClient.builder(chatModel)
.defaultAdvisors(new QuestionAnswerAdvisor(vectorStore))
.build()
.prompt()
.user(question)
.call();QuestionAnswerAdvisor自动完成步骤3和4,一行代码搞定RAG。
关键点:chunk大小影响检索精度,overlap防止语义截断;向量库选型看数据量,小项目PGVector够用,大规模上Milvus。
【面试题】4. Spring AI支持哪些VectorStore?选型时怎么考虑?
【标准答案】
主流的有这些:
- PGVector:基于PostgreSQL,部署简单,适合中小规模,已有PG的项目直接复用
- Redis:内存级速度,支持向量+结构化混合查询,适合实时性要求高的场景
- Milvus:分布式架构,支持十亿级向量,高性能,适合生产级大规模应用
- Chroma:轻量级,适合开发测试,生产环境不推荐
- Pinecone:全托管服务,免运维,但海外服务,合规项目慎用
选型考虑三个维度:
- 数据量:<百万级PGVector或Redis,>百万级考虑Milvus
- 运维成本:有运维团队可自建,没有选Pinecone或云服务
- 查询复杂度:纯向量检索都行,需要混合过滤(向量+metadata)优先Redis或Milvus
我的经验:POC阶段用Chroma快速验证,生产上用PGVector(数据量可控)或Milvus(大规模),合规项目不碰海外云服务。
【面试题】5. Spring AI的Function Calling怎么实现?整个流程是怎样的?
【标准答案】
Function Calling让模型能够"调用工具",比如查天气、调数据库、调API。
实现步骤:
- 定义函数:写一个普通方法,加@Bean注解注册到Spring容器
@Bean
public Function<Request, Response> weatherTool() {
return request -> weatherService.query(request.city());
}自动注册:Spring AI扫描@Bean函数,自动生成JSON Schema,包含参数类型、描述、必填项
调用流程:
- 用户提问"北京天气"
- 模型返回tool_call(函数名+参数)
- Spring AI自动执行函数
- 函数结果返回给模型
- 模型生成最终回答
整个过程是自动的,开发者只需定义函数,Spring AI搞定调度。关键点:函数签名要清晰,参数类加@Description注解,模型才能准确传参。
【面试题】6. BeanOutputConverter怎么用?有什么常见坑?
【标准答案】
BeanOutputConverter用于把模型输出转成Java对象,底层是JSON Schema约束。
使用方式:
BeanOutputConverter<User> converter = new BeanOutputConverter<>(User.class);
String schema = converter.getFormat(); // 生成JSON Schema
String response = chatModel.call(prompt);
User user = converter.convert(response); // 解析成对象更简单的是用entity():
User user = chatClient.prompt()
.user("提取用户信息:张三,25岁")
.call()
.entity(User.class);常见坑:
- Schema太复杂模型不遵守:嵌套层级深的对象容易解析失败,建议扁平化设计
- 字段命名不一致:JSON的snake_case和Java的camelCase不匹配,加@JsonProperty注解
- 必填字段缺失:模型可能漏字段,实体类字段尽量给默认值或用Optional
- 数组解析失败:List字段容易出问题,Schema里要明确定义items类型
经验:简单对象用BeanOutputConverter,复杂嵌套对象建议先让模型返回JSON字符串,再用Jackson手动解析,更可控。
【面试题】7. Spring AI的ChatMemory怎么实现对话记忆?生产环境怎么持久化?
【标准答案】
ChatMemory是对话历史的存储接口,实现类有:
- InMemoryChatMemory:内存存储,重启丢失,适合开发测试
- 自定义持久化:实现ChatMemory接口,对接数据库或Redis
使用方式:
ChatMemory memory = new InMemoryChatMemory();
MessageChatMemoryAdvisor advisor = new MessageChatMemoryAdvisor(memory);
chatClient.prompt()
.advisors(advisor)
.user("你好")
.call();MessageChatMemoryAdvisor自动管理历史消息,每次对话前加载,对话后保存。
生产持久化方案:
- Redis存储:每个会话一个key,设置TTL自动过期,适合高并发
- 数据库存储:设计conversation_id、message_id、role、content表结构,支持查询审计
- 混合方案:热点会话放Redis,历史归档到数据库
关键点:对话历史不能无限增长,设置maxHistorySize限制条数,避免token超限。我的做法是保留最近20轮,更早的定期压缩或删除。
【面试题】8. Spring AI如何实现多模型路由?配置上要注意什么?
【标准答案】
多模型路由是实际项目的刚需,比如:GPT-4处理复杂推理,Claude处理长文本,本地Ollama处理敏感数据。
实现方式:
- 配置多个ChatModel Bean:
@Bean
ChatModel openai() { return new OpenAiChatModel(openaiConfig); }
@Bean
ChatModel ollama() { return new OllamaChatModel(ollamaConfig); }- 路由策略:
- 按业务路由:不同Controller注入不同ChatModel
- 按负载路由:自定义Router根据压力选择模型
- 按能力路由:复杂问题走GPT-4,简单问题走便宜模型
配置注意:
spring.ai.*前缀:Spring AI 1.0统一用这个前缀,不同模型用不同namespace:
- spring.ai.openai.api-key
- spring.ai.ollama.base-url
- spring.ai.anthropic.api-key
动态切换:不要写死模型名,用配置中心或数据库管理,方便热切换
Fallback机制:主模型挂了自动切备用模型,用Resilience4j实现熔断降级
【面试题】9. Spring AI 1.0相比之前有哪些重要更新?迁移时要注意什么?
【标准答案】
Spring AI 1.0是正式版,架构和API都有大调整。
核心更新:
- ChatClient统一入口:之前ChatModel直接用,现在推荐ChatClient,Fluent API更优雅
- Advisor架构:之前是零散的拦截逻辑,现在统一成Advisor链,扩展性更强
- VectorStore接口统一:不同向量库实现统一接口,切换成本低
- spring.ai.*配置前缀:配置规范化,之前是spring.ai.openai.key,现在统一spring.ai.openai.api-key
- Observability内置:集成Micrometer,开箱即用的监控指标
迁移注意:
- API变化:ChatModel.call(prompt)还能用,但推荐迁移到ChatClient
- 配置调整:检查application.yml,把老配置改成新前缀
- 依赖升级:spring-ai-core版本号从0.x改到1.0.0
- 测试覆盖:API改动较多,迁移后务必跑全量测试
我的建议:新项目直接上1.0,老项目逐步迁移,先升级依赖+改配置,API迁移分批进行。
【面试题】10. Spring AI生产环境怎么做监控和故障排查?
【标准答案】
生产环境监控分三层:
1. 基础指标(Micrometer):
- 请求量、成功率、响应时间(P50/P95/P99)
- 模型调用耗时、Token消耗统计
- VectorStore检索延迟
Spring AI 1.0内置支持,只需:
management:
endpoints:
web:
exposure:
include: prometheus,health2. 日志追踪:
- 每次对话记录request_id,关联用户、模型、耗时、Token数
- Advisor链路日志,定位是哪个环节出问题
- 错误日志要包含原始Prompt,方便复现
3. 告警机制:
- 模型调用失败率>5%告警
- 响应时间>P95阈值持续5分钟告警
- Token消耗异常增长告警(可能是被刷)
常见故障排查:
- 模型超时:检查网络、调整超时配置、加降级策略
- Token超限:压缩Prompt、限制历史消息条数、换长上下文模型
- 向量检索慢:检查向量库索引、增加副本数、优化查询参数
- 内存泄漏:ChatMemory未清理、长会话堆积,定期清理过期会话
经验:上线前先压测摸清瓶颈,生产上留足buffer,模型服务不稳定时要能快速切备用。