NiceOffer

面试面经 · 小米

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

小米面经大模型开发实习

小米大模型开发暑期实习二面面经

背景:海外一年制硕士,一段大模型Agent项目实习,主语言Go。

二面整体风格偏工程落地,面试官是组内资深工程师,全程围绕项目细节和底层原理拷问,没有闲聊。手撕题难度中等偏易,但要求写出可运行的完整解法,并现场跑通测试用例。

题目摘要

  1. Go语言基础:slice底层结构、扩容机制、与array的区别;goroutine泄漏的场景及排查方法。
  2. MySQL:InnoDB的MVCC实现原理,RR隔离级别下幻读如何被解决(当前读与快照读的区别)。
  3. Redis:持久化机制对比(RDB vs AOF),混合持久化的具体流程;缓存穿透、击穿、雪崩的应对方案。
  4. 大模型项目深挖:RAG检索质量优化、Function Calling的异常处理、上下文窗口管理、推理成本优化。
  5. 手撕算法:实现一个带过期时间的LRU缓存(LRU + TTL)。
  6. 场景设计:给定一个百万级文档的RAG系统,如何设计索引结构使检索延迟低于200ms。

项目深挖

面试官对我的Agent项目(一个基于Function Calling的客服助手)追问非常细,每个回答都会引出下一个问题,节奏很快。

追问1:你的RAG检索结果不理想时,如何定位是检索问题还是生成问题?

参考回答方向:先做组件隔离评估。检索侧用召回率@k和MRR指标,将query的gold chunk与召回结果对比;生成侧则将gold chunk直接拼入prompt,看模型能否给出正确答案。若gold chunk能答对而召回结果答不对,则问题在检索侧,反之在生成侧。实际项目中我用了一组人工标注的50条测试集做回归,定位到是chunk切分粒度过粗导致召回不全。

追问2:Function Calling如果模型返回了不存在的函数名或参数格式错误,你怎么处理?

参考回答方向:分三层兜底。第一层,在system prompt中明确函数schema,并要求模型先输出JSON再解释;第二层,代码中对模型输出做严格JSON解析和schema校验,失败则重试一次(温度调低);第三层,定义一个fallback函数,当所有解析失败时返回"抱歉,我暂时无法处理该请求",同时记录错误日志用于后续prompt优化。另外,对每个函数做参数边界校验,防止模型传入越界值。

追问3:你的上下文管理策略是什么?如何控制成本?

参考回答方向:采用滑动窗口+摘要压缩的混合策略。设定对话轮数阈值(如8轮),超过后触发摘要:用一个小模型将早期对话压缩为结构化摘要(保留用户意图、已确认信息、未完成事项),替换掉原始消息。同时,只将最近N轮完整消息+摘要送入模型。成本优化上,将高频的system prompt和函数schema静态缓存,不随每次请求重复计算token;对长文档检索结果做rerank后只取top-3 chunk,避免无用token消耗。

手撕算法:带过期时间的LRU缓存

题意:设计一个数据结构,支持get(key)put(key, value, ttl)操作,其中ttl为过期时间(秒)。get时若key不存在或已过期返回-1;put时若key存在则覆盖并更新过期时间,若容量满则淘汰最久未使用的条目。

关键思路

  • 使用哈希表+双向链表实现O(1)的LRU,哈希表存key到链表节点的映射。
  • 每个节点存储keyvalueexpireAt(时间戳)、prevnext
  • get时先检查expireAt是否小于当前时间,过期则删除节点并返回-1;未过期则移动到链表头部。
  • put时若key存在,更新value和expireAt并移到头部;若不存在,先检查容量,满了则淘汰链表尾部节点(同时删除哈希表项),再插入新节点到头部。
  • 注意点:时间戳用time.Now().Unix()(秒级),避免毫秒精度带来的误差;删除过期节点时需同时维护哈希表和链表指针。

面试官在代码跑通后追问:如果过期key很多但一直没被访问,内存会一直占用吗?我答:可以加一个后台协程定期扫描链表尾部过期节点,或每次put时触发一次惰性清理。他点头后进入下一题。

准备建议

  1. 把项目里的"坏味道"提前想好:面试官一定会找项目中的薄弱环节追问,比如RAG召回不准、Function Calling失败、上下文爆炸。提前用"问题-定位-解决-验证"的结构准备3个深度案例,每个案例要有量化数据(如召回率从70%提到85%)。
  1. Go语言不要只背八股,要能手写底层:slice的扩容规则(1.18后int倍扩容、小于256时翻倍)、map的底层结构(hmap+bmap)、goroutine泄漏的排查工具(pprof的goroutine profile)这些高频考点,建议在IDE里实际跑一遍代码看结果,不要只看博客。
  1. 手撕题刷到"无脑写出"的程度:二面手撕大概率不是难题,但要求代码质量高——边界条件处理、命名规范、时间空间复杂度分析都要到位。建议把LRU、LFU、线程安全单例、TopK高频词这几类题练到10分钟内写出无bug版本。另外,面试时主动说出思路再动手,让面试官有参与感。

结果:一面通过后约了二面,二面结束第三天收到HR电话约三面(主管面),整体流程推进较快。

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