NiceOffer

面试面经 · 小马智行

【小马智行】【大模型开发】【暑期实习二面】面经(八股+大模型项目+手撕)

小马智行面经大模型开发实习

小马智行 大模型开发 暑期实习二面面经

背景:海外一年制硕士,主攻 NLP 与大规模分布式系统,此前有一段大模型推理优化相关的实验室项目。

题目摘要

面试时长 70 分钟,整体节奏紧凑,技术深度优先于广度。核心考点集中在以下 5 个方向:

  1. Go 语言基础:goroutine 调度模型、channel 底层实现、内存逃逸分析。
  2. MySQL 与 Redis:InnoDB 索引结构、事务隔离级别与 MVCC、Redis 持久化机制与缓存一致性。
  3. 大模型项目深挖:围绕 RAG 系统的检索质量优化、Function Calling 的容错设计、上下文窗口管理策略。
  4. 推理成本优化:KV Cache 量化、前缀共享、批处理调度。
  5. 手撕算法:设计一个支持 getput 操作的 LRU Cache,要求平均时间复杂度 O(1)。

项目深挖

追问 1:你的 RAG 系统在检索阶段如何平衡召回率与精度?

参考回答方向:不要只提“混合检索”。我当时的回答分三层——首先用 BM25 做关键词召回,再用 dense embedding 做语义召回,两者取并集后进入 rerank 阶段;其次在 rerank 阶段引入 cross-encoder 模型对 top-50 结果精排,取 top-5 送入 LLM;最后在数据侧做 chunk 重叠和 metadata 过滤(如时间、来源、权限标签),从源头降低噪声。面试官会追问“rerank 模型本身的开销如何控制”,可以回答对 rerank 模型做蒸馏,或用小模型(如 300M 级别)替代,并限制候选集规模。

追问 2:Function Calling 在真实场景中经常出现模型输出格式错误或参数缺失,你怎么处理?

参考方向:不要只说“用 JSON mode”。我拆成三层防御——第一层是 prompt 工程,在 system prompt 中给出 tool 的 JSON schema 示例,并要求模型先输出“思考过程”再输出调用;第二层是解析层容错,使用容错 JSON 解析器(如修复括号不匹配、引号转义问题),并配合正则提取关键字段;第三层是运行时校验,对必填参数做类型检查和取值合法性校验,失败则自动触发一次“重试 + 错误信息反馈”的循环,最多重试 2 次。面试官追加问“如果重试后仍然失败怎么办”,答:降级为纯文本回复,并向用户展示可用的参数列表,让用户手动补充。

追问 3:上下文窗口有限,你如何管理超长对话或多轮工具调用历史?

参考方向:核心思路是“分层压缩 + 动态淘汰”。短期记忆保留最近 N 轮完整消息(含 tool 调用结果),中期记忆用摘要模型将更早的对话压缩为结构化摘要(时间、意图、关键实体),长期记忆则写入向量库按需检索。工具调用结果本身也做裁剪,比如只保留 top-k 行或关键字段,避免把大表全量塞进上下文。面试官可能会追问“摘要本身的成本”,可以回答对摘要模型做量化,并设置触发阈值(如超过 8k tokens 才触发压缩)。

手撕算法:LRU Cache

题意:实现一个固定容量的 LRU 缓存,支持 get(key)put(key, value),要求平均时间复杂度 O(1)。

关键思路:哈希表 + 双向链表。哈希表负责 O(1) 定位节点,双向链表维护访问顺序。get 时命中则将节点移动到链表头部;put 时若 key 存在则更新值并移动到头部,若不存在则插入头部并检查容量,超出则淘汰链表尾部节点。注意边界条件:容量为 0、重复 put、get 不存在的 key。

面试官追问:如果用单链表行不行?答:不行,因为删除尾部节点需要访问前驱节点,单链表需要 O(n) 遍历。用数组 + 时间戳呢?答:可以但需要 O(n) 扫描找最旧节点,不满足要求。写代码时注意 dummy head/tail 简化边界判断,避免空指针。

准备建议

  1. Go 语言别只背八股,要能画调度图:面试官会深挖 GMP 模型中 P 的本地队列何时会与全局队列交互、channel 的 send/recv 阻塞如何唤醒 goroutine。建议在本地跑一个 go tool trace 观察真实调度行为,并手写一个 channel 超时控制的小 demo。
  2. RAG 项目准备一张“失败案例表”:不要只讲成功路径。提前列出 2-3 个真实踩坑点(如 chunk 切分导致语义割裂、embedding 模型对专业术语不敏感、rerank 引入延迟过高),并准备好对应的量化数据和优化前后对比。面试官对“你如何定位问题”远比“你做了什么”更感兴趣。
  3. 手撕题练熟 LRU 和 LFU 的变体:小马智行偏好考察工程实用性强的题目。除了 LRU,建议把 LFU(O(1) 实现)、线程安全的 LRU(加锁粒度如何设计)也过一遍。写题时主动和面试官沟通边界条件,展示工程思维。

结果反馈

一面通过,约一周后收到二面通知。整体面试体验务实,面试官会针对项目细节连环追问,建议对简历上的每个数字和结论都准备好“为什么”和“如果换一种方案会怎样”。

想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。