面试面经 · 小米
【小米】【大模型开发】【暑期实习三面】面经(八股+大模型项目+手撕)
海外一年制硕士,投递小米大模型开发暑期实习,三面技术面,面试官是团队里做 Agent 方向的资深工程师,全程约 70 分钟,没有自我介绍环节,直接进项目。
题目摘要
- Go 语言基础:
slice的底层结构与扩容策略,map并发读写为什么会 panic,sync.Map适用场景;goroutine 泄漏的常见成因与排查手段。 - MySQL / Redis 八股:聚簇索引与回表,
EXPLAIN里type字段的取值含义;Redis 缓存穿透/击穿/雪崩的区分与各自解法,Redisson看门狗续期机制。 - RAG 项目深挖:文档切分粒度怎么定、向量检索召回率低怎么优化、rerank 模型引入后延迟上升如何权衡。
- Agent 与 Function Calling:工具数量膨胀到几十个之后如何做工具路由、多轮对话里上下文怎么裁剪、模型选错工具时怎么兜底。
- 推理成本优化:线上 QPS 上涨后单次调用成本怎么压,KV Cache、批处理、小模型分流分别适合什么场景。
- 手撕算法:LRU 缓存。题意是实现一个容量为
capacity的缓存,支持get(key)和put(key, value),两者都要求 O(1)。关键思路是哈希表 + 双向链表:哈希表存 key 到链表节点的映射,链表头放最近使用、尾放最久未使用;get命中后把节点移到头部,put时若超容则删尾节点再插头部。面试官额外追问了「如果改成 LFU 你怎么设计」,答「双层哈希表 + 频次桶,或者用最小堆但堆做不到 O(1)」即可。
项目深挖
简历上写了一段基于 RAG + Function Calling 的智能问答 Agent,面试官基本围着这一段问了 40 分钟,三个追问印象最深。
追问一:你的检索召回率是怎么评估的?如果线上用户反馈「答非所问」,你怎么定位是检索的问题还是生成的问题?
参考回答方向:先讲评估集怎么建——从真实日志里采样 query,人工标注「正确文档是否在 top-k 里」,算 Recall@k 和 MRR,而不是只看最终答案对不对。定位环节要拆链路:把召回的 top-k 文档和最终 prompt 都打日志,如果正确文档根本没进 top-k,就是检索问题(切分粒度、embedding 模型、query 改写);如果进了 top-k 但答案还是错,就是生成问题(prompt 里上下文被截断、模型没遵循指令、rerank 把对的排后面了)。可以补一句「我们后来加了一个中间层,让模型先判断『检索到的内容是否足以回答』,不足就触发二次检索或直接说不知道,幻觉率降了不少」。
追问二:Function Calling 里工具越来越多,模型经常选错工具或者该调用的时候不调用,你怎么处理?
参考回答方向:分两层。第一层是减少候选工具数量,不要把所有工具一次性塞进 prompt,而是先做一层意图分类或向量检索,从几十个工具里召回 top-5 相关的再给模型,工具描述本身也要写清楚「什么时候用、什么时候不用」,负面示例比正面描述更有效。第二层是兜底,解析模型输出时校验参数 schema,参数不合法就带着错误信息重试一次;如果模型该调用却直接回答了,可以在 system prompt 里强制「涉及实时数据必须先调用工具」,或者用 few-shot 把正确调用模式喂进去。最后提一句「工具调用成功率我们是单独埋点监控的,不混在端到端指标里」。
追问三:上下文越来越长,token 成本压不住,你怎么做上下文管理?
参考回答方向:不要一上来就上长上下文模型。先做分层:system prompt 和工具定义是固定开销,尽量精简;历史对话做滑动窗口 + 摘要,超过 N 轮的老对话用一个小模型压缩成摘要;RAG 检索回来的文档按相关性截断,只保留 top-k 且限制单篇长度。再往上才是工程手段:相同前缀的请求走 KV Cache 复用、把多个请求打包做 continuous batching、非核心场景(比如意图识别、摘要)换成小模型。可以点一下「成本和效果是要算账的,我们会记录每个环节的 token 消耗,先砍掉性价比最低的那部分」。
准备建议
- 把简历上的项目当成论文来准备。面试官不会问你「介绍一下项目」,而是挑一个具体指标追问「这个数怎么来的、为什么是这个方案、换一种会怎样」。提前把项目里每个技术选型的替代方案和取舍理由写下来,尤其是你当时否掉的方案,被问到「为什么不用 XX」时能答上来。
- 八股不要背结论,要能讲清「为什么」。比如 Redis 缓存击穿,不要只说「加互斥锁」,要能说清互斥锁和逻辑过期的区别、各自适合什么场景、加锁后 QPS 会掉多少。Go 的 slice 扩容同理,能画出扩容前后的内存布局比背「1.25 倍还是 2 倍」更有说服力。
- 手撕题按「先讲思路再写代码」的节奏练。面试官更在意你能不能边写边解释边界条件,而不是闷头敲完。LRU、LFU、Top-K、限流器这几类高频题要能白板手写不出错,写完主动说一句时间空间复杂度,以及「如果并发场景下我会怎么加锁」。
面试结束当天下午收到 HR 消息,三面通过,约了一周后的 HR 面。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。