面试面经 · 阿里巴巴
【阿里巴巴】【大模型开发】【暑期实习一面】面经(八股+大模型项目+手撕)
阿里巴巴 大模型开发 暑期实习一面面经
背景:海外一年制硕士,主攻 NLP 与 LLM 应用方向,有一段基于开源模型做垂直领域问答系统的项目经历。
题目摘要
- Go 语言基础:goroutine 与 channel 的底层实现,GMP 模型简述,如何避免 goroutine 泄漏。
- MySQL/Redis 八股:MySQL 索引失效场景、事务隔离级别;Redis 缓存穿透/击穿/雪崩的区分与解决方案。
- RAG 项目深挖:针对简历中的 RAG 系统,追问 chunk 切分策略、召回质量评估、以及 query 改写逻辑。
- Function Calling 实现:如何让 LLM 稳定输出结构化 tool 调用参数,以及异常分支如何处理。
- 上下文管理与推理成本:面对长对话,如何控制 token 消耗,是否用过上下文裁剪或摘要压缩。
- 手撕算法:「寻找两个有序数组的中位数」(LeetCode 4)。要求 O(log(min(m, n))) 解法,并解释边界条件。
项目深挖
追问 1:你的 RAG 系统在召回阶段如何解决 query 与 chunk 语义不对齐的问题?比如用户问"怎么退款",但文档里写的是"退货政策"。
参考方向:我先承认这是经典问题,然后分两层回答。第一层是 query 改写,我们维护了一个基于规则的改写模块,针对电商场景做了同义词扩展(退款/退货/退钱),同时会用 LLM 做一次轻量级意图识别,判断是否需要补充限定词。第二层是召回后处理,对 top-k 结果做一次重排序,用 cross-encoder 计算 query 与 chunk 的相关性分数,过滤掉低于阈值的。面试官追问"为什么不用 fine-tune 一个 retriever",我回答是初期数据量不足,且规则+重排序的性价比更高,后续积累了用户反馈数据再考虑端到端优化。
追问 2:Function Calling 中,如果 LLM 返回的 JSON 参数格式不合法,或者参数缺失,你的系统怎么处理?
参考方向:我分了三层容错。第一层是 schema 校验,用 Pydantic 做严格校验,失败则触发重新生成,但限制最多重试 2 次,避免死循环。第二层是语义纠错,如果 JSON 合法但某个必填参数缺失,比如"查询天气"缺少"城市",我们会用预设的默认值或者通过上下文推断,推断不了就主动反问用户。第三层是降级策略,如果重试后仍失败,直接走一个通用的 fallback 回复,告知用户"暂时无法处理,请稍后再试"。面试官比较认可的是我没有把所有情况都交给 LLM 无限重试,而是有成本意识。
追问 3:你说做了推理成本优化,具体怎么做的?节省了多少?
参考方向:我提到三个手段。第一是上下文裁剪,对超过 8k token 的会话,用 LLM 生成历史对话的摘要,替换掉原始消息,这个能减少约 30% 的 prompt 长度。第二是缓存,对用户 query 做 embedding 后,用向量相似度匹配历史答案,完全命中直接返回缓存,这个命中率大概 15%。第三是模型分级,简单的意图识别用 7B 小模型,复杂的生成任务才调用大模型。整体算下来,单次会话平均推理成本降低了约 40%。面试官追问了"缓存命中后如何保证答案不过时",我承认这是一个 trade-off,目前的做法是给缓存设置 24 小时 TTL,且对时效性敏感的问题类型强制走实时推理。
手撕算法复盘
题目是 LeetCode 4,要求 O(log(min(m, n))) 时间复杂度。
关键思路:在两个数组中分别取分割点 i 和 j,使得左半部分元素个数等于右半部分(或左半比右半多 1),即 i + j = (m + n + 1) / 2。然后通过二分调整 i 的位置,核心是保证 nums1[i-1] <= nums2[j] 和 nums2[j-1] <= nums1[i] 两个条件同时成立。边界情况包括 i = 0 或 i = m 时如何处理无穷大值。
我的写法:用二分模板,low = 0, high = m,每次计算 i = (low + high) / 2,j = (m + n + 1) / 2 - i。判断条件后移动指针。最后根据 m+n 的奇偶性返回中位数。面试官提示我注意 j 可能越界,我补充了边界判断后通过。整体用时约 15 分钟,面试官没有追问其他解法。
准备建议
- 把项目里的"为什么"全部想清楚。面试官深挖的深度远超简历表面描述,尤其是"为什么不用 XX 方法"这种问题。建议对项目中的每一个技术选型,准备至少一个备选方案并说明放弃它的理由。比如 RAG 为什么不用 fine-tune embedding 模型?缓存为什么用 Redis 而不是本地内存?每个问题都要能讲 2-3 分钟。
- 手撕算法不要只刷"高频题",要刷"变种题"。LeetCode 4 这种题,很多人背了答案但写不出边界条件。建议把 Hard 题按"二分法""动态规划""图论"分类刷,每类至少 5 题,并且写完后自己跑几个边界测试用例。面试前一周每天保持 2-3 道手写代码的节奏。
- 准备一个"成本优化"的故事。大模型方向面试官非常关注工程落地能力,尤其是 token 成本、延迟、并发。如果你的项目里没有现成的优化经验,可以主动设计一个:比如用 KV cache 加速推理、用 batch 推理提高吞吐,或者用模型蒸馏减少参数量。故事要具体,有数字支撑,哪怕是小规模实验数据也比空谈强。
结果反馈
一面通过,约 3 天后收到二面邮件通知。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。