NiceOffer

面试面经 · Momenta

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

Momenta面经大模型开发实习

海外一年制硕士,投递 Momenta 大模型开发暑期实习,简历偏 LLM 应用与 Agent 工程方向,二面时长约 70 分钟,面试官是组内做 Agent 平台的一线工程师,全程共享屏幕写代码。

题目摘要

  1. Go 语言基础:slice 的底层结构、扩容规则,以及 slice 作为函数参数时修改元素能否影响原切片、append 之后为什么有时"失效"。追问 map 并发读写 panic 的成因和 sync.Map 的适用场景。
  2. MySQL / Redis 八股:聚簇索引与二级索引的回表过程、EXPLAIN 里 type 字段从好到坏的排序;Redis 缓存穿透/击穿/雪崩三件套的处理手段,重点问"逻辑过期 + 互斥锁"方案下如何保证一致性,以及 Redis 分布式锁的续期问题。
  3. RAG 项目深挖:文档切分策略怎么定的、向量检索召回率怎么评估、为什么用混合检索(BM25 + 向量)、rerank 模型放在哪一层、线上 QPS 与 P99 延迟。
  4. Agent / Function Calling:工具数量到几十个之后怎么选工具、多轮对话上下文怎么裁剪、工具调用失败(参数不合法、超时)怎么重试和降级、怎么防止模型陷入循环调用。
  5. 推理成本优化:首 token 延迟和吞吐的权衡、KV Cache 命中率怎么提升、prompt 前缀复用、量化方案(INT8 / AWQ)对效果的实测影响。
  6. 手撕算法:LRU 缓存。题意:设计一个容量为 capacity 的数据结构,支持 get(key) 和 put(key, value),两者都要求 O(1) 平均时间复杂度,容量满时淘汰最久未使用的 key。关键思路是哈希表 + 双向链表:哈希表存 key 到链表节点的映射,链表头部放最近使用、尾部放最久未使用;get 命中后把节点摘下来插到头部,put 时若 key 已存在则更新并移到头部,若不存在则新建节点插头部,超出容量就删掉尾节点并同步删哈希表项。用 Go 写的话注意用 container/list 或者手写哨兵头尾节点避免空指针判断;面试官后续追问了"如果要求支持过期时间怎么办",回答方向是给每个节点加 expireAt,再用惰性删除 + 定期采样删除,或者直接用最小堆/时间轮管理过期。

项目深挖

追问一:RAG 里你说用了混合检索,怎么证明它比纯向量检索好?

这题是典型的"别只讲技术栈,要讲评估"。参考回答方向:先说明评估集怎么来的——从线上真实 query 里采样 200~500 条,人工标注每条的正确答案所在 chunk,构成 golden set;然后定义指标,召回层面看 Recall@K 和 MRR,端到端看答案的忠实度(faithfulness)和答案相关性。对比时固定 rerank 模型和生成模型,只切换检索层,纯向量 Recall@5 是 X,混合检索是 X+8pt 左右,主要收益来自专有名词、型号、代码标识符这类 query,向量模型对这类 token 的语义表征偏弱,BM25 能兜住。最后补一句代价:混合检索要多一路检索和一次融合(RRF 或加权),P99 涨了大概几十毫秒,用并发召回 + 提前截断压回来了。

追问二:Function Calling 工具变多之后怎么选工具?

参考回答方向:分三层。第一层是静态过滤,按用户意图、会话状态、权限先排除掉不可能用到的工具,比如没登录就不给"下单"类工具。第二层是检索式召回,把每个工具的 name + description + 参数 schema 做成一条文档,用向量检索召回 top-k(一般 5~10 个)再塞进 prompt,而不是把几十个工具全塞进去——全塞不仅费 token,还会显著拉低选择准确率。第三层是如果工具之间存在依赖(比如先查订单再退款),用一个小模型或者规则做多步规划。补充一点:工具描述本身要工程化,参数名、枚举值、什么时候不该调用,都要写清楚,很多选错工具是描述写得含糊导致的。

追问三:上下文越来越长,怎么管理?

参考回答方向:按信息价值分层。系统 prompt 和工具定义放最前面,保证 KV Cache 前缀命中;中间的对话历史做滑动窗口 + 摘要,超过阈值的老轮次用模型压缩成一段摘要,保留实体和结论、丢掉寒暄和中间推理过程;工具返回结果里只保留模型真正需要的字段,原始 JSON 该截断就截断。另外要把"必须记住"的信息(用户 ID、当前任务目标)单独抽成一个结构化的 state,每轮拼进 prompt,不依赖模型从长历史里自己找。最后提一句实测:只做滑动窗口时多轮任务成功率会掉,加了结构化 state + 摘要之后基本追平全量上下文的水平,token 消耗降了一半以上。

准备建议

  1. 八股别背结论,背"为什么"。MySQL 索引和 Redis 缓存这块,面试官几乎不会只问定义,而是给一个场景让你选方案。准备时每个知识点都逼自己回答三个问题:它解决什么问题、代价是什么、什么情况下不该用它。比如缓存一致性,别只答"先更新 DB 再删缓存",要能说清楚为什么是删而不是更新、延迟双删解决的是什么、什么业务下可以接受最终一致。
  1. 项目准备一份"数字清单"。把 RAG / Agent 项目里的关键指标全部量化并记住:数据规模、chunk 大小与重叠、Top-K、召回率、P99 延迟、单次调用 token 数和成本、优化前后的对比。面试官深挖时最容易被问穿的就是"你说效果变好了,好了多少"。没有线上数据就用离线评估集自己造一组,能自圆其说即可。
  1. 手撕题按题型刷,不按题号刷。大模型岗的手撕集中在几类:LRU/LFU、Top-K、滑动窗口、字符串处理、简单的并发控制(Go 的 channel + goroutine 实现限流或生产者消费者)。每类写熟一个模板,注意边界条件(空输入、容量为 0、重复 key)和复杂度分析,写完主动口述一遍测试用例,比等面试官指出 bug 印象分高很多。

一面通过,约 5 天后收到二面邀请,二面结束后第 3 天 HR 反馈通过,进入 offer 沟通环节。

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