面灵AI

携程后端面经合集:RAG 评估、库存分片与 Java 基础

时间
2026-09
来源
牛客网

《面试题目》

2026 年 9 月 11 日:RAG 与库存系统

  1. 两个项目各自解决什么问题,为什么要做?
  2. RAG 项目的目标怎样定义,如何判断效果是否达到目标?
  3. 如果要继续迭代,你会怎样设计评估方案?
  4. 语义切分有哪些实现办法,多格式文档怎样解析?
  5. Tika 处理表格时会得到什么结果,怎样保留表格的信息?
  6. 文档切分标准怎样确定,结构化切分后段落太短怎么办?
  7. 检索的召回率和准确率怎样统计,阈值怎样选择?
  8. 每 N 条消息触发一次摘要,N 怎样确定,改成动态策略要考虑什么?
  9. 压缩上下文时,怎样保留关键内容?
  10. 项目中投入最多、设计最复杂的功能是什么?
  11. 秒杀系统目前支持多少 QPS,进一步提升应从哪里入手?
  12. 怎样判断和扣减库存,并向用户返回准确结果?
  13. 单个 Redis 达到性能上限后如何扩展,请求怎样路由到分片?
  14. 同一商品的库存能否拆成相互独立的份额,扣减请求怎样分配?
  15. 不同库存分片余量不均衡时如何处理?
  16. 平时怎样使用辅助编程工具,如何管理提示词和补充上下文?

2026 年 8 月 18 日:数据结构与并发

  1. 项目中的技术难点是怎样分析和解决的?
  2. Java 常见的数据结构各适合什么场景,数组和链表的操作成本有什么区别?
  3. 栈与队列有什么特点,怎样只用队列实现栈、只用栈实现队列?
  4. 二叉树有哪些遍历方式,深度优先与层序遍历分别怎样实现?
  5. 常见排序算法有哪些,快速排序何时退化到 O(n²)?
  6. 爬楼梯问题怎样定义动态规划状态和转移?
  7. 什么是线程安全,Java 中有哪些实现方法?
  8. synchronized 锁类对象与锁实例有什么区别?
  9. CAS 是怎样工作的,ABA 问题怎样处理?
  10. 什么是可重入锁,synchronized 为什么可以重入?
  11. HashMap 的结构是什么,树化与退化为什么采用不同阈值?
  12. MySQL 索引怎样加快查询?
  13. 有“类别、年份、姓名”联合索引时,查询某年某类某作者的书能否使用索引?
  14. 全国大量用户在同一时刻提交收入信息,怎样保证系统承载能力和汇总准确性?

2026 年 8 月 15 日:数据库与 JVM

  1. 成绩表只有学科、学号、分数,如何查询总分超过 600 的学生及其总分?
  2. undo log、redo log 和 binlog 各有什么用途?
  3. MySQL 的两阶段提交解决什么问题?
  4. 同步复制和异步复制有什么区别?
  5. 从输入 URL 到页面显示,中间经过哪些步骤?
  6. 进程间有哪些通信方式,项目中用过哪些设计模式?
  7. ThreadLocal 的原理和用途是什么?
  8. volatile 能保证什么,能否单独保证复合操作的线程安全?
  9. B+ 树有哪些特点,聚簇索引与二级索引有什么区别?
  10. 哪些查询条件或写法会影响索引利用?
  11. JVM 的运行时内存区域怎样划分?
  12. 两个字符串的编辑距离怎样用动态规划求解?

2026 年 6 月 5 日:RAG 方案选择与项目复盘

  1. RAG 项目遇到过哪些问题,用了什么向量数据库,分块还有哪些备选方案?
  2. 为什么需要向量检索,直接做文本匹配适合什么情况?
  3. 查询重写、问题拆分和术语归一化怎样实现?
  4. 项目解决了什么具体需求,方案选择时怎样权衡收益和代价?
  5. 平时怎样学习,从书和文档中学到了哪些可用于项目的思想?
  6. 自己有哪些长处和不足,从其他面试中得到了什么反馈?
  7. 除 MySQL 外用过哪些数据库,MySQL 适合和不适合哪些场景?
  8. redo log 的持久性受哪些条件影响,怎样降低故障时的数据损失?
  9. 缓存用在什么位置,延迟双删适合什么场景?
  10. 项目组有怎样的 Agent 业务,对实习生有哪些要求?

2026 年 5 月至 4 月:事务、缓存与消息

  1. 事务的 ACID 特性和四个隔离级别是什么?
  2. RC 和 RR 下,Read View 的生成时机有什么区别?
  3. 按不存在的主键做共享锁查询,RC 和 RR 下可能分别锁住什么?
  4. B 树和 B+ 树有什么区别?
  5. Redis 分布式锁怎样实现,缓存与数据库怎样保持一致?
  6. 消息系统没有现成延迟消息能力时,延迟删除任务怎样执行?
  7. Redis 与 Caffeine 的多级缓存怎样组织?
  8. 为什么用 Elasticsearch 存日志,比较过哪些其他存储方案?
  9. 监控告警怎样产生,异常数据有哪些类型?
  10. 多线程用在什么场景,线程池参数如何得出,完整执行流程是什么?
  11. 分库分表按什么规则划分,需要解决什么问题?
  12. Redis 有哪些内存淘汰策略?
  13. 生产者和消费者分别怎样保证消息可靠处理?
  14. JDK 21 相比 JDK 8 有哪些值得关注的变化,常见 GC 算法有哪些?
  15. 怎样使用 Redis 实现按自然日去重?
  16. Java 异步编程有哪些办法,CompletableFuture 怎样组合任务?
  17. 事务有哪些类型?

《参考解析》

RAG 评估先拆开检索和回答

准备一批有出处、能人工判断对错的问题,覆盖同义问法、表格、多段关联和资料中没有答案的情况。检索阶段看相关片段是否被找回,以及无关片段占多少;回答阶段再看结论正确性、引用是否支持结论、没有证据时是否明确说明。

如果只看回答是否流畅,检索遗漏很容易被掩盖。分块长度、重叠范围和检索数量应在同一批样本上比较,表格中的行列关系也应保留,不能仅按字符数硬切。

库存分片的前提是总量守恒

给各分片分配库存额度后,所有额度之和必须等于可售总量。每个分片原子地检查和扣减自身额度,订单请求通过唯一业务编号去重。某个分片售罄、其他分片仍有库存时,可以重新路由或转移额度,但额度转移本身也必须避免重复扣减和重复增加。Redis Cluster 的键路由不等于自动拆分一个库存键。

总分查询

SELECT student_id, SUM(score) AS total_score
FROM scores
GROUP BY student_id
HAVING SUM(score) > 600;

这里假设一行是一名学生某门课程的一次有效成绩。如果有补考或多次考试,要先明确采用哪一次,不能直接把所有记录相加。

编辑距离

令 dp[i][j] 表示第一个字符串前 i 个字符变成第二个前 j 个字符的最少操作数。末尾字符相同则取 dp[i-1][j-1];否则在删除、插入、替换三种代价中取最小值再加一。边界为 dp[i][0]=i、dp[0][j]=j。完整表时间和空间均为 O(mn),只求距离时可用滚动数组降低空间。

自然日去重要把时区说清

把业务日期放进键名,用 Set 等结构记录当日已经出现的标识。过期点取业务时区的下一个零点,而不是简单设成“当前时间再过 24 小时”。跨日重试是否算新请求,需要由业务约定;如果去重承担订单等操作的正确性,数据库唯一约束也要参与。