阿里云 Agent 开发一二面
- 轮次
- 一面二面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
一面
- 介绍一下你的实习经历,主要负责哪部分工作?
- 如何理解操作系统的进程和线程?
- 进程切换开销体现在哪些方面?
- 如何设计一个比线程更轻量的调度单元?
- 手撕:K 个一组反转链表。
二面
- 继续聊实习:你具体做了哪些工作,有哪些可以展开的细节?
- Agent 自进化的原理是什么,哪些因素会影响自进化?你是从哪里了解到自进化的?
- 预训练和 SFT 的区别是什么?RLHF 呢?
- 你了解过 DeepSeek Harness 吗?
- 备考面试时你关注了哪些知识点,如何把知识体系构建完整?
- 你更期望做哪一类型的工作?
《参考解析》
进程与线程
进程是资源分配的单位,有独立的地址空间、文件描述符表和页表;线程是调度的单位,同一进程内的线程共享地址空间与打开的文件,只各自持有栈、寄存器和线程局部存储。因为共享内存,线程间通信几乎零成本但要自己加同步;进程隔离性更好,一个崩了不牵连另一个,代价是通信要走 IPC 且切换更贵。面试里常追问的是「线程崩溃为什么能拖垮整个进程」——共享地址空间下非法访问会直接触发整个进程的信号处理。
进程切换开销在哪
四块:一是用户态到内核态的陷入与返回;二是保存和恢复上下文(寄存器、程序计数器、栈指针);三是切换页表导致的 TLB 失效,后续访存要重新走页表,这段是最贵的;四是缓存局部性被破坏,新进程的数据不在 L1/L2 里。所以优化方向是减少切换次数(批处理、减少锁竞争导致的睡眠唤醒)和降低切换成本(大页减少 TLB 项、CPU 亲和性保住缓存)。
比线程更轻量的调度单元怎么设计
思路是把调度的决策权从内核搬到用户态,做成协作式的有栈或无栈协程:一个线程上跑多个协程,遇到 IO 或显式让出点时只保存少量寄存器与自己维护的栈,切换不进内核、不换页表,成本降到几十纳秒量级。要设计的部分包括任务队列与调度器、让出点(await/yield 语义)、IO 多路复用怎么与协程绑定、以及阻塞调用不能卡住整个线程这件事。追问通常会问「协程里做了阻塞系统调用怎么办」——要么改造成异步接口,要么用线程池托管或者运行时把它挪到别的线程。
手撕:K 个一组反转链表
用哑结点加分组处理:每轮先探针走 K 步确认本组够不够长,不够就直接接上剩余部分收工;够长就在组内做标准三指针反转,把组头接到上一组的尾部,并记下本组原来的头当作下一组的前驱。边界要主动说清:K 等于 1 时原样返回、K 大于链表长度时整条不减、以及最后一组不足 K 个保持原序。写法上先写探针再写反转,代码短且不容易错,比递归版本更容易在面试里边写边讲。
Agent 自进化的原理与影响因素
大体是一个闭环:执行留下轨迹,轨迹经评测或反馈转成信号,信号用来改 Agent 的可变部分(提示词、工具集与参数、检索策略、记忆内容,乃至训练数据与权重),改完再跑一轮验证是否真的变好。影响因素主要有五个:反馈信号的质量(只看最终成败太稀疏,要能定位到哪一步错)、评测集是否稳定可复现、记忆与经验的沉淀方式、成本与延迟预算、以及安全边界(不能让它在无人监督下无限改自己的目标)。面试时最好结合自己做过的项目说清「改了哪一层、怎么验证没退步」。
预训练、SFT 与 RLHF 的区别
预训练是无标注的大规模下一 token 预测,学的是语言与世界知识的分布,代价是算力最大;SFT 是在人工构造的指令数据上继续做监督微调,把基座模型对齐成会听指令、会按格式回答的助手,数据量小但质量要求高;RLHF 是在 SFT 之上用人类偏好数据训一个奖励模型,再用强化学习优化策略去提高人类更偏好的回答概率,解决的是「同一个问题有很多种答法,哪一种更好」这种监督信号难以直接表达的问题。三者是递进关系,现在常见的是 SFT 打底加偏好优化(DPO 一类)替代完整的强化学习流程。
知识体系怎么搭
按「一层原理、一层系统、一层场景」来搭:原理层是操作系统、网络、数据库、语言与并发这些不变的基本盘;系统层是分布式、缓存、消息队列、可观测性这些工程组件与它们的取舍;场景层是把自己项目里踩过的坑和线上问题反向挂到前两层上去。具体做法是每面完一场就把题目按这三层归类,答不上的标红进复习队列,重复出现的知识点说明是高频必答项,几次之后复习计划就是自动生成的,比刷题库有效。