【Java面试】电商智能客服场景下Spring AI + MCP + RAG技术实战 — 面试官VS谢飞机
某互联网大厂Java高级开发岗面试现场。面试官老周十年老兵目光如炬。求职者谢飞机三年经验包装成五年简历上写满了「精通」。第一轮基础摸底面试官来个简单的热热身。JVM内存结构分几块堆和栈分别放什么谢飞机松口气这个我熟JVM内存分五块——堆、方法区、虚拟机栈、本地方法栈、程序计数器。堆放对象实例栈放局部变量和方法调用。JDK 8之后方法区被元空间替代用的是直接内存不容易OOM了。面试官微微点头不错。那Spring Boot自动配置是怎么实现的谢飞机靠SpringBootApplication里的EnableAutoConfiguration它会通过spring.factories文件加载所有AutoConfiguration类然后按Conditional条件注解按需装配。比如ClassPath下有HikariCP就自动配连接池。面试官很好。Maven和Gradle你怎么选谢飞机小项目用Maven大项目用Gradle。Maven配置XML虽然啰嗦但规范Gradle用Groovy/Kotlin DSL灵活增量构建快。我现在多用Gradle毕竟快嘛摸鱼时间也是时间。面试官嘴角微扬最后问个数据库的——MySQL索引哪些情况会失效谢飞机最左前缀没匹配、对索引列做函数运算或计算、LIKE%开头、类型隐式转换、OR条件里有非索引列……这些都会让索引失效。解决方案嘛EXPLAIN看执行计划该加联合索引加联合索引。面试官基础很扎实进入下一轮吧。第二轮进阶深挖面试官假设电商秒杀场景Redis怎么防缓存击穿缓存穿透和雪崩又怎么处理谢飞机击穿嘛热点key过期瞬间大量请求打DB——用互斥锁或者「永不过期异步更新」就行。穿透是查不存在的数据布隆过滤器一把梭。雪崩是大量key同时过期给过期时间加随机值打散就行。面试官不置可否Kafka怎么保证消息不丢谢飞机三方面——生产者用acksall加retryBroker端min.insync.replicas≥2消费者关掉自动提交、处理完再手动commit。基本上幂等事务就能兜底了。面试官微服务间分布式事务你怎么做Saga和TCC区别谢飞机开始冒汗这个……分布式事务嘛CAP理论你知道的要么CP要么AP。Saga就是……长事务拆成多个本地事务失败了走补偿。TCC就是Try-Confirm-Cancel。区别嘛……Saga是异步补偿TCC是两阶段提交……呃具体实现我没怎么写过我们组都用Seata配个注解就完事了。心虚地笑面试官推了推眼镜你简历上写了Spring AI和MCP聊聊谢飞机眼睛一亮Spring AI就是Spring出的AI框架能调OpenAI、Ollama那些大模型。MCP嘛……Model……Context……Protocol模型上下文协议就是……让大模型能调外部工具的协议客户端-服务器架构类似……USB协议插上就能用。声音越来越小面试官所以MCP的核心价值在哪儿和传统的API调用有什么区别谢飞机嗯……传统API调用是点对点的MCP是标准化的就像……USB统一了外设接口一样MCP统一了AI工具调用标准减少重复开发……吧第三轮综合场景实战面试官合上简历假设现在让你设计一个电商智能客服系统用RAG技术说说你的方案。谢飞机RAG嘛……检索增强生成就是用户问问题→向量检索找到相关文档→拼到Prompt里喂给大模型→生成答案。先得把商品文档、FAQ用Embedding模型向量化存到向量数据库里用户提问也向量化然后语义检索召回Top-K文档最后让大模型基于检索结果生成回答。面试官向量数据库选Milvus还是Chroma怎么决策谢飞机彻底慌了这个……Milvus是分布式的适合海量数据Chroma轻量级适合原型开发。选型的话……看数据量吧。具体我没搭过生产环境我们公司用的是……支支吾吾好像是ES面试官沉默两秒最后一个问题——Agentic RAG里Agent怎么处理多步骤复杂工作流AI幻觉怎么应对谢飞机Agent就是可以调用工具、多步推理……比如用户问「我的订单怎么还没退款」Agent先调订单API查状态再调退款API查进度最后调政策文档做RAG检索综合后回答。幻觉嘛……就让Prompt里加「不知道就说不知道」……还有RAG本身就能减少幻觉因为给了参考文档嘛……声音几乎听不见面试官合上笔记本站起身好今天先到这里感谢你的时间。回去等通知吧。谢飞机如释重负谢谢面试官那我回去等您消息会议室门关上。谢飞机掏出手机搜索框里打出一行字——「MCP协议 面试题 三天速成」。技术答案详解第一轮基础技术点1. JVM内存结构Java 8堆存放对象实例分年轻代EdenS0S1和老年代。GC主要发生在这里。方法区/元空间存放类信息、常量、静态变量。JDK 8后用本地内存实现元空间避免PermGen OOM。虚拟机栈每个线程私有存储栈帧局部变量表、操作数栈、方法出口。递归过深会StackOverflow。本地方法栈为native方法服务。程序计数器记录当前线程执行字节码的行号。2. Spring Boot自动配置核心流程SpringBootApplication→EnableAutoConfiguration→AutoConfigurationImportSelector→ 读取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports→ 加载所有AutoConfiguration类 →Conditional系列注解条件筛选如ConditionalOnClass检测ClassPath中是否存在HikariCP→ 按需装配Bean。3. Maven vs Gradle| 特性 | Maven | Gradle | |------|-------|--------| | 配置语言 | XML | Groovy/Kotlin DSL | | 构建速度 | 较慢无增量 | 快增量构建构建缓存 | | 灵活性 | 低约定优于配置 | 高完全可编程 | | 适用场景 | 标准项目 | 大型/复杂项目 |4. MySQL索引失效场景违反最左前缀原则索引列上做函数运算WHERE DATE(create_time) 2025-01-01隐式类型转换WHERE phone 13800138000但phone是varcharLIKE以%开头OR条件中有非索引列第二轮分布式与中间件5. Redis缓存三大问题穿透查不存在的数据 → 布隆过滤器 空值缓存击穿热点key过期 → 互斥锁SETNX 逻辑过期永不过期异步刷新雪崩大量key同时过期 → 过期时间加随机值、多级缓存、限流降级6. Kafka消息可靠性生产端acksall所有ISR确认、retries0、幂等enable.idempotencetrueBroker端min.insync.replicas≥2、unclean.leader.election.enablefalse消费端关闭自动提交enable.auto.commitfalse、处理完业务后再手动commitSync()7. 分布式事务Saga vs TCCSaga长事务拆成N个本地事务每个事务有对应的补偿操作。失败时逆序执行补偿。适合长流程如下单→扣库存→扣款。TCCTry预留资源→ Confirm确认执行→ Cancel释放资源。两阶段提交变体适合资金类场景。Seata阿里开源支持AT自动补偿、TCC、Saga三种模式AT模式通过全局锁undo_log实现自动回滚。8. MCP模型上下文协议Anthropic推出的开放协议采用客户端-服务器架构核心价值标准化AI模型与外部工具/数据源的交互方式类似「USB协议」统一外设接口。传统API调用每个工具都要单独写适配代码MCP定义统一接口一次对接、多处复用。核心概念Server暴露资源Resources、工具Tools、提示模板PromptsClient如Claude Desktop通过标准JSON-RPC与Server通信。与Spring AI的关系Spring AI可以做MCP Client调用各种MCP Server实现工具调用标准化。第三轮AI架构设计9. RAG电商智能客服架构用户提问 → Embedding向量化 → 向量数据库语义检索Top-K → 拼接Prompt「参考以下文档{检索结果}回答用户问题{用户问题}」 → LLM生成答案 → 返回用户关键环节文档预处理商品FAQ、售后政策、使用说明 → 分块Chunking→ 向量化存入Milvus/Chroma检索优化混合检索关键词语义、Rerank重排序、Top-K调参防幻觉Prompt中强制要求基于文档回答无匹配时明确告知用户转人工10. 向量数据库选型| 特性 | Milvus | Chroma | |------|--------|--------| | 定位 | 分布式生产级 | 轻量开发级 | | 部署 | K8s集群 | pip install | | 适用 | 亿级向量 | 百万级向量 | | 选型建议 | 生产环境 | 原型验证 |11. Agentic RAG与AI幻觉应对Agentic RAGAgent通过工具调用Function Calling编排多步骤流程意图识别→路由决策→调用不同工具订单API、退款API、RAG检索→综合结果生成最终回答。AI幻觉应对① RAG本身提供事实锚点② Prompt约束「不知道就说不知道不要编造」③ 答案溯源标注引用文档④ 设置相似度阈值检索结果过低时触发降级策略转人工/拒答。