面灵AI→

去哪儿 AI 全栈工程师秋招面试

轮次
AI面
时间
2026-09
来源
牛客网

《面试题目》

  1. 选择题:选 Java 还是 TypeScript?
  2. ES6 里的 Set、Map 和普通对象、数组有什么区别,分别适用什么场景?
  3. 介绍一下 Redis 的 AOF 和 RDB。
  4. MySQL 数据量很大、分页页数很多时,怎么优化深分页查询?
  5. RAG 的流程是怎样的?
  6. RAG 的效果怎么评估?
  7. RAG 里的文档切片怎么做?
  8. 讲解一下自己做过的全栈项目。
  9. 你是怎么借助大模型一起开发项目的?它生成的代码效果和质量如何?

《参考解析》

Set、Map 与对象、数组的取舍

数组是有序的索引集合,取值靠下标,做包含判断要遍历;普通对象本质是字符串键的哈希表,适合描述实体结构,但键只能是字符串或 Symbol,且原型链上的属性会干扰判断。Set 存不重复的值,Map 的键可以是任意类型且保持插入顺序,两者的 has/get/delete 都是均摊 O(1)。工程上的判据很简单:需要按值去重或频繁判断存在性用 Set,需要用对象或函数当键、或需要稳定的迭代顺序用 Map,需要顺序和下标语义才用数组。

Redis 的 AOF 与 RDB

RDB 是某个时间点的全量快照,文件紧凑、恢复快,适合做备份和主从全量同步,缺点是两次快照之间的数据会丢。AOF 追加写命令,按 appendfsync 的策略(always / everysec / no)在持久化强度与性能之间取舍,文件更大、恢复更慢,但可以把丢失窗口压到一秒以内。生产上通常是两者同时开,重启时优先用 AOF 重放;AOF 还需要重写来压缩体积,4.0 之后用混合持久化把 RDB 快照和增量 AOF 拼在一个文件里,兼顾恢复速度和完整性。

MySQL 深分页怎么优化

limit 1000000, 20 慢的原因不是返回 20 行,而是引擎层要按二级索引扫描并回表取出前一百万行、再全部丢掉。三条常规路子:① 用覆盖索引先只取主键(select id from t where ... order by ... limit ...),再拿主键回表取数据,把回表次数从百万级降到 20 次;② 记住上一页的位置做游标分页,where id > 上一页最后一个 id order by id limit 20,把 offset 变成范围条件,代价是不能跳页;③ 业务上收口,限制可翻页数或用搜索/筛选替代深翻页。如果排序字段和过滤条件能组合成联合索引,让排序走索引而非 filesort,收益最大。

RAG 的完整流程

离线侧是文档解析(PDF/HTML/表格),清洗后按一定策略切块,用 embedding 模型向量化写进向量库,同时保留原文与元数据(来源、章节、权限);在线侧把用户问题改写或扩展,做向量检索(常配 BM25 做混合检索),再经过重排模型精排取 top-k,拼进提示词交给大模型生成,最后附上引用来源。真正决定效果的是中间几步:切块粒度、查询改写、混合检索与重排,生成只是最后一公里。

切片策略怎么定

切片要在「语义完整」与「检索精度」之间找平衡:块太大,向量被稀释、召回不准且浪费上下文;块太小,句子被切断、答案缺上下文。常见做法是按标题层级或段落切,再给相邻块加重叠(overlap 10%~20%),保留章节标题拼进块内容作为上下文;表格和代码单独处理,别按字符数硬切。落地时用同一批真实问题跑离线评测,比较不同块大小与重叠率的召回率,而不是拍脑袋定一个 512。

RAG 效果怎么评估

离线用带标注的问题集算检索侧的召回率、命中率、MRR,生成侧用忠实度(答案是否只依据检索内容)与相关性打分,能自动化的一部分靠规则和模型评分,关键样本仍要人工看。在线看用户行为:追问率、点开引用来源的比例、点踩反馈,以及「检索为空」的比例——检索为空往往说明知识库覆盖不足而不是模型不行。评估的关键是把检索问题和生成问题分开,否则调了半天提示词却发现是召回没拿到正确的块。