本轮 Spring AI 面试题库(带答案)
生成时间:2026-05-24 20:04
【面试题】1. Spring AI的ChatClient和直接用ChatModel有什么区别?为什么要统一到ChatClient?
【标准答案】 ChatModel是底层模型调用接口,只负责发请求拿响应。ChatClient是上层统一入口,加了三个关键能力:一是Fluent API,链式调用更清晰;二是Advisor机制,可以插拔式扩展比如加记忆、加RAG、加日志;三是统一的请求响应抽象,屏蔽不同模型差异。实际项目里我们都是用ChatClient,因为它是Spring AI 1.0推荐的正式入口,后续生态都会围绕它建设。简单说,ChatModel是引擎,ChatClient是方向盘+仪表盘。
【面试题】2. RAG里的TokenTextSplitter切分策略有哪些坑?怎么设置chunk size和overlap?
【标准答案】 最大坑是切分把语义完整性破坏了,比如把一句话切成两半,检索时匹配不到。策略上:第一,chunk size不能太大,超过embedding模型上下文会截断,一般512-1024 tokens;第二,overlap必须有,我设10-20%,保证边界内容能被两边都检索到;第三,按段落或章节切比按token切效果好,可以先用\n\n分隔再按token切;第四,中文场景要注意tokenizer,有些模型用字有些用词。我之前踩过overlap=0的坑,召回率直接掉20%。
【面试题】3. VectorStore选型时,PGVector、Redis、Pinecone各自适合什么场景?
【标准答案】 PGVector:适合已有PostgreSQL基础设施的团队,运维成本低,但性能一般,亿级向量会吃力,适合中小规模内部系统。Redis:适合对延迟敏感的场景,内存查询快,但数据持久化要配置好,适合实时性要求高的推荐系统。Pinecone:托管服务,省心,性能强,但贵,而且数据在云端,适合创业公司快速上线或对运维零投入的团队。我自己的经验:内部知识库用PGVector,在线客服用Redis,外包项目直接Pinecone省事。
【面试题】4. Function Calling里,@Bean注册的函数是怎么被LLM发现的?JSON Schema是怎么生成的?
【标准答案】 Spring AI启动时会扫描所有@Bean标记的Function类型,提取函数名、入参类型、返回类型。然后通过Jackson的JSON Schema生成器,把入参Java类转成JSON Schema,包括字段名、类型、required等约束。这个Schema会作为tool定义发给模型。模型返回tool_call时,Spring AI自动反序列化参数,调用对应函数,再把结果序列化返回。关键是入参类要写清楚字段类型和注释,Schema生成质量直接影响模型调用成功率。
【面试题】5. Structured Output用BeanOutputConverter时,模型返回格式不对怎么办?
【标准答案】 常见三种情况:第一,模型返回了额外字段或缺少字段,要加@JsonIgnore和required配置,或者在prompt里明确约束;第二,嵌套对象解析失败,要检查内部类的Schema是否正确生成,必要时手动指定;第三,大模型幻觉返回了空值或null,要加后置校验。我一般会加一层fallback逻辑:先尝试解析,失败就回退到再问一次模型"请严格按照JSON格式返回"。另外,选择支持structured output的原生模型(如gpt-4o的response_format)比通用模型可靠。
【面试题】6. ChatMemory持久化方案怎么做?InMemoryChatMemory能上生产吗?
【标准答案】 InMemoryChatMemory绝对不能上生产,进程重启会话就丢了。生产方案有三种:第一,基于Redis,用Hash结构存对话列表,按sessionId key管理,TTL自动过期;第二,基于数据库,比如PostgreSQL存messages表,支持查询和分析;第三,用Spring AI扩展接口自己实现,比如对接分布式缓存。我的实践是:配置一个抽象的ChatMemory接口,然后用Redis实现,通过依赖注入切换,测试环境用InMemory快速验证。
【面试题】7. Spring AI的Advisor执行顺序怎么控制?多个Advisor之间怎么协作?
【标准答案】 Advisor有两个拦截点:aroundCall在请求前执行,aroundListen在响应后执行。顺序通过@Order注解或Ordered接口控制,数字越小优先级越高。协作机制:Advisor可以读取和修改请求上下文Advice,比如MemoryAdvisor往请求里加历史消息,RAGAdvisor往请求里加检索文档。下游Advisor能拿到上游Advisor处理后的结果。我之前做个链路:LoggingAdvisor(order=1)-> MemoryAdvisor(order=2)-> RAGAdvisor(order=3),这样先加日志,再加历史,最后加检索内容。
【面试题】8. 微服务架构下,Spring AI应用的API Key和敏感配置怎么管理?
【标准答案】 绝对不能硬编码在代码里,也不能明文写在application.yml。方案一:用Spring Cloud Config + Vault,配置中心统一管理,Vault加密存储;方案二:用Kubernetes Secret,容器启动时注入环境变量;方案三:用云厂商的Secret Manager,比如AWS Secrets Manager或阿里云KMS。我现在的做法:开发环境用本地环境变量,生产环境用Vault,Spring AI通过spring.ai.openai.api-key=${OPENAI_API_KEY}从外部读取,代码里只留占位符。
【面试题】9. Spring AI的Observability监控怎么接入?关键指标有哪些?
【标准答案】 Spring AI集成了Micrometer,开箱即用。引入spring-boot-starter-actuator后,配置management.endpoints.web.exposure.include=metrics,prometheus。关键指标:第一,ai.chat.model.calls统计模型调用次数和延迟;第二,ai.vector.store.similarity.search统计向量检索性能;第三,ai.token.usage统计token消耗;第四,错误率和超时率。我一般会接Prometheus + Grafana,建个Dashboard实时看,超过阈值报警。另外还要监控费用,OpenAI按token收费,异常调用可能导致账单爆炸。
【面试题】10. Spring AI MCP是什么?和Function Calling有什么区别?
【标准答案】 MCP是Model Context Protocol,Anthropic推出的标准化协议,让AI模型能统一访问外部工具、数据源、环境。Function Calling是单次工具调用,模型返回tool_call,应用执行返回结果。MCP是更高层次的抽象:它定义了Resources(可读资源)、Tools(可执行工具)、Prompts(预定义提示词)三类能力,客户端可以动态发现和调用。Spring AI MCP支持意味着可以用统一协议对接不同Agent系统。区别:Function Calling是点对点调用,MCP是标准化工具生态,后者更适合复杂Agent编排场景。
本轮共10题,覆盖:ChatClient架构、RAG切分策略、VectorStore选型、Function Calling原理、Structured Output踩坑、ChatMemory持久化、Advisor机制、安全配置、Observability监控、MCP前沿趋势。