Skip to content

Spring AI 面试题库 ​

生成时间:2026-05-21 20:49


【面试题】1. Spring AI 中 ChatClient 和 ChatModel 有什么区别?实际项目中该用哪个? ​

【标准答案】ChatModel 是底层抽象,负责直接调用大模型API,返回原始响应;而 ChatClient 是 Spring AI 1.0 推荐的高层统一入口,内置了 Advisor 链、Fluent API、自动消息管理等能力。

实际项目中首选 ChatClient,原因有三:

  • 第一,Fluent API 链式调用更优雅,代码可读性强;
  • 第二,内置 Advisor 机制,可以无缝注入 Chat Memory、RAG、日志等横切逻辑;
  • 第三,统一抽象层屏蔽了不同模型厂商的差异,切换模型只需改配置。

只有当你需要底层控制、比如自定义请求参数、直接操作原始响应时,才考虑直接用 ChatModel。


【面试题】2. 请解释 Spring AI 的 Advisor 机制是如何工作的?能举几个常用场景吗? ​

【标准答案】Advisor 是 Spring AI 的横切关注点处理机制,类似 AOP 的概念,但专为 AI 调用设计。每个 Advisor 可以在请求发出前(预处理)和响应返回后(后处理)插入自定义逻辑。

工作流程:请求 → Advisor链(前置处理)→ ChatModel → Advisor链(后置处理)→ 响应。Advisor 通过 CallAroundAdvisor 或 StreamAroundAdvisor 接口实现,可以修改 Prompt、拦截响应、记录日志、注入上下文等。

常用场景:

  1. Chat Memory:MessageChatMemoryAdvisor 自动维护对话历史;
  2. RAG 增强:QuestionAnswerAdvisor 自动注入检索到的文档上下文;
  3. 日志审计:自定义 Advisor 记录每次调用的 Token 消耗、耗时;
  4. 敏感词过滤:请求前检测 Prompt,响应后过滤敏感内容。

【面试题】3. 在 Spring AI 中实现 RAG,VectorStore 该如何选型?PGVector、Redis、Pinecone 各有什么优劣势? ​

【标准答案】选型核心看三点:数据规模、部署环境、成本预算。

PGVector:适合已有 PostgreSQL 的项目,零额外运维成本,生态成熟。劣势是大规模向量检索性能不如专业向量库,适合中小规模(百万级以内)。

Redis:如果项目已经用 Redis 做缓存,复用它能减少运维负担。Redis 的向量搜索基于 RedisSearch 模块,延迟低、支持实时更新,但功能相对简单,复杂查询支持有限。

Pinecone:全托管云服务,性能强、扩展性好,适合生产级大规模应用。但国内访问可能不稳定,且有数据出境合规风险,成本也较高。

我的建议:国内项目优先考虑 PGVector 或 Milvus(开源、高性能、支持私有化部署);海外项目可以直接用 Pinecone 省运维。


【面试题】4. Spring AI 的 Function Calling 是怎么实现的?@Bean 注册函数后,模型是怎么知道函数签名的? ​

【标准答案】Spring AI 的 Function Calling 完全屏蔽了底层复杂性,核心流程分三步:

  1. 注册阶段:开发者用 @Bean 定义一个返回类型为 Function<I, O> 的方法,Spring AI 自动扫描注册;
  2. Schema 生成:调用时,Spring AI 通过 Jackson 自动解析函数的输入类型 I,生成符合 OpenAI 规范的 JSON Schema,包含参数名、类型、描述(可配合 @JsonPropertyDescription 注解完善);
  3. 调度执行:模型返回 tool_call 后,Spring AI 自动反序列化参数、调用对应 Bean、将结果序列化返回给模型继续推理。

关键配置:通过 spring.ai.openai.chat.options.functions 或代码动态指定可用函数列表。整个过程开发者只需写函数逻辑,框架搞定 Schema 和调度。


【面试题】5. Structured Output 结构化输出在实际落地中有哪些坑?BeanOutputConverter 怎么用才稳? ​

【标准答案】坑主要集中在三方面:

第一,Schema 设计:POJO 字段命名要语义清晰,避免模糊的 field1、data;复杂嵌套对象容易生成失败的 Schema,建议扁平化设计;枚举类型要加 @JsonPropertyDescription 说明可选项。

第二,模型能力差异:不同模型对 Function Calling / JSON Mode 支持程度不同。OpenAI 最稳,国产模型偶尔会"幻觉"出 Schema 之外的字段或格式错乱,务必加一层后端校验。

第三,错误处理:解析失败时要有兜底策略,比如重试时让模型"输出更严格",或降级到提示词工程方式约束格式。

BeanOutputConverter 用法:

java
BeanOutputConverter<MyPojo> converter = new BeanOutputConverter<>(MyPojo.class);
String format = converter.getFormat(); // 获取提示词约束
String response = chatClient.prompt().user(prompt + format).call().content();
MyPojo result = converter.parse(response); // 解析为对象

用 chatClient.prompt().entity(MyPojo.class) 更简洁,框架自动完成上述流程。


【面试题】6. Chat Memory 对话记忆的实现原理是什么?InMemoryChatMemory 能上生产吗? ​

【标准答案】Chat Memory 的核心是 ChatMemory 接口和 MessageChatMemoryAdvisor,前者负责存储历史消息,后者负责在每次调用前自动注入历史。

实现原理:

  1. 每次 chatClient.prompt() 调用时,Advisor 根据 conversationId 查询历史消息;
  2. 将历史消息按 Token 限制截断(可配置窗口大小),拼接到当前 Prompt;
  3. 模型响应后,新消息自动存入 Memory。

InMemoryChatMemory 能否上生产:不能直接上!它是内存实现,重启后丢失,且无分布式共享能力。生产环境需要:

  • 用 Redis / 数据库实现持久化 ChatMemory;
  • 或者用 Spring AI 提供的 RedisChatMemory 等现成实现;
  • 注意 Token 窗口管理,历史过长会截断关键上下文。

【面试题】7. Spring AI 在微服务架构下部署,API Key 管理和模型切换怎么做才安全又灵活? ​

【标准答案】API Key 管理遵循"配置外部化 + 动态注入"原则:

安全实践:

  1. 绝不硬编码:用 Vault、AWS Secrets Manager、阿里云 KMS 等密钥管理服务存储 API Key;
  2. 配置中心下发:通过 Nacos、Apollo 等配置中心动态下发,支持热更新;
  3. 环境隔离:不同环境用不同的 Key,开发环境可用额度受限的 Key,生产用主 Key。

模型切换策略:

  • 通过 spring.ai.openai.api-key、spring.ai.anthropic.api-key 等配置外部化;
  • 利用 spring.profiles.active 切换不同模型的配置文件;
  • 代码层面通过 ChatClient.Builder 动态指定 ChatModel Bean,实现 A/B 测试或灰度切换;
  • 高级场景可自研路由层,根据请求类型、成本、延迟智能选择模型。

【面试题】8. Spring AI 1.0 正式版相比之前的 Milestone 版本,有哪些重大更新值得面试官眼前一亮? ​

【标准答案】Spring AI 1.0 正式版有几个里程碑式更新:

ChatClient 统一入口:之前用 ChatModel.call() 直接调用,现在统一推荐用 ChatClient,Fluent API 风格,支持链式配置、流式响应、Entity 映射,代码优雅很多。

Advisor 架构成熟:CallAroundAdvisor、StreamAroundAdvisor 提供了完整的拦截链,支持前置后置处理,RAG、Memory 都通过 Advisor 实现,扩展性极强。

VectorStore 接口统一:之前各向量库 API 差异大,现在统一为 VectorStore 接口,增删改查方法标准化,切换底层存储只需换 Bean。

配置前缀统一:从散乱的配置项统一为 spring.ai.* 前缀,如 spring.ai.openai.chat.options.model,更符合 Spring Boot 规范。

Observability 集成:原生支持 Micrometer 指标暴露,Token 消耗、调用延迟、成功率都可观测。


【面试题】9. Spring AI 如何实现多模态能力?比如处理图片输入或语音场景? ​

【标准答案】Spring AI 的多模态能力通过 Media 类和 UserMessage 扩展实现。

图片输入示例:

java
Resource imageResource = new FileSystemResource("image.png");
UserMessage message = new UserMessage(
    "这张图片里有什么?",
    new Media(MimeTypeUtils.IMAGE_PNG, imageResource)
);
chatClient.prompt().messages(message).call();

框架自动将图片编码为 Base64 或 URL 形式,按不同模型的 API 规范发送。目前 OpenAI GPT-4V、Anthropic Claude 3 系列支持视觉输入。

语音场景:

  • 语音输入:前端通过 Whisper 等 ASR 转文字后,走普通 Chat 流程;
  • 语音输出:TTS 需调用独立 API(如 OpenAI TTS),Spring AI 暂无内置语音输出抽象,需自行封装。

注意:多模态对 Token 消耗影响大,图片会折算为大量 Token,需评估成本。


【面试题】10. Spring AI 的 Streaming 流式响应如何实现?前端 SSE 对接有什么注意事项? ​

【标准答案】Spring AI 的 Streaming 通过 stream() 方法实现,底层返回 Flux<String> 响应式流。

后端实现:

java
Flux<String> stream = chatClient.prompt()
    .user("讲个故事")
    .stream()
    .content();

配合 Spring WebFlux 的 ServerSentEvent 封装:

java
@GetMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<String>> stream(@RequestParam String prompt) {
    return chatClient.prompt().user(prompt).stream().content()
        .map(chunk -> ServerSentEvent.<String>builder().data(chunk).build());
}

前端对接注意事项:

  1. SSE 连接管理:EventSource 不支持 POST,需用 fetch + ReadableStream 或第三方库;
  2. 断线重连:网络波动时需自动重连,并处理 lastEventId 恢复;
  3. 流式渲染:前端要支持增量渲染,避免每次收到 chunk 都重绘整个内容;
  4. 错误处理:超时、Token 限制、模型过载等情况要有降级提示;
  5. 停止生成:提供取消按钮,关闭 SSE 连接。

本轮题目覆盖:架构核心(ChatClient vs ChatModel)、机制原理(Advisor、Function Calling)、实战选型(VectorStore)、生产部署(API Key 管理、Streaming)、版本更新(1.0 新特性)、前沿趋势(多模态)。