Java大厂面试真题:Spring Boot+微服务+AI智能客服三轮技术拷问实录(四)
Java大厂面试真题:Spring Boot+微服务+AI智能客服三轮技术拷问实录
面试官(推了推眼镜,面无表情):请进。
战五渣(紧张地搓手):您好!我是来面试Java开发岗的,三年经验,主攻Spring Boot……
面试官:嗯。我们今天会围绕一个实际业务场景展开——你负责设计一个基于AIGC的企业级智能客服系统,支持高并发、多租户、知识库问答和工具调用。准备好了吗?
🟢 第一轮:基础构建与Web框架(简单但关键)
Q1:为什么选择Spring Boot而不是传统Jakarta EE来搭建这个智能客服后端?
战五渣:因为Spring Boot启动快、配置少,内置Tomcat,还能自动装配Bean!而且社区强,资料多!
面试官(点头):不错。那如果我要实现RESTful API接口供前端调用,你会用哪个模块?
战五渣:当然是spring-webmvc啦,配合@RestController注解,轻松写接口!
面试官:很好。那Swagger怎么集成进来生成API文档?
战五渣:加个springfox-swagger2依赖,再启用@EnableSwagger2就行!哦不对……现在是springdoc-openapi-ui了,直接引入就自动生效!
面试官:纠正得很及时,加分项。继续。
🟡 第二轮:数据层 + 安全 + 微服务(中等难度,考验深度)
Q4:用户登录如何保障安全?JWT和OAuth2有什么区别?
战五渣:呃……JWT就是把用户信息加密成token,每次带着请求头传过来;OAuth2是授权协议,比如用微信登录……
面试官:那它们能一起用吗?
战五渣:当然可以!OAuth2发JWT……啊不,OAuth2可以用JWT作为令牌格式!
面试官:还行。那权限控制呢?
战五渣:用Spring Security!配个SecurityFilterChain,写点.antMatchers("/admin/**").hasRole("ADMIN")……
面试官:如果是分布式微服务架构呢?
战五渣:嗯……每个服务都加Security?或者统一网关处理?Zuul或Gateway上做认证?
面试官(微微颔首):方向正确。下一个问题:对话历史要存下来,用MySQL还是Redis?
战五渣:查得少就MySQL,查得多就Redis!
面试官:如果每秒有10万条会话记录写入?
战五渣:那……先写Kafka缓冲一下,再异步入库!
面试官:不错。那缓存击穿怎么办?
战五渣:加互斥锁?或者设随机过期时间?
面试官:还可以用什么本地缓存防止穿透?
战五渣:Caffeine?听说过,但没用过……
🔴 第三轮:AI融合 + 高阶系统设计(挑战极限)
Q8:现在要求智能客服能读企业PDF手册并回答问题,怎么实现?
战五渣:嗯……先把PDF转文本,然后让AI读?
面试官:具体流程?
战五渣:用Apache POI解析PDF?然后喂给大模型?
面试官:如果文档很大呢?
战五渣:分段?切块?
面试官:专业术语叫什么?
战五渣:分片?分词?……分块?
面试官:叫文档切片(Chunking)。然后呢?
战五渣:扔进数据库?
面试官:哪种?
战五渣:MongoDB?
面试官:我们要做语义搜索,怎么办?
战五渣:关键词匹配?LIKE查询?
面试官:我说的是“语义”!比如用户问“怎么退货”,文档里写的是“订单撤销流程”。
战五渣:这……要用AI理解意思?
面试官:对。怎么做?
战五渣:把文字变向量?存到……向量数据库?
面试官:很好。说几个名字。
战五渣:Milvus?Redis也能存向量?还有Chroma……
面试官:不错。那Embedding模型用哪个?
战五渣:OpenAI的text-embedding-ada-002?国产的也有……但我忘了……
面试官:最后一个问题:如何避免AI胡说八道(幻觉)?
战五渣:让它只从知识库里找答案?不准瞎编!
面试官:技术手段?
战五渣:嗯……检索增强生成?RAG?先搜再答!
面试官:如果需要调用外部工具,比如查订单状态,怎么办?
战五渣:让AI输出一个函数调用指令?像JSON那样?然后后台执行?
面试官:接近了,叫Tool Calling或Function Calling。Agentic RAG了解一下。
面试官(合上笔记本):今天的面试到此为止。你回家等通知吧。
战五渣(松了一口气):谢谢!我回去一定好好学Caffeine和RAG……
✅ 参考答案详解(小白也能看懂)
场景背景:企业级AI智能客服系统
这是一个典型的AIGC+微服务+高并发综合场景,涉及以下核心需求:
- 用户通过Web/APP发起咨询
- 系统需支持自然语言理解、知识库问答、工具调用
- 支持多租户、权限隔离、高可用部署
Q1-Q3:为何选Spring Boot?
✅ 优势对比:
| 对比项 | Spring Boot | Jakarta EE |
|---|---|---|
| 启动速度 | 快(内嵌容器) | 慢(需部署到WebLogic/Tomcat) |
| 配置方式 | 注解驱动、YAML简洁 | XML为主,繁琐 |
| 生态支持 | 强(Spring Cloud全家桶) | 较弱 |
📌 推荐组合:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>1.7.0</version>
</dependency>
👉 访问 /swagger-ui.html 即可查看API文档。
Q4-Q7:安全与数据架构设计
🔐 JWT vs OAuth2:
- JWT:是一种令牌格式,自包含用户信息(如userId、role),无需查库验证。
- OAuth2:是一种授权框架,定义四种模式(授权码、密码、客户端凭证、刷新令牌)。
✅ 实际使用:OAuth2协议 + JWT格式令牌,既标准又高效。
🛡️ Spring Security 分布式方案:
- 在API Gateway(如Spring Cloud Gateway)统一认证
- 使用
@EnableWebFluxSecurity支持响应式编程 - 结合Redis存储OAuth2 token状态
💾 会话历史存储策略:
- 实时性要求高 → 写入Kafka → 消费者异步落库(MySQL)
- 查询频繁 → Redis缓存最近会话(TTL=7天)
- 缓存穿透防护 → 布隆过滤器 + 空值缓存
- 热点数据 → Caffeine本地缓存(减少Redis压力)
Q8-Q10:AI智能客服核心技术栈
🧠 RAG(Retrieval-Augmented Generation)流程:
- 文档加载:使用LangChain4j或Unstructured.io解析PDF/Word
- 文本切片(Chunking):按段落或固定长度(如512 token)分割
- 向量化:调用Embedding模型(如BAAI/bge-small-en-v1.5)生成向量
- 存入向量数据库:Redis(启用RedisSearch模块)、Milvus、Chroma
- 语义检索:用户提问 → 向量化 → 相似度搜索(余弦相似度)→ 返回Top-K结果
- 生成回答:将检索结果拼接提示词(Prompt)送入LLM生成最终回复
🚫 防止AI幻觉:
- 所有回答必须基于检索到的知识片段
- 设置置信度阈值,低于则返回“暂未找到相关信息”
- 加入引用标注:“根据《用户手册V2.3》第5页…”
🔧 Tool Calling 示例:
{"tool_calls": [{"type": "function","function": {"name": "queryOrderStatus","arguments": {"orderId": "20240514001"}}}]
}
后台解析后调用对应服务,返回结果再交给AI总结。
🚀 Agentic RAG:AI不仅是问答机器人,而是能自主决策、调用工具、完成复杂任务的“智能代理”,例如:
用户问:“我上周买的手机还没发货,能帮我查一下吗?”
→ AI自动执行:
- 调用
getUserOrders()获取订单 - 调用
getLogisticsInfo()查物流 - 若异常,则触发
createServiceTicket()提交工单 - 最终回复用户全流程进展
总结:大厂面试考察维度
| 维度 | 考察点 |
|---|---|
| 基础能力 | Spring Boot、REST、数据库操作 |
| 架构思维 | 微服务拆分、缓存策略、消息队列 |
| 安全意识 | JWT/OAuth2、权限控制 |
| 新技术敏感度 | RAG、向量数据库、AI工程化 |
| 系统设计能力 | 高并发、容错、扩展性 |
📌 学习建议:
- 掌握Spring生态核心组件
- 动手搭建一个RAG Demo(可用Ollama + Chroma + Spring AI)
- 理解AI不是魔法,而是工程系统的集成产物
💬 结尾彩蛋:
面试官走出会议室,对HR说:“这人虽然水,但反应快,知道RAG和向量数据库,不如招来做AI试点项目……”
