本轮 Spring AI 面试题库(带答案)
【面试题】1. Spring AI 的核心架构是什么样的?它和 LangChain 有什么区别?
【标准答案】Spring AI 的核心架构围绕三个概念展开:Model(对接各种大模型的统一抽象)、Prompt(提示词模板+变量注入)、ChatClient(与模型交互的高级门面)。它和 LangChain 最大的区别是编程范式不同——LangChain 是 Python 生态的链式编排,Spring AI 则深度绑定 Spring 生态,利用 Boot 自动配置、依赖注入、Properties 外部化来管理模型连接和参数,对 Java 团队来说上手成本极低,而且天然融入现有 Spring 微服务架构。简单说:LangChain 是"拼积木",Spring AI 是"开箱即用"。
【面试题】2. Spring AI 中如何实现 RAG?请描述完整的检索增强生成流程。
【标准答案】Spring AI 实现 RAG 分四步:第一步,用 EmbeddingModel 把文档切片后生成向量;第二步,存入 VectorStore(支持 Pinecone/Chroma/Redis/PGVector/Milvus 等多种后端);第三步,用户提问时同样用 EmbeddingModel 把问题转向量,通过 VectorStore 的 similaritySearch 检索最相关的文档片段;第四步,把检索结果作为上下文塞进 Prompt 模板,交给 ChatModel 生成回答。代码层面,Spring AI 提供了 QuestionAnswerAdvisor 可以一行代码把 RAG 能力挂到 ChatClient 上,不需要手写编排逻辑。关键点:文档切分用 TokenTextSplitter,检索时注意 similarityThreshold 和 topK 的调参。
【面试题】3. Spring AI 的 Advisor 机制是什么?和 Spring Interceptor 有什么异同?
【标准答案】Advisor 是 Spring AI 的请求/响应拦截器,可以在 ChatClient 调用模型前后插入自定义逻辑。它分两种:CallAdvisor 拦截同步调用,StreamAdvisor 拦截流式调用。和 Spring MVC 的 Interceptor 思路一样——链式执行、可中断、可修改请求和响应。区别在于 Advisor 操作的是 AdvisedRequest 和 AdvisedResponse,专门处理 Prompt 增强和模型输出后处理,比如往 Prompt 里动态注入上下文、记录对话历史、做内容安全过滤等。实际项目中,MessageChatMemoryAdvisor 和 QuestionAnswerAdvisor 就是最常用的两个内置 Advisor。
【面试题】4. Spring AI 如何实现 Function Calling(工具调用)?底层流程是怎样的?
【标准答案】Spring AI 的 Function Calling 分三层实现:第一层,用 @Bean 注册一个普通的 Java 方法(或实现 Function<I,O> 接口),Spring AI 自动生成 JSON Schema 描述其入参出参;第二层,ChatClient 配置时通过 .functions("beanName") 声明可用函数;第三层,运行时大模型判断需要调函数时返回 tool_call,Spring AI 自动执行对应 Bean、把结果回填给模型继续推理。整个过程开发者只写业务函数,调度全由框架完成。注意:模型端必须支持 Function Calling(如 GPT-4/Claude/GLM),本地模型可通过 Ollama 代理支持。实际项目建议函数粒度要细、入参要明确,方便模型准确匹配。
【面试题】5. Spring AI 如何对接多种大模型?切换模型需要改代码吗?
【标准答案】完全不用改代码。Spring AI 用 ChatModel 接口做统一抽象,具体实现有 OpenAiChatModel、AnthropicChatModel、OllamaChatModel、ZhiPuAiChatModel 等。切换模型只需要改 application.yml 里的依赖和配置:比如从 OpenAI 切到智谱,把 spring-ai-openai-spring-boot-starter 换成 spring-ai-zhipuai-spring-boot-starter,改下 API Key 和 base-url 即可,业务代码里的 ChatClient 调用完全不动。这也是 Spring AI 最大的卖点——模型可替换,你的应用不绑定任何一家大模型厂商。
【面试题】6. Spring AI 中 VectorStore 有哪些选型?生产环境怎么选?
【标准答案】Spring AI 内置支持约 10 种 VectorStore:PGVector(PostgreSQL 扩展,适合已有 PG 的团队)、Redis(适合已有 Redis 基础设施,延迟低)、Pinecone(全托管,免运维)、Chroma(轻量级,开发调试方便)、Milvus(大规模向量检索,千亿级)、Weaviate(内置多模态)、Qdrant(Rust 写的高性能引擎)。生产选型看三个维度:一是数据规模,百万级以下 PGVector/Redis 够用,上亿就 Milvus/Pinecone;二是运维成本,不想管就用 Pinecone,有 DBA 团队就 PGVector;三是一致性要求,和业务数据同库 PGVector 事务一致性最好。我的建议:中小项目 PGVector 起步,大规模再迁 Milvus。
【面试题】7. Spring AI 如何处理 Structured Output(结构化输出)?有什么坑?
【标准答案】Spring AI 用 BeanOutputConverter 把模型输出映射到 Java POJO。用法是 ChatClient.prompt().user().call().entity(MyDto.class),框架自动在 Prompt 里注入 JSON Schema 约束,模型返回后用 ObjectMapper 反序列化。坑有三个:一是模型不一定遵守 Schema,建议用 GPT-4/Claude 等指令遵从强的模型,弱模型容易格式跑偏;二是嵌套对象和枚举需要显式标注 @JsonProperty 和 @JsonClassDescription 帮模型理解字段含义;三是流式场景不支持 entity,必须用同步调用。生产建议加上重试和降级逻辑,解析失败就再调一次。
【面试题】8. Spring AI 如何实现对话记忆(Chat Memory)?多轮对话怎么管理上下文?
【标准答案】Spring AI 通过 ChatMemory 接口管理对话历史,内置两种实现:InMemoryChatMemory(内存,适合单机调试)和 MessageChatMemoryAdvisor(Advisor 方式自动注入历史消息)。多轮对话的流程:用户每次提问,Advisor 从 ChatMemory 取出历史消息拼到 Prompt 里,模型回复后再把新一轮 Q&A 存回 ChatMemory。生产环境需要自己实现 ChatMemory 接口对接 Redis 或数据库做持久化。关键参数是 maxMessages,控制保留最近多少轮对话,防止 Token 溢出。实际项目建议:10轮以内的场景用 MessageChatMemoryAdvisor + Redis 就够了,超长对话考虑用摘要压缩策略。
【面试题】9. Spring AI 在微服务架构中怎么部署?有哪些关注点?
【标准答案】Spring AI 本身就是 Spring Boot Starter,部署和普通微服务一样打 JAR 包丢容器。但有几个关注点:一是API Key 管理,别硬编码,用 Spring Cloud Config 或 Vault 注入;二是模型调用超时和限流,大模型响应慢,Feign/RestTemplate 超时要调大,建议用 Resilience4j 加熔断和限流;三是向量库高可用,PGVector 跟 PG 主从走,Milvus 用集群模式;四是可观测性,Spring AI 集成了 Micrometer,开箱即用 Token 用量、调用延迟、模型名等指标,接 Prometheus+Grafana 做监控;五是多模型路由,不同场景调不同模型,可以用 Spring AI 的 ChatModel 多 Bean 注入 + 自定义路由策略。
【面试题】10. Spring AI 1.0 正式版有哪些重要更新?从 M 版升级要注意什么?
【标准答案】Spring AI 1.0(2024年5月正式发布)相比 M 系列里程碑版有几个核心变化:一是 ChatClient 成为统一入口,之前的 ChatModel.call() 降为底层 API,业务层全部走 ChatClient 的 Fluent API;二是 Advisor 架构取代了旧的拦截机制,更灵活可组合;三是 VectorStore 接口统一,新增了 add()、delete()、search() 标准方法;四是 Observability 内置,基于 Micrometer 自动采集指标;五是 自动配置全面重写,Properties 前缀统一为 spring.ai.*。从 M 版升级注意三点:旧 API 大量废弃需要迁移、Prompt 模板语法有变化({variable} 取代 ${variable})、依赖坐标从 spring-ai-openai 变成 spring-ai-openai-spring-boot-starter。建议先跑测试再升级。