面试面经 · 小马智行
【小马智行】【Agent 开发】【暑期实习HR面】面经(八股+大模型项目+手撕)
小马智行 Agent 开发 暑期实习 HR 面面经
背景: 海外一年制硕士,计算机相关专业,此前有一段大模型应用层实习,主攻 RAG 与 Function Calling 方向。
题目摘要
面试整体节奏紧凑,HR 面穿插了大量技术考察,并非纯行为面。核心考点集中在以下五个方面:
- 编程语言基础:Java 并发与 JVM 内存模型(因简历主语言为 Java,被重点追问)。
- MySQL/Redis 八股:索引失效场景、MVCC 原理、Redis 持久化策略与缓存穿透解决方案。
- Agent 项目深挖:围绕 RAG 检索质量优化、Function Calling 的容错设计、多轮对话上下文管理、以及推理成本优化(Token 压缩与缓存)。
- 手撕算法:一道中等偏上的场景题,考察堆与贪心思想的结合。
- 行为与动机:为什么选择小马智行、对自动驾驶行业 Agent 应用的理解、实习时间与稳定性确认。
项目深挖
追问一:你的 RAG 系统在处理多轮对话时,如何解决上下文漂移问题?
追问二:Function Calling 如果模型返回了错误的参数或非法调用,你怎么处理?
追问三:如何评估你的 Agent 在真实场景下的效果?
手撕算法题
题目: 给定一个整数数组 tasks,每个元素代表一个任务的耗时,以及一个整数 k,代表可并行执行的任务数。每次只能从数组头部或尾部取一个任务分配给空闲线程,求完成所有任务的最短时间。
关键思路: 这题本质是双端队列 + 贪心模拟。每次从两端取耗时更短的任务分配给当前空闲线程,可以最大化线程利用率。但需要注意,如果直接模拟会超时,需要用一个优先队列维护每个线程的完成时间。具体做法是:维护两个指针 left 和 right,每次取出 tasks[left] 和 tasks[right] 中较小的那个,分配给当前最早空闲的线程,并更新该线程的完成时间。重复直到所有任务分配完毕,最后取所有线程完成时间的最大值。
注意点: 面试官要求先讲思路再写代码,且要分析时间复杂度。我给出的解法是 O(n log k),n 为任务数,k 为线程数,空间复杂度 O(k)。写完后面试官追问了如果任务耗时相同怎么处理,我说此时从头部取即可,不影响最优解。
准备建议
- 八股不要只背结论,要能画图。尤其 MySQL 的 MVCC 和 Redis 的持久化,面试官一定会追问底层实现。建议自己手画 undo log 版本链和 AOF 重写流程图,讲清楚每个步骤为什么需要。
- Agent 项目必须准备“成本账”。现在面试官非常务实,会直接问你的 RAG 或 Agent 方案在实际部署中 Token 消耗多少、延迟多少、如何优化。提前算好你项目里一次完整对话的平均 Token 数,以及用了哪些手段(缓存、模型蒸馏、检索压缩)把成本降下来的。
- 手撕题要练“双端操作 + 堆”的组合题型。小马智行这类偏工程的公司,算法题往往不是纯 LeetCode 原题,而是场景包装。建议把优先队列相关的题目(如任务调度、合并 K 个有序链表)刷熟,并刻意练习先讲思路再写代码的习惯。
结果反馈
一面通过,两天后约了技术二面,整体面试体验偏向工程实践,对项目细节的追问密度较高,建议后续面试者重点准备与自动驾驶场景结合的 Agent 落地案例。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。