面灵AI→

合肥某头部企业 软件开发实习面试:33 题追问 RAG、MySQL 与 AI Coding

时间
2026-09
来源
牛客网

《面试题目》

原定半小时的会议追问了整整一个小时,问题集中在一个医疗问答项目上。

项目与 RAG(1~9)

  1. 请做一下自我介绍,并介绍一下你的个人项目。
  2. 介绍一下你的医疗问答项目,项目整体是怎么实现的?
  3. 你的医疗数据从哪里获取?Python 爬虫具体做了什么?
  4. 不同格式的文档如何处理?原生 PDF 和扫描 PDF 有什么区别?
  5. 文档进入 RAG 前为什么要切分?为什么选择 512 tokens?
  6. 文档切分之后如何进行 Embedding 和向量化?
  7. 你的 RAG 检索流程是什么?为什么使用 BM25、RRF、MMR?
  8. BM25 的原理是什么?
  9. MMR 的作用是什么?为什么能够提高检索结果的多样性?

MCP、LangChain 与 AI Coding(10~17)

  1. 什么是 MCP?MCP 在项目中是怎么使用的?底层协议了解多少?
  2. 什么是 LangChain?你在项目中具体怎么使用 LangChain?
  3. 什么是 ReAct?ReAct 的执行流程是什么?
  4. 你的项目如何管理大模型上下文?为什么需要滑动窗口和上下文压缩?
  5. 你平时如何使用 AI Coding?具体使用过哪些工具?
  6. 你如何选择不同的大模型?Claude、GPT、DeepSeek 等模型分别在什么场景使用?
  7. 你拿到一个新需求之后,如何利用 AI 完成从方案设计到代码实现?
  8. 如何避免 AI 生成错误代码?如何进行代码 Review、安全检查和接口测试?

接口、数据库与线上排查(18~27)

  1. 你的接口文档是怎么设计和生成的?是编码前设计还是编码后生成?
  2. 你的数据库表是怎么设计的?表之间有什么关系?索引如何设计?
  3. MySQL 默认事务隔离级别是什么?什么是 MVCC?
  4. Undo Log 有什么作用?为什么说 Undo Log 与 MVCC 有关系?
  5. #{} 和 ${} 有什么区别?为什么 ${} 存在 SQL 注入风险?
  6. 什么是深分页?为什么深分页会变慢?如何优化?
  7. 什么是数据库连接池?为什么需要连接池?Druid 有哪些核心参数?
  8. 如果 Java 项目出现 OOM,你会如何排查?
  9. 常用的 JVM 排查工具有哪些?jps、jstat、jmap、jstack 分别有什么作用?
  10. Linux 中如何搜索错误日志?grep 和 wc 分别有什么作用?

Nginx、Docker 与岗位理解(28~33)

  1. Nginx 是什么?什么是反向代理?
  2. Nginx 的 server、location、proxy_pass 分别有什么作用?如何将请求转发到 Spring Boot?
  3. 你在项目中如何使用 Docker?常用 Docker 命令有哪些?
  4. 你是否使用过 Logback、Fastjson、Jackson、POI 等 Java 开源工具?
  5. 你如何理解这个岗位的数据供给与管理平台?
  6. 如果面对 PB 级音频、视频、图像数据,如何进行数据清洗、去重、脱敏、质量评测和数据集管理?

《参考解析》

  1. 切分粒度与 512 tokens:答案要落在「为什么」,不是「多少」:切分的目的是让检索单元与语义单元对齐——块太大,检索回来的内容混着多个主题、噪声多还占上下文;块太小,一句半句缺前提,模型答不全。512 tokens 是一个工程折中:够装下一个小节或两三个段落,又在常见 Embedding 模型的输入上限(多为 512 或 8192)内,且单块成本可控。完整的回答还要带上策略:按结构切(标题、段落、表格)优先于按固定长度硬切;相邻块留 10%~20% 重叠避免句子被切断;每个块带上来源、章节、页码等元数据,检索回来能溯源;医疗这类领域文档还要保留药品名、剂量、适用人群等实体不被截断。

  2. BM25、RRF、MMR 是三层不同的问题,别混成一个:BM25 解决的是关键词召回——在 TF-IDF 基础上加了词频饱和与文档长度归一化,问句里的专有名词、药品名、编号靠它才捞得回来,向量检索对这类稀有词反而不敏感,所以两者互补(这就是混合检索)。RRF(倒数排名融合)解决的是「两路结果怎么合并」——按名次而非分数融合,因为 BM25 分值和余弦相似度根本不在一个量纲上,直接加权需要调参且不稳定,RRF 只用一个常数 k 就能鲁棒地合并。MMR(最大边际相关)解决的是「结果太像」——在相关性和与已选结果的相似度之间做权衡,每次挑一个既相关、又与已选内容差异最大的块,让有限的名额覆盖更多角度。答这题把「召回 → 融合 → 去冗余」三段讲开,面试官就知道你是在做检索工程而不是调库。

  3. MCP 与 LangChain:制度性概念要答准,不确定的部分坦白:MCP(模型上下文协议)是让模型与外部工具、数据源对接的标准化协议,服务端暴露能力、客户端(宿主应用)按需调用。底层是 JSON-RPC 2.0 消息,支持 stdio 与 HTTP 加 SSE 两种传输,连接建立时双方协商协议版本与能力集,主要的三类原语是工具(tools)、资源(resources)和提示模板(prompts)。答到不确定的细节(具体版本号、鉴权字段)时说明「这块我按文档理解,没在生产里深挖过」,比硬编一个协议细节安全。LangChain 那一问落到「我用它做了什么、为什么没用它的全部」:常用的是模型与提示封装、文档加载与切分、检索器与链的组合、以及回调做可观测性;它的问题是抽象层厚、出问题难定位,所以关键链路会直接用厂商 SDK。

  4. AI Coding 的问答要点在「防错机制」,不是工具清单:被问怎么用 AI 写代码,面试官真正想听的是流程:需求先让模型复述并列出假设,人确认后再出方案;方案里明确接口、数据结构和边界条件,再让它按小步生成,每步能编译能测;代码评审时重点看模型最容易犯的四类错——凭空引入不存在的 API、边界与异常处理缺失、并发与事务语义写错、安全漏洞(拼接 SQL、越权校验缺失);最后用单元测试与接口测试兜底,再把改动过一遍安全扫描和依赖检查。上下文管理那题可顺手一起答:保留最近若干轮对话、把早期结论压缩成要点、把稳定的项目约定固化进系统提示、把大文件按需检索而不是整份塞进上下文。

  5. MVCC 与 Undo Log 是同一道题的两面:MySQL InnoDB 的默认隔离级别是 RR(可重复读),它靠 MVCC 实现「同一事务里多次读结果一致」。每行有隐藏的事务 ID 和回滚指针,Undo Log 记录这一行的历史版本,回滚指针串成版本链;读的时候按 Read View 判断哪个版本可见——自己事务的改动可见,未提交的别人改动不可见,Read View 生成之前提交的可见。所以 Undo Log 既是回滚的依据,也是快照读的数据来源,这就是两者绑在一起的原因。要注意区分快照读(普通 select 走 MVCC)与当前读(select ... for update、update、delete 走锁),以及 RR 下间隙锁用来防幻读。Undo Log 由 purge 线程在没人需要那些版本后才清理,长事务会拖住清理、让 Undo 表空间膨胀,这是很实用的一个延伸点。

  6. 深分页与连接池:都是「为什么会慢/为什么需要」的题:深分页慢在 limit 1000000, 20 需要先扫出并丢弃前一百万行(还要回表),越翻越慢。优化有三条路——用主键或有序唯一键做游标(where id > 上次最后一条 order by id limit 20,也就是 seek 方式,最适合无限下拉);业务上禁止跳到很深的页,改成只能翻前后几页;确需跳页时用延迟关联先只在覆盖索引里取出主键再回表(join (select id ... limit ...) t using(id))。连接池则是为了避免「每次请求都新建 TCP 连接 + 鉴权 + 分配线程」的开销,同时给数据库一个可控的并发上限,防止连接被打满。Druid 的核心参数要能说清作用:initialSize / minIdle / maxActive(连接数与空闲下限)、maxWait(拿不到连接等多久,决定是排队还是快速失败)、validationQuery 与 testWhileIdle(连接有效性检查)、timeBetweenEvictionRunsMillis 与 minEvictableIdleTimeMillis(空闲回收)。池子不是越大越好,超过数据库承载能力只会让请求一起变慢。

  7. OOM 排查与 JVM 工具:按「先保现场,再定位类型」的顺序答:第一反应不是重启,而是留证据——jps 找到进程、jstat -gcutil 看各代使用与 GC 频率、jmap -dump:live,format=b,file=heap.hprof 落堆快照(或提前配好 -XX:+HeapDumpOnOutOfMemoryError),必要时 jstack 看线程栈。然后判断类型:堆内存溢出(大对象、缓存无上限、集合只增不减)、元空间溢出(动态生成类过多)、GC 开销超限(内存泄漏导致 GC 徒劳)、还是直接内存/线程数超限。定位手段是 MAT 或 JProfiler 分析支配树,看是谁把对象持有住了;常见根因是本地缓存没淘汰、ThreadLocal 未 remove、连接或流没关、批量查询一次取太多。jstat 看 GC,jmap 看堆与直方图,jstack 看线程与死锁,jps 列进程——四个工具的分工要能一口说清。

  8. PB 级数据的治理题,答题框架是「先定义再工程」:清洗按数据模态分——音频做降噪、静音与重复片段切分;视频做抽帧、镜头切分、黑边与重复检测;图像做尺寸归一化、去重、模糊与遮挡过滤;文本做 HTML 剥离、乱码与广告清洗。去重分三档:精确去重(内容哈希)、近似去重(SimHash / MinHash + 局部敏感哈希,处理转载与轻微改动)、语义去重(向量相似度,代价最高、用于高价值子集)。脱敏要先定分类分级(人脸、声纹、车牌、身份证、住址、医疗信息),处理手段是打码、模糊、替换或整段剔除,并留下审计记录与可回溯的处理日志;注意脱敏后的数据仍可能通过组合被重新识别。质量评测要给可量化的指标(清晰度、信噪比、有效时长占比、标注一致性、类别分布),做抽样人工复核与自动化打分并行的流水线。数据集管理要解决版本、血缘、权限与配比:同一份数据集能追溯到原始批次与处理脚本,训练/验证/测试按时间和来源切分防止泄漏,标签与内容分离存储,整套流水线最好是可重跑的批处理作业。