面灵AI→

小米小爱测试开发一面:AI 辅助开发与自动化测试流水线

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

项目相关(实习自动化流水线项目)

  1. 在项目开发过程中,你是如何利用 AI 来辅助工作的?效果如何?
  2. 你提到的自动化测试流水线中,哪些是已有流程,哪些是新建立的?
  3. 这个项目的整体开发周期是多久?你的核心开发时间占多长?后续用户反馈如何?
  4. 当前这个自动化系统的推广情况如何?具体是怎么使用的?
  5. 与去年相比,今年上半年你在开发方式上的感受有哪些显著变化?
  6. 在实验室工作中,AI 工具对你的日常开发有何帮助?

业务相关

  1. 关于小爱同学的模型评测,是否需要构建专门的评测集?具体是如何开展的?
  2. 目前自动化测试框架的建设重点是继续扩展新框架,还是更侧重于业务测试?

算法手撕

  1. 写一个反转单链表,写出核心代码,并讲一下核心算法原理。

反问面试官

  1. 小爱这边做 AI 评测,是需要构建专门的模型评测集是吗?
  2. 自动化流水线,后续是继续扩展新自动化框架,还是业务测试占比更高?

个人情况

  1. 你的毕业论文目前进展如何?节奏是怎样的?

《参考解析》

「你怎么用 AI 辅助开发、效果如何」要拿证据答,不要谈感受。 面试官真正想验证的是两件事:你会不会把 AI 用在刀刃上,以及你怎么确认它没写错。可以按环节讲:需求澄清与任务拆解(让模型把模糊需求拆成可验收条目)、方案设计(先让它列改动清单再动手)、编码(小步生成、每步可编译)、测试用例生成(让它按边界值、异常路径补用例,人再筛)、以及代码 review(自己读 diff,或用另一个模型当第二双眼睛)。「效果如何」必须落到可核对的量上:某个模块开发时间从 3 天压到 1 天、用例编写效率提升、漏测率变化、review 阶段拦下的问题数。再补一句边界:涉及生产数据、并发与权限的改动不交给模型自己拍板,AI 生成的用例要人工筛掉和需求不符的,否则用例数量涨了、有效覆盖没涨。

自动化流水线的「已有 vs 新建」和推广情况怎么讲。 这题考的是你有没有真正接手过一个存量系统。答法是先给一张现状图:旧流程是什么(手工触发、本地跑脚本、结果只留在个人机器上)、痛点在哪(不可复现、没有统一报告、失败没有通知所以经常漏跑),再逐条对应你新建的部分(流水线编排、用例分层、报告聚合、失败通知与重跑、环境与数据的准备/清理)。推广与使用情况要讲事实:当前多少个业务线接入、日均触发多少次、平均耗时、失败率,以及怎么说服别人用——一般是从一个痛点最强的团队试点,把报告和通知做成他们真的会看的样子,再横向复制。被追问「用户反馈如何」时,正负都要说:正向是回归时间缩短、问题在合并前被拦住;负向有误报率高导致被忽略、环境不稳导致的假失败——这也是最能体现你工程判断的部分。

小爱同学这类对话式 AI 的评测集怎么建。 对话助手的评测不能只看单轮准确率,要按能力维度切片:唤醒与指令理解(含方言、口音、噪声场景的语音输入)、多轮上下文与指代消解、口语化与省略表达、拒答与安全(不懂要说不懂,而不是编)、以及端到端体验(首字延迟、打断、连续对话)。评测集来源三条腿:线上真实日志采样并脱敏(最能代表真实分布)、人工按能力矩阵构造(覆盖长尾与边界)、模型生成后人工筛选(扩量快但必须人工定标)。评测方式上,客观项用规则与程序判定(指令是否命中、槽位是否填对、格式是否合规),主观项用 LLM-as-judge 打维度分并抽检校准(注意位置偏差与长度偏差,成对比较要交换顺序),关键场景保留人工标注做基准。评测集要版本化管理、跟着业务迭代扩充,并且每一次上线都跑回归——不然评测集本身会过期。

「继续扩框架还是做业务测试」的取舍。 这是测试开发岗的经典问题,答案不是二选一,而是先看阶段与收益。判断依据可以摆三条:一是框架当前覆盖率与稳定性——如果核心链路的自动化还没打通、误报率还高,先把已有的做扎实,别急着铺新框架;二是新增框架能不能解决现存的最大痛点(比如现在业务是端侧 App,缺的是性能与稳定性自动化,那扩这一类框架就有明确收益);三是投入产出比——框架是一次性投入、长期复用,业务测试是当期风险的直接兜底,两者配比应随版本节奏变化:发版密集期业务测试优先,平台期做框架沉淀。回答时最好带上自己团队的量化现状(多少用例、覆盖多少核心链路、多少靠人肉回归),再给一个 6:4 或 7:3 的判断和理由,比一句「都重要」有说服力得多。

反转单链表:迭代优于递归,边界要写全。 迭代写法用三个指针:prev = null、cur = head,循环里先存 next = cur.next,再 cur.next = prev,然后 prev = cur、cur = next,循环结束返回 prev(不是 cur,因为最后 cur 已经是 null)。时间复杂度 O(n)、空间 O(1)。递归写法 newHead = reverse(head.next); head.next.next = head; head.next = null; return newHead; 更短,但要讲清代价:递归深度等于链表长度,长链表会爆栈,实际工程里更倾向迭代。面试官追问一般有三个方向:空链表与单节点(prev=null 的初始化正好兜住)、部分反转/区间反转(用哑结点 dummy 定位前驱,绝大多数「头节点会变」的题都靠哑结点省掉特判)、以及每 K 个一组反转(先判足 K 个再反转,不足则保持原序,注意接回上一组的尾巴)。写的时候边写边说每步指针的含义,比默写完再解释更容易拿分。