从本地生活到AI智能客服:一套故事串起 Java、Spring Cloud 与 RAG 实战的大厂面试
「本地生活+AI内容社区」实战:从 Java 基础到 Spring Cloud & RAG 智能客服的大厂面试故事
场景:互联网大厂,本地生活服务 + 内容社区 + AIGC 推荐中台部门,Java 开发工程师面试。
角色:
- 面试官(I):严肃、逻辑清晰、喜欢追问细节。
- 候选人小 Y(Y):搞笑水货程序员,基础还行,复杂问题就开始模糊带过。
业务背景:做「本地生活服务 + UGC 内容社区 + AI 智能客服」的一体化平台,支持外卖团购、商家店铺、短视频笔记、AI 问答与导购推荐,支撑千万级用户日活。
第一轮:Java 基础 & Spring Boot 入门——从点餐到下单
Q1:接口幂等性与下单去重
I: 我们做本地生活服务,用户点外卖时,可能会因为网络卡顿多次点击「立即下单」按钮。后端是 Java + Spring Boot。你怎么保证「创建订单接口」幂等性?
Y: 哦这个简单,我就用个分布式锁,Redis SETNX 一锁,就能保证不会重复下单了嘛……
I: 分布式锁可以用,但你说细一点:
- 锁的 key 怎么设计?
- 如果请求超时了,锁没释放怎么办?
- 幂等一定要靠锁吗?
Y: 诶,这个嘛……就……key 里带一下用户 ID,订单 ID 啊,然后超时时间设置长一点,一般也没事……幂等……也可以靠前端按钮置灰……
I: (点头又摇头)前端置灰只能减少问题,不能作为幂等的核心方案。后面我在讲解区给你补一下。
Q2:JVM 内存与高并发下单
I: 我们这套下单服务是 Spring Boot,部署在 K8s 上,每个 Pod 内存 4G,Java 17,订单高峰期 QPS 2000,你如何配置 JVM 内存,以及怎么排查一次 Full GC 导致接口 RT 抖动的问题?
Y: 哦这个,我一般就 -Xms2g -Xmx2g,然后用 G1 收集器,然后看一下 GC 日志,如果 Full GC 多,我就把内存调大点。
I:
- 4G 容器只给 2G Heap?
- 非 Heap 你怎么考虑?
- G1 你知道哪些关键参数吗?
Y: 啊,这个……G1 就是挺智能的嘛,我觉得不用怎么配……
I: 好,那这块你回去再系统补一下 GC 和 JVM 调优。等会在答案区我给一套参考配置和分析步骤。
Q3:Maven 多模块与业务拆分
I: 我们是微服务架构,但每个服务内部也会做 Maven multi-module 拆分。比如:order-service 会包含:order-api、order-service、order-dao。你是怎么管理这些模块依赖的?Parent POM 通常会放什么?
Y: 嗯……我一般就是一个 parent,里面放 <dependencyManagement>,然后子模块继承它,这样版本就统一了,具体的我都是直接 copy 公司脚手架的。
I: 你知道 dependencyManagement 和 dependencies 的区别吗?
Y: 嗯……好像,dependencyManagement 只是声明版本,不会真的引入?
I: 嗯,这点答得还可以,思路对的。细节我在后面补充。
Q4:Spring MVC vs Spring WebFlux
I: 本地生活有很多 内容流(Feed 流),比如猜你喜欢、短视频流,这类接口经常要聚合多方数据。你觉得在这些场景里:
- Spring MVC(Servlet 阻塞模型)
- Spring WebFlux(响应式非阻塞)
应该怎么选?什么情况下你会考虑 WebFlux?
Y: 哦 WebFlux 就是更快嘛,能扛更多并发,我觉得以后都用 WebFlux 就好了……
I: 如果都用 WebFlux,那你们团队大多数人不会响应式编程怎么办?排查问题成本呢?
Y: 呃……那就先用 MVC,以后再改?
I: 选择技术要有场景意识,后面我会用一张对比表帮你理一下。
第二轮:微服务、数据库与缓存——订单、支付与内容推荐
Q5:订单微服务拆分与 Spring Cloud 组件
I: 我们做本地生活,订单相关服务主要包括:
- 订单服务(order)
- 支付服务(payment)
- 库存服务(inventory)
- 营销优惠服务(promotion)
现在用 Spring Cloud + OpenFeign + Nacos/Consul 注册中心。说说:
- 服务间调用为什么建议用 OpenFeign,而不是自己写 RestTemplate?
- 调用链路如何做熔断与限流?
Y: Feign 写起来更优雅一些嘛,有接口就可以调用,还能配置日志。熔断限流嘛,我一般就上 Sentinel 或者 Resilience4j,配个线程池隔离,失败就降级。
I: 线程池隔离说细一点?
Y: 就是……不同接口用不同线程池?防止互相影响?
I: 好,有点感觉,但还比较模糊。待会我用一个“支付依赖第三方风控”的例子给你讲清楚。
Q6:数据库、连接池与事务隔离
I: 订单库使用 MySQL + HikariCP,读写分离。下单流程会涉及:
- 插入订单表
- 扣减库存
- 冻结优惠券
在 Spring 事务里:
- 你会选择什么 事务传播级别?
- 数据库事务隔离级别一般用哪种?为什么?
Y: 嗯,这个一般就 @Transactional 默认的,传播是 REQUIRED,隔离就是数据库默认的 REPEATABLE_READ。
I: 如果库存服务在另一个微服务里,用本地事务还能保证一致性吗?
Y: 呃……那就用分布式事务?比如 Seata?
I: 分布式事务不是银弹,成本很高。我们常用的还有最终一致性方案,后面我在答案区帮你展开。
Q7:Redis 缓存与缓存一致性
I: 在「内容社区 + 本地生活」里,我们会缓存很多热点数据,比如:
- 商家店铺详情
- 爆款团购活动
- 推荐视频列表
用 Redis + Spring Cache 或自己封装。你会怎么设计缓存策略,以避免:
- 缓存雪崩
- 缓存击穿
- 缓存穿透
Y: 啊这个我知道:
- 雪崩就随机过期时间
- 击穿就加锁或者用互斥锁
- 穿透就加布隆过滤器
I: 嗯,这块你答得比较完整,还不错。但要注意具体到「商家详情」这样的场景,细节会有区别。
Q8:Kafka 订单事件与 Elasticsearch 搜索
I: 我们会把订单、用户评价、商家更新等事件通过 Kafka 投递,落到 Elasticsearch 里做搜索和 BI 分析。请你设计:
- Kafka Topic 的简单划分方案
- 消费端如何保证「至少一次」语义下,避免消息重复消费导致 ES 数据重复?
Y: Topic 就按业务来分,比如 order-topic、shop-topic。重复消费的话,我一般就写个幂等逻辑,比如先查一下再写?
I: 查一下再写,单机还行,高并发怎么做?
Y: 嗯……这个就,用文档 ID 做幂等?
I: 对,这个方向就对了,可以再系统化一点。
第三轮:AI 智能客服、RAG、链路追踪与 DevOps
业务背景补充
平台最近上线了一个「智能客服 + 内容问答 + 营销导购」系统,支持:
- 用户问:「附近好评高的日料店?」
- 智能客服给出:地图列表 + UGC 笔记摘要 + 实时优惠券
底层使用:
- Spring Boot + Spring Cloud
- Spring AI + RAG(检索增强生成)
- 向量数据库:Milvus
- Embedding 模型:OpenAI / 自建 Ollama
Q9:RAG 检索增强生成架构
I: 说一下你理解的 RAG(检索增强生成)流程。如果让你在 Java 侧用 Spring AI 做一个简单的「本地生活问答」,整体架构会怎么画?
Y: 嗯……RAG 就是,先检索再生成。用户问题来了,我就去搜索一下知识库,然后把结果和问题一起丢给大模型,让它回答……Spring AI 我还没怎么用,但是我感觉就是封装一下 HTTP 调用?
I:
- 文档向量化在哪一步?
- 向量库用什么?Milvus/Redis/Chroma 怎么选?
- 如何控制 AI 不乱说(降低幻觉)?
Y: 嗯……这个就,离线的时候先向量化嘛,存起来,查询的时候做相似度搜索。幻觉就让它别瞎编……
I: 说得太抽象了,稍后我会给你画一条完整链路,带上 Spring AI、向量库、业务限权。
Q10:微服务调用链追踪与故障排查
I: 智能客服调用链比较长:
- API 网关
- 用户画像服务
- 内容检索服务(ES + 向量库)
- 推荐排序服务(Flink 实时特征)
- LLM 网关(Spring AI)
我们使用 Spring Cloud Sleuth / Micrometer + Zipkin/Jaeger 做链路追踪。一次故障中,用户反馈「智能客服很慢」。你会如何利用链路追踪来定位问题?
Y: 就,看一下链路图嘛,看哪个服务慢,就去优化那个服务?
I: 你会关注哪些指标?
Y: RT、QPS、错误率?
I: 嗯,有点概念,但排查步骤要更细,否则线上一着急就乱看。我待会写一套排查清单。
Q11:CI/CD、灰度发布与配置管理
I: 我们是 GitLab CI + Jenkins + Kubernetes 部署,Spring Cloud Config 做配置中心。智能客服这一块经常调模型参数和提示词(Prompt)。
- 你如何设计 灰度发布,只让 10% 流量先走新版本?
- 模型参数(比如 temperature、top_p)和 Prompt 模板放哪里更合适?
Y: 灰度嘛,我一般就用两个 Deployment,一个新版本,一个旧版本,然后 K8s Service 按比例分发?参数和 Prompt 我就放配置中心,改起来方便。
I: K8s Service 本身不支持权重路由,你说的是 Istio 之类的 Service Mesh 吧?
Y: 哦对对对,就是那个……我名字记不太清。
I: 嗯,思路方向对,但概念需要更严谨。
Q12:安全与风控(JWT & OAuth2)
I: 我们平台有:
- 用户端 App / 小程序
- 商家管理后台
- 平台运营后台
登录认证用 OAuth2.1 + JWT,部分对接三方平台(支付、地图)用到了 Keycloak。你能说说:
- JWT 的优点和常见缺点?
- 如何在网关层做统一鉴权和权限校验?
Y: JWT 就是不用查数据库,信息都在 token 里,性能好。缺点就是太长,还有泄露就麻烦。鉴权就网关解析一下 token,然后看看权限。
I: 权限细粒度怎么做?比如商家只能看自己的店铺数据?
Y: 就在 token 里带店铺 ID?
I: 也可以,不过还需要结合后端再做一次资源级校验。好,这一轮先到这儿。
面试结束
I: 好的,小 Y,今天先聊到这。整体感觉是:
- Java 基础和常见中间件,你有一定使用经验;
- 在复杂场景上,很多时候只能说个大概。
我们内部会再综合评估,你先回去等通知,有结果 HR 会联系你。
Y: 好的好的,那我等你们好消息!
答案与详细讲解(给小白看的部分)
下面是对上面所有问题的系统讲解,按主题整理,适合新手系统自学。可以当作「本地生活 + AI 内容社区」技术栈速成笔记。
一、接口幂等性与高并发下单
1. 创建订单接口的幂等性设计
典型场景:用户点击「立即下单」多次,后端必须保证:
- 至多生成一个有效订单
- 支付金额、库存扣减不能重复
常见设计方案:
-
业务幂等键(更推荐)
- 前端在下单前,先向后端申请一个
requestId或bizId(比如order_token)。 - 下单请求必须携带这个
bizId,数据库中为此bizId建唯一索引。 - 后端逻辑:
- 收到请求时,先尝试插入一条订单记录,主键或唯一索引包含
bizId。 - 如果插入成功:说明是第一次请求。
- 如果报唯一键冲突:说明是重复请求,直接查询已有订单返回。
- 收到请求时,先尝试插入一条订单记录,主键或唯一索引包含
- 前端在下单前,先向后端申请一个
-
幂等表 / 去重表
- 单独搞一张
idempotent_request表,记录处理过的requestId,状态(处理中/成功/失败)。 - 每次请求先尝试插入
requestId:- 插入成功:继续业务处理;
- 插入失败:查历史处理结果,直接返回。
- 单独搞一张
-
分布式锁(Redis/Redisson)
- 适合作为补充手段,而不是唯一方案。
- 缺点:
- 锁粒度不好控制
- 需要考虑锁失效、锁续期
- 与业务数据库仍需配合唯一约束
-
为什么不能只靠前端按钮置灰?
- 前端可以被绕过(F12、抓包重放)。
- 网络抖动、重试机制仍然可能重复发请求。
总结:数据库唯一键 + 业务幂等 ID 是最稳妥的方案,分布式锁只是「辅助控并发」,不能取代幂等设计。
2. JVM 内存配置与 GC 调优
在 K8s 容器中,假设每个 Pod 限制 4G 内存:
-
Heap 不要占满容器内存
- 需要预留:
- Metaspace
- 线程栈
- DirectBuffer / NIO
- JVM 自身、C 库
- 一般经验:
-Xmx设置为容器内存的 50%~70%。
- 需要预留:
-
示例配置(G1)
-Xms2g -Xmx2g \ -XX:+UseG1GC \ -XX:MaxGCPauseMillis=200 \ -XX:+UseStringDeduplication \ -XX:+ParallelRefProcEnabled \ -XX:InitiatingHeapOccupancyPercent=45 \ -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/logs/gc.log -
如何排查 Full GC 导致 RT 抖动?
- 第一步:通过 Prometheus + Grafana / APM(如 New Relic)观察:
- JVM Heap 使用率
- GC 次数、GC 耗时
- 第二步:结合 GC 日志分析:
- 是否频繁 Full GC
- 哪一代回收时间长(老年代 / humongous 对象)
- 第三步:代码层检查:
- 大对象频繁创建(比如 JSON 大实体、Byte[])
- 热点接口对象池化、复用
- 使用
-XX:+HeapDumpOnOutOfMemoryError捕获堆快照,用 MAT / VisualVM 分析内存泄漏
- 第一步:通过 Prometheus + Grafana / APM(如 New Relic)观察:
小白记忆口诀:Heap 不要配满容器、监控 GC 曲线、发现 Full GC 先看内存分配和大对象。
二、Maven 多模块与 Spring MVC / WebFlux 选型
1. Maven multi-module 典型结构
order-parent
├── order-api # 对外暴露的接口定义(DTO、Feign 接口)
├── order-service # 业务逻辑(Controller、Service)
└── order-dao # DAO、Repository、MyBatis Mapper
``
`parent` POM 一般放:
- 通用依赖版本管理(`<dependencyManagement>`)
- 统一插件版本(编译插件、打包插件、代码检查插件)
- Java 版本、编码格式等配置
`dependencyManagement` 的关键点:
- **只声明版本,不真正引入依赖**。
- 子模块需要时写 `<dependency>`,无需再写 `<version>`。
### 2. Spring MVC vs Spring WebFlux
对比维度:
| 维度 | Spring MVC | Spring WebFlux |
|---------------------|--------------------------------------|-------------------------------------------|
| IO 模型 | 同步阻塞(Servlet) | 异步非阻塞(Reactor) |
| 编程复杂度 | 低,大家都熟 | 高,响应式流式 API,debug 较难 |
| 适用场景 | 大多数常规业务、管理后台 | 大量 IO 等待(网关、聚合、多下游调用) |
| 生态 | 成熟丰富 | 在增长,但学习成本高 |
在「本地生活+内容社区」里:
- 下单、支付、商家后台:**Spring MVC 足够**。
- API 网关、聚合多下游(推荐服务调用多个后端):**可以考虑 WebFlux**,但要评估团队能力。
> 选型原则:**优先保证团队可维护性,而不是盲目追求“高并发技术光环”。**
---
## 三、微服务调用、事务与缓存
### 1. Spring Cloud + OpenFeign + Resilience4j
典型调用链:`order-service` → `inventory-service` → `promotion-service`。
**为什么建议用 OpenFeign?**
- 声明式 REST 客户端:接口 + 注解 = HTTP 调用
- 与 Spring Cloud 生态(LoadBalancer、Config)整合好
- 支持日志、拦截器、编码器/解码器扩展
**熔断与限流(以 Resilience4j 为例)**
- 熔断:访问下游失败率超过阈值,短时间「熔断」请求,避免雪崩。
- 隔离:比如「支付风控服务」慢时,不影响其他接口,可用:
- 线程池隔离:不同下游使用不同线程池,避免全部线程被卡死。
- 信号量隔离:限制同时并发请求数。
示意:
```java
@FeignClient(name = "payment-service")
public interface PaymentClient {
@GetMapping("/pay")
PaymentResult pay(@RequestParam("orderId") Long orderId);
}
@CircuitBreaker(name = "payment", fallbackMethod = "payFallback")
public PaymentResult invokePay(Long orderId) {
return paymentClient.pay(orderId);
}
小白理解:Feign 负责优雅调用,下游出问题时,用 Resilience4j 帮你「断路、限流、降级」,防止整个系统被拖垮。
2. 事务传播与分布式一致性
本地事务中:
- Spring 默认传播级别
REQUIRED:有事务就加入,没有就新建 - 数据库隔离级别 MySQL 默认
REPEATABLE_READ:避免幻读(InnoDB 特性)
在「下单(订单+库存+优惠券)」里:
- 单库单服务:本地事务就能搞定。
- 多微服务:本地事务无法跨服务,需要:
- 两阶段提交 / 分布式事务(Seata、XA)
- 一致性高,但实现复杂、性能损耗大。
- 最终一致性(更常用)
- 下单核心流程只保证「订单主状态 + 支付状态」强一致。
- 库存、优惠券等通过消息(Kafka/RabbitMQ)异步调整。
- 引入「补偿机制」与「对账任务」。
- 两阶段提交 / 分布式事务(Seata、XA)
大厂普遍:对钱和订单强一致,对周边状态走「至少一次 + 幂等 + 补偿」的最终一致性。
3. Redis 缓存三兄弟:雪崩、击穿、穿透
以「商家详情」为例:
-
缓存雪崩
- 问题:大量 Key 在同一时间失效,瞬间打爆数据库。
- 方案:
- 过期时间加随机值,比如
600s + random(0, 60) - 对核心数据增强多层缓存(本地 Caffeine + Redis)
- 过期时间加随机值,比如
-
缓存击穿
- 问题:单个热点 Key 失效时,大量请求同时打 DB。
- 方案:
- 互斥锁(mutex):一个线程负责回源,其余等待。
- 提前主动刷新:监控访问量,对热点 Key 做「快过期前续命」。
-
缓存穿透
- 问题:请求大量不存在的数据,缓存查不到,DB 也查不到。
- 方案:
- 布隆过滤器:提前把所有合法 ID 放入过滤器
- 对不存在的结果也进行短期缓存(缓存 Null)
小白口诀:雪崩看「一片失效时间」;击穿看「某个热点 key」;穿透看「大量非法 key」。
4. Kafka + Elasticsearch 幂等消费
- Topic 划分建议:按「业务 + 场景」划分,如:
order-created,order-paid,shop-updated,ugc-published。 - 为避免 ES 中数据重复:
- 使用 业务主键作为 ES 文档 ID:
- 比如订单文档 ID 使用
orderId - 再消费同一条消息,只会覆盖更新,不会插入新文档
- 比如订单文档 ID 使用
- 消费幂等:
- 为每条消息包含
eventId,在存储层做去重(比如 Redis set / DB 表)
- 为每条消息包含
- 使用 业务主键作为 ES 文档 ID:
实战常用策略:用业务 ID 当 ES docId,保证「幂等更新」;再结合消息 offset 提交策略与消费重试机制。
四、AI 智能客服与 RAG 架构
1. RAG 流程总览
以「附近好评高的日料店?」为例:
-
离线阶段
- 收集:商家信息、用户评价、UGC 笔记、攻略文章
- 文档切分:按段落/句子进行切分
- 向量化:调用 Embedding 模型(OpenAI / 自建 Ollama Embedding)
- 存储:向量写入向量数据库(Milvus/Chroma/Redis-Search),同时保留原文引用
-
在线问答阶段
- 用户提问 → API 网关 → 智能客服服务
- 智能客服服务:
- 对用户问题做向量化
- 在向量库中做相似度搜索,检索 Top-K 片段
- 将问题 + 相关片段 + 系统提示词(Prompt)组装成上下文
- 调用大模型(通过 Spring AI 封装的客户端)
- 返回答案 + 相关店铺卡片
2. Spring AI 在 Java 中的角色
Spring AI 帮你做:
- 模型客户端封装(OpenAI / Azure / 自建模型网关)
- Prompt 模板化(提示填充)
- 工具调用(函数调用、工具执行框架)
- 会话内存(Conversation Memory)
示意伪代码:
ChatClient chatClient = ...; // Spring AI 提供
String prompt = template.render(Map.of(
"question", userQuestion,
"documents", retrievedDocs
));
ChatResponse response = chatClient.call(prompt);
String answer = response.getResult();
3. 减少 AI 幻觉的关键手段
-
检索质量:
- 向量库召回要准确,避免拿到不相关文本
- 可以结合「向量检索 + 关键字检索」混合检索
-
强约束 Prompt:
- 明确要求模型「只根据给定文档回答」
- 不知道就说不知道,不要编造
-
输出后验证:
- 对某些关键字段(比如价格、地址)在业务端二次校验
- 不可信的内容不给出具体信息,改为引导用户点击「查看详情」
小白理解:RAG = 搜索 + GPT。搜索负责「找到相关内容」,GPT 负责「生成自然语言答案」,两者结合,才适合企业业务场景。
五、链路追踪、监控与故障排查
1. 调用链:智能客服为什么慢?
链路:网关 → 画像 → 内容检索 → 推荐 → LLM 网关 → 大模型
使用 Zipkin/Jaeger 可以看到:
- 每个服务的 span 耗时
- 请求在每个服务的时间分布
排查步骤:
- 看哪一段耗时最长:是 ES 查询慢?向量库检索慢?还是 LLM 返回慢?
- 再深入到具体服务:
- 看接口级别 RT、QPS、错误率
- 对照最近发布记录和配置变更
- 协同查看:
- Prometheus(CPU、内存、线程池)
- 日志系统(ELK / Loki)
要形成「排查 SOP」:先看整体链路 → 定位慢点 → 再看该服务内部监控和日志。
六、CI/CD、灰度与配置管理
1. 灰度发布常见实现
在 K8s 环境下:
-
基于 Service Mesh(Istio 等):
- VirtualService 中配置流量权重:
route: - destination: host: ai-service subset: v1 weight: 90 - destination: host: ai-service subset: v2 weight: 10 -
基于网关或自研路由:
- 通过用户 ID、AB 实验配置,将部分用户打到新版本
2. 模型参数与 Prompt 配置化
- 不要把 temperature、top_p、Prompt 模板写死在代码中
- 推荐:Spring Cloud Config / Nacos 配置中心
- 需要注意权限控制,防止误操作大面积影响线上
小白记忆:代码里埋「key」,配置里调「味道」。
七、安全与风控:JWT、OAuth2、Keycloak
1. JWT 优缺点
优点:
- 无状态:服务端不需要保存 Session,适合微服务
- 携带信息多:用户 ID、角色、过期时间等
缺点:
- 一旦签发,短期内无法「单点作废」(除非黑名单方案)
- 过长,Header 会变大
- 泄露风险:谁拿到 token 都能冒充用户
2. 网关统一鉴权
流程:
- API Gateway 拦截请求,提取 Authorization Header(Bearer token)
- 使用公钥验证 JWT 签名、过期时间
- 从 token 中解析出:用户 ID、角色、租户、店铺 ID 等
- 将这些信息放入请求头 / 上下文,传给后端服务
后端服务再次做「资源级权限校验」,比如:
- 查询商家订单时,判断
token.shopId == path.shopId
Keycloak 可以统一管理:
- 客户端(前端应用、第三方服务)
- 角色与权限
- 单点登录与第三方登录(OAuth2)
总结:面试故事背后的技术地图
通过这场「本地生活 + 内容社区 + AI 智能客服」的大厂 Java 面试,我们实际上串了一整套技术地图:
- Java 基础与 JVM:内存、GC、GC 调优
- Spring 全家桶:Spring Boot、Spring MVC/WebFlux、Spring Cloud、OpenFeign、Spring Security
- 数据库与中间件:MySQL + HikariCP、Redis、Kafka、Elasticsearch
- 微服务治理:熔断、限流、链路追踪(Micrometer + Zipkin/Jaeger)
- DevOps:Jenkins/GitLab CI + Docker + Kubernetes + 灰度发布
- AI 能力:Spring AI、RAG、向量数据库(Milvus/Redis/Chroma)、Embedding 模型
如果你是小白,可以按这个顺序学习:
- 先打 Java SE + JVM 基础
- 再学 Spring Boot + Spring MVC + MyBatis/JPA 做简单业务
- 然后上手 Spring Cloud + 中间件(Redis/Kafka/ES) 做电商/本地生活小项目
- 最后引入 Spring AI + RAG,做一个「智能客服 + 导购问答」的完整 Demo
等你把这些串起来,再去大厂面试时,就不会像小 Y 那样一到复杂问题就开始糊弄,而是能从「业务场景 → 技术方案 → 取舍理由」完整讲清楚。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)