面试面经 · 美团
【美团】【大模型开发】【暑期实习二面】面经(八股+大模型项目+手撕)
海外一年制硕士,投的是美团大模型开发暑期实习,二面约在一面通过后第 5 天,时长 70 分钟,面试官是组里做 Agent 方向的算法同学,全程共享屏幕、手撕代码 + 项目连环追问。
题目摘要
- Go 语言基础:
slice与array的区别、扩容机制、map并发读写为什么 panic、sync.Map适用场景;defer执行顺序与返回值陷阱。 - MySQL / Redis 八股:聚簇索引与回表、
explain里type各档含义、最左前缀失效的典型写法;Redis 缓存穿透/击穿/雪崩的区别与各自解法,以及zset跳表为什么不用红黑树。 - RAG 项目深挖:文档切分策略怎么定、向量检索召回率怎么量化、rerank 模型选型与延迟权衡、幻觉怎么抑制。
- Function Calling / Agent:工具数量膨胀后如何做路由、多轮上下文怎么裁剪、工具调用失败后的重试与兜底。
- 推理成本优化:首 token 延迟与吞吐的取舍、KV Cache 复用、量化对效果的影响评估。
- 手撕算法:LRU 缓存(LeetCode 146)。题意:设计一个容量为
capacity的缓存,支持get(key)和put(key, value),两者都要求 O(1) 平均复杂度,超出容量时淘汰最久未使用的键。关键思路:map[key]*listNode做 O(1) 定位,配合双向链表维护访问顺序,get/put命中后把节点移到链表头,淘汰时删尾节点;Go 里用container/list或手写哨兵头尾节点都可以,注意put已存在 key 时要更新值并刷新位置。
项目深挖
追问一:你的 RAG 检索召回率是怎么衡量的,还是拍脑袋调 top-k?
参考回答方向:先承认不能只看"感觉召回了"。构造一个 50~100 条的小评测集,每条 query 标注至少一个正确 chunk,用 Recall@k 和 MRR 衡量。切分上做过对比:固定 512 token 无重叠 vs 按标题层级切 + 128 token 重叠,后者在跨段落问题上召回明显更好。top-k 从 3 调到 8 时 Recall@8 涨了但端到端答案质量没涨,因为噪声 chunk 进了 prompt 反而干扰生成,最后加了 rerank 把 top-20 压到 top-5 再喂给模型。这个"召回和精度分开调"的思路是面试官想听的。
追问二:Function Calling 工具变多之后,你怎么让模型选对工具?
参考回答方向:工具数超过 15 个后,全量塞进 system prompt 会明显掉准确率,而且 token 成本高。做法是两层路由:先用一个轻量分类模型或 embedding 相似度把工具粗筛到 3~5 个候选,再交给主模型做最终 function call。另外工具描述要写清楚"什么时候用、什么时候不用",边界模糊的工具合并掉。失败兜底上,解析不到合法 JSON 就重试一次并把报错信息回灌给模型,连续失败则降级到规则匹配。
追问三:上下文越来越长,成本和延迟怎么压?
参考回答方向:分三块讲。一是历史对话做滑动窗口 + 摘要,超过 N 轮的老对话压缩成一段摘要而不是原样保留;二是系统提示和工具 schema 这类静态前缀固定住,命中 KV Cache 复用,别每轮都改前缀;三是能走小模型的意图识别、改写、路由就不上大模型,主模型只负责最终生成。面试官会追问"摘要会不会丢信息",可以答关键实体和用户约束单独结构化存一份,不依赖摘要。
准备建议
- 八股别背结论,背"为什么":MySQL 索引和 Redis 数据结构这两块,面试官几乎都会从结论追到实现。比如答完"跳表支持范围查询"要能接着讲跳表插入的期望复杂度、为什么 Redis 选它而不是红黑树(实现简单、并发友好、范围查询天然有序)。Go 的 slice 扩容要把 1.18 前后的策略差异说清楚。
- 项目准备一份"被追问清单":把自己项目里每个技术选型都写成"为什么选 A 不选 B + 怎么验证有效"。RAG 类项目重点准备评测方法、切分策略、rerank、幻觉抑制四个点,每个点都要有数字或对比实验,没有数字就现场说清当时怎么拍板的,别硬编。
- 手撕按题型刷,不按题号刷:LRU、LFU、限流器、Top-K、生产者消费者这类"工程味"的手撕在大模型岗高频出现,重点是写得出、边界对、能讲清复杂度。Go 写的话提前熟悉
container/list、sync.Mutex的用法,别在语法上卡壳。
面完当天 HR 反馈二面通过,隔了 3 天约了三面(交叉面)。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。