本轮 Spring AI 面试题库(带答案)
生成时间:2026-06-19 23:13 (Asia/Shanghai) 轮次:第01轮
【面试题】1. Spring AI 的 ChatClient 和直接使用 ChatModel 有什么区别?实际项目里怎么选?
【标准答案】ChatClient 是 Spring AI 1.0 推出的统一入口,底层封装了 ChatModel,但加了三层关键能力:Advisor 拦截链、Fluent API 流式构建、以及返回值自动转换。
直接操作 ChatModel 你只能 call(prompt) 拿到一个 ChatResponse,然后自己解析。ChatClient 你可以链式调用 .user().system().advisors().stream() 一条龙搞定,而且 Advisor 可以在调用前后插入 RAG、记忆、日志等逻辑。
实际项目用 ChatClient,只有在写底层扩展或者自定义适配时才直接碰 ChatModel。面试官就想听你说"ChatClient 是门面模式,ChatModel 是 SPI"。
【面试题】2. RAG 场景中,文档切分策略怎么选?TokenTextSplitter 的参数怎么调?
【标准答案】先说原则:切分不是为了切得碎,是为了切得对。TokenTextSplitter 的核心参数是 defaultChunkSize 和 minChunkSizeChars,再加一个 overlap。
- chunkSize 一般设 500~800 token,太小丢上下文,太大检索精度下降。
- overlap 设 chunkSize 的 10%~20%,保证跨 chunk 的语义不断裂。
- minChunkSizeChars 是保底,避免最后一段太短变成噪音。
实战里还要考虑内容结构。如果是代码文档,按函数/类边界切更好;如果是对话记录,按轮次切。TokenTextSplitter 只是默认选择,复杂场景可以自己实现 TextSplitter 接口。面试官加分点是你说"先用 ParagraphTextSplitter 粗切,再用 TokenTextSplitter 细切"这种分层策略。
【面试题】3. Function Calling 在 Spring AI 里怎么实现?工具调度的完整链路是什么?
【标准答案】三步走:
第一步,定义一个 @Bean 方法返回 java.util.function.Function,并用 @Description 注解描述它的能力——Spring AI 会根据方法签名自动生成 JSON Schema。
第二步,启动时 ChatModel 会自动扫描所有 Function Bean,把它们的 Schema 注册到模型侧。
第三步,运行时用户发消息 → 模型判断需要调用工具 → 返回 tool_call 指令(含函数名+参数JSON)→ Spring AI 反射调用对应 Bean → 把返回结果塞回对话上下文 → 模型基于工具返回生成最终回复。
核心调度逻辑在 DefaultToolCallManager 里,它负责匹配函数名、反序列化参数、处理异常。面试加分点:提一下"工具返回的结果是追加到 messages 列表里的,模型能看到完整调用链"。
【面试题】4. 项目里要从 OpenAI 切换到通义千问,怎么做到改一行配置就搞定?
【标准答案】Spring AI 的 ChatModel 实现都是按统一接口来的,切换模型就是改配置,不用改代码。
步骤:先引入对应的 starter,比如 spring-ai-alibaba-starter;然后在 application.yml 里把 spring.ai.openai 换成 spring.ai.dashscope(通义),填上新的 api-key 和模型名;最后 applicationContext 里注入的 ChatModel 会自动变成 DashScopeChatModel。
关键是你代码里不要写死 return new OpenAiChatModel(),要依赖注入 ChatModel 接口。再进一步,你可以用 @ConditionalOnProperty 做多模型共存,按配置决定用哪个。面试官最爱听你说"基于接口编程 + Boot 自动配置 = 零代码切换"。
【面试题】5. Structured Output 的 BeanOutputConverter 有什么坑?entity() 和 content() 怎么选?
【标准答案】三个坑:
第一个坑,POJO 里字段名和 JSON key 不一致时要用 @JsonProperty 显式映射,否则转换静默失败拿 null。
第二个坑,模型有时候在 JSON 外面包了 markdown 代码块(json...),BeanOutputConverter 默认不会自动剥离,你得自己预处理或者在 Prompt 里强调"只输出纯 JSON"。
第三个坑,嵌套对象和集合字段的泛型擦除问题——List<Order> 这种,转换器内部是靠 ParameterizedTypeReference 保留类型信息的,定义返回值时必须用它,不能直接用 List.class。
entity() 返回 POJO 实例,适合结构化结果直接使用;content() 返回原始字符串,适合需要额外校验或二次处理的场景。建议用 entity() + try-catch 兜底 content() 解析,容错性最好。
【面试题】6. Chat Memory 在 Spring AI 里是怎么工作的?如果要做持久化,方案怎么设计?
【标准答案】ChatMemory 是一个 Map<String, List<Message>> 接口,默认实现 InMemoryChatMemory 用 ConcurrentHashMap 存会话,进程重启就没了。
持久化方案分三层选型:简单场景用 RedisChatMemory,基于 sessionId 做 key,消息序列化为 JSON 存进去,设 TTL 自动清理;复杂场景用 JdbcChatMemory,建一张 chat_memory 表(session_id, message_index, message_type, content, created_at),支持按会话和时间范围查询。
使用的时候通过 MessageChatMemoryAdvisor 挂到 ChatClient 上,它会在每次调用前自动把历史消息注入 prompt,调用后把新消息写回 memory。核心参数是 maxHistorySize,控制最多带多少轮历史,防止 token 爆表。
面试官想听你提"Advisor 模式让记忆和业务逻辑解耦,换存储方案不动业务代码"。
【面试题】7. 向量数据库在 Spring AI 里怎么选?PGVector、Redis、Milvus 各适合什么场景?
【标准答案】Spring AI 1.0 统一了 VectorStore 接口,增删查都是标准 API,底层实现可以随意换。
选型决策:PGVector 适合中小规模且已经在用 PostgreSQL 的团队——零运维成本,SQL 和向量查询共存,10万~100万向量级别没问题。Redis 适合对延迟敏感的场景,向量存在内存里,毫秒级响应,但数据量大时内存成本高。Milvus 适合千万级以上向量、需要分布式索引的专业场景,支持 IVF/HNSW 多种索引算法,但运维复杂度最高。
面试加分点:提一下"hybrid search"——PGVector 可以做向量 + 关键词混合检索,结合全文索引和向量相似度一起排序,召回率比纯向量检索高 10%~20%。
【面试题】8. Advisor 机制是什么?和传统的 Filter/Interceptor 有什么本质区别?
【标准答案】Advisor 是 Spring AI 1.0 引入的"对话增强器"模式,和传统 Filter 的核心区别是:Filter 只能拦截请求/响应做前置后置处理;Advisor 可以在调用前后直接修改 Prompt 和 Message 列表,甚至决定是否调用、调用几次。
执行顺序是:before → around → 模型调用 → after。每个 Advisor 的 before 会操作 AdvisingContext,可以往 Prompt 里注入 system message(比如 RAG 检索结果)、追加 user message(比如历史对话)、注入参数(比如 function callings)。
典型场景:QuestionAnswerAdvisor 做 RAG 注入、MessageChatMemoryAdvisor 做记忆管理、SimpleLoggerAdvisor 做调试日志。你还可以自定义 Advisor 实现权限校验、内容安全过滤、多模型路由。面试官最想听你说"Advisor 是责任链 + AOP 的结合体,比 Filter 更内聚于对话场景"。
【面试题】9. Spring AI 项目上线,限流、熔断、监控这三板斧怎么落地?
【标准答案】三板斧分别对应:
限流:用 Resilience4j + Bucket4j 组合。Resilience4j 做 QPS 限流,在 ChatModel 调用外包装 @RateLimiter 注解;Bucket4j 做 Token 消耗限流,因为不同模型 token 单价不一样,按 token 粒度限比按请求数限更公平。
熔断:Resilience4j CircuitBreaker,5 秒内失败率超 50% 就熔断 30 秒,返回预设 fallback 回答而不是让用户干等。注意熔断状态变化要打日志,方便排查。
监控:Spring AI 内置了 Micrometer 指标,包括 ai.client.requests(调用次数)、ai.client.response.tokens(token 消耗)、ai.client.duration(响应时间)。用 Prometheus + Grafana 接上就能出面板,再加个 AlertManager 设阈值告警。
面试官最爱听你提"三层防护:限流在前防打死、熔断在中防雪崩、监控在后做复盘"。
【面试题】10. Spring AI MCP 是什么?跟传统的 Function Calling 比有什么提升?
【标准答案】MCP(Model Context Protocol)是 Anthropic 提出的开放协议,Spring AI 已经支持了。它解决的核心问题是:Function Calling 的工具是硬编码在应用里的 Bean,而 MCP 让工具变成了独立的服务进程,通过标准协议(JSON-RPC over stdio/SSE)通信。
这意味着三点提升:
第一,工具解耦。你可以用 Python 写一个天气查询 MCP Server,Java 应用通过 MCP Client 调用它,完全跨语言。
第二,动态发现。MCP Server 启动时会暴露 tools/list 接口,Spring AI 自动获取工具列表和 Schema,不用在应用里注册 Bean。
第三,资源与提示词共享。MCP 不只暴露工具,还能暴露 Resources(数据库连接、文件)和 Prompts(模板),比 Function Calling 的能力范围更广。
面试加分点:"MCP 本质是把 LLM 的'插件生态'从应用内搬到了应用外,和微服务架构天然契合"。
本轮共 10 题,覆盖:核心架构、RAG检索、Function Calling、多模型切换、Structured Output、Chat Memory、向量库选型、Advisor机制、生产运维、MCP趋势。