面灵AI→

滴滴算法面经合集:RL 八股与 Agent 项目深挖

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

《面试题目》

  1. GRPO 的训练过程中要看什么指标?数据怎么构造?如何优化 GRPO?相对 PPO 的区别是什么?
  2. agentic RL 中数据怎么来?SFT 的数据怎么来?如果按照这个数据采集逻辑会有什么问题,怎么解决?
  3. SFT 和 RL 分别什么时候做?什么时候只做 SFT 就够了?
  4. RL 训练中的 reward hacking 问题怎么处理?
  5. PPO、GRPO、DAPO 的区别和各自优缺点是什么?
  6. 大致介绍 DAPO 相比 GRPO 的四项改进;它的 loss 计算方式和 GRPO 有什么区别?能不能把 token-level 和 sequence-level 的方式结合起来(GSPO)?
  7. 是否遇到过熵坍塌?如何解决?
  8. 动态采样的原理和具体流程是什么?
  9. 重要性采样机制的原理是什么?clip 的作用是什么?为什么 clip higher 对 A<0 的动作不起作用?
  10. PPO 里 value model / critic 的作用是什么?
  11. GRPO 的组内优势怎么估计?为什么 GRPO 不需要 value model?
  12. group 里 reward 全 0 或者全 1 会有什么后果?
  13. DPO 的损失函数是什么?
  14. DAPO、GSPO 这些 GRPO 变体分别改了什么?
  15. RL 训练前期学不动应该怎么处理?
  16. SFT 冷启动相关问题:数据从哪来、怎么配比?
  17. SFT 训练阶段如果不看测试集,如何衡量训练效果?GRPO 阶段呢?
  18. 样本难度分层、课程学习和有效样本选择怎么做?
  19. 训练时 reward、KL、clip fraction 这些指标怎么看?
  20. trajectory-level reward 和 token-level optimization 之间的 gap 在哪?
  21. token 级训练里 credit assignment 不精确的问题怎么缓解?
  22. 业务场景里的 reward 应该怎么设计?
  23. VERL 基于什么框架做的?底层训练和推理引擎是什么?
  24. LoRA 和 QLoRA 的区别?
  25. 分类任务样本不均衡如何解决?
  26. 机器模型、树模型相关知识点。
  27. 项目二拷打:在什么场景下使用?相较于现有工具有什么优势?
  28. 数据如何处理?数据量多少?
  29. 各个模块怎么设计、什么作用?比如记忆压缩机制、reflect 模块机制,如何确定筛选边界?
  30. 项目相关八股:nanocc 结构、RRF、双塔模型和单峰模型的区别?
  31. 数据量多的时候怎么优化检索速度?
  32. ReAct 范式是什么?
  33. Agent 多轮对话如何记住最初的任务?
  34. Agent 的记忆与自我改进如何实现?
  35. 工具调用型 Agent 的基本流程怎么设计?
  36. 用 AI coding 设计一套系统,你会怎么做?
  37. 手撕:Transformer 实现(含 MHA)。
  38. 手撕:代码实现开根号。
  39. Transformer 自注意力机制的原理?时间空间复杂度是多少?
  40. 自注意力存在什么问题?有什么优化方案?
  41. 讲一下 vLLM 推理框架。
  42. KV cache 的原理是什么?
  43. 大模型幻觉的原因以及解决办法?如何降低大模型输出幻觉?
  44. 结合项目经历,挑一个完成度最高、最能体现个人能力的核心项目,完整介绍项目背景、实现方案与落地价值。
  45. 你所做的对话类 AI 项目,核心面向的目标用户群体和实际服务场景分别是什么?
  46. 你落地的智能问答系统是否仅用于信息查询辅助、不参与最终业务决策?请说明系统的实际定位。
  47. 在智能问数项目落地过程中,你碰到的最大技术瓶颈是什么?详细说明排查过程与最终解决方案。
  48. 智能问数场景下的数据误差,根源是数据获取链路存在缺陷,还是大模型对数值逻辑的理解能力不足?
  49. 你的项目落地中是否遇到过大模型幻觉现象?具体通过哪些方案针对性优化解决?
  50. 从工程落地角度,讲讲知识库增强与模型微调两种方案的适用边界,什么场景优先微调、什么场景优先扩知识库?
  51. 开展模型微调工作时,你选择基座模型参数量、模型版本的核心判断依据是什么?
  52. 微调任务的训练数据集,你是如何筛选、构造以及扩充生成的?
  53. 微调效果评估体系如何搭建?会从哪些维度量化模型优化效果?
  54. 项目推进过程中,你遇到过最棘手的非技术类问题是什么?复盘来看最优的处理方式是什么?
  55. 你现阶段求职、更换工作的核心诉求是什么?对新岗位的工作内容与成长路径有哪些期待?

《参考解析》

这份合集怎么用:原帖作者在前言里给了一条很实用的观察——他的面试里,面试官大部分时间在问实习内容和细节;如果实习或项目与面试官做的业务相似,就深挖实习;如果方向不同,面试官更倾向于问八股,并通过项目细节确认「这个项目是不是你真做的、难度到底有多大」。所以准备时别只堆八股,把项目里「数据量、模块边界、为什么这么设计、踩过什么坑」这些能被追问三轮的细节先理顺,性价比最高。

PPO / GRPO / DPO 的分工:PPO 是 on-policy 的 actor-critic:actor 生成、critic 估状态价值、用 GAE 算优势,再加一个奖励模型(或规则奖励)打分,训练时用重要性采样比 ratio = π_new/π_old 和 clip 把更新限制在信任域内。它稳,但一要训 critic(显存和算力约等于再来一个模型),二要对 reward 做 token 级信用分配。GRPO 直接把 critic 砍掉:同一 prompt 采样一组(比如 8 条)回答,用组内 reward 的均值方差做归一化得到优势 A_i = (r_i - mean)/std,组内比较替代价值估计,省掉一半显存。DPO 更彻底,它把「RLHF 目标的最优策略」解析出来,得到一个只依赖偏好对 (chosen, rejected) 的闭式损失,等价于隐式奖励模型,无需采样、无需 reward model,训练像做分类一样简单——代价是没有在线探索,容易过拟偏好数据、对分布外样本束手无策。一句话选型:偏好数据干净、只想对齐风格 → DPO;有可验证 reward、需要探索提升上限 → GRPO/PPO;长思维链、多步推理 → PPO/GRPO 系更合适。

GRPO 的组内优势与「全对 / 全错」:组内标准差的估计方式一般是 (r_i - mean) / (std + eps),std 为 0 时靠 eps 兜住,但这时优势全为 0、梯度消失,这一组就是白采。如果一批样本奖励全 1(太简单)或全 0(太难),组内没有任何对比信息,advantage 归零,训练停滞——原帖这道题问的就是这个现象。工程上的对策有几类:一是动态采样 / 难度过滤,只保留「组内有对有错」的 prompt(DAPO 的 dynamic sampling 就是丢掉准确率等于 0 或 1 的组再补采);二是把归一化从组内换成 batch 级,或改用带基线的绝对优势估计;三是难度分层与课程学习,按通过率给样本分桶,逐步提难度;四是共用一个全局 baseline 而不是组内 baseline。

DAPO 的四项改进与 GSPO:DAPO 主要针对长思维链 RL 的四个痛点——① clip-higher:把上界 ε_high 放宽(例如 0.28)、下界保持小(0.2),避免低概率 token 被过早压死、保护探索,缓解熵坍塌;② 动态采样:丢弃全对/全错的组并补齐 batch,保证每个 batch 都有梯度信号;③ token-level policy loss:按 token 数而不是按序列平均,让长回答的每个 token 权重一致,避免长序列梯度被稀释;④ 超长惩罚的 soft overlong punishment:对超长回答给一个随长度递增的软惩罚,而不是硬截断给 0 分。它和 GRPO 的 loss 差别核心就在「归一化维度」:GRPO 是 sequence 级平均(每条序列内部先平均再对序列平均),DAPO 是 token 级平均。GSPO(Group Sequence Policy Optimization)走的是另一条路:把重要性比从 token 级改成序列级 s_i = (π_new(y_i|x)/π_old(y_i|x))^(1/|y_i|),整条序列共用一个比值做 clip,这样重要性权重不会沿长序列连乘指数级爆炸,训练更稳、也更容易做 MoE 的并行。所谓「把 token-level 和 sequence-level 结合」,实践中就是 GSPO 这种做法:序列级做裁剪保证稳定,token 级给 credit 保证细粒度。

重要性采样、clip 与「clip higher 对 A<0 不起作用」:on-policy 算法每轮只采一次数据就更新,为了复用同一批数据做多次梯度更新,需要重要性采样把旧策略分布下的期望换算到新策略下,比值为 ratio = π_θ(a|s)/π_old(a|s)。PPO 的 clip 目标 min(ratio·A, clip(ratio,1-ε,1+ε)·A) 是一个悲观下界:当 A>0(好动作)而 ratio 涨过 1+ε 时,clip 把收益截断,阻止这一步迈太大;当 A<0(坏动作)时,ratio 越小 loss 越大,所以真正起作用的是下界 1-ε——把 ratio 压到 1-ε 以下就不再增加惩罚。因此放宽上界(clip higher)只影响 A>0 的动作,对 A<0 的动作完全没有约束力;要控制坏动作的下降幅度,得单独调 ε_low,或者用双端不对称的 clip(DAPO 就是 ε_low=0.2、ε_high=0.28)。

熵坍塌、reward hacking 与前期学不动:熵坍塌指策略输出分布越来越尖,几乎只输出同一种回答,探索能力丧失,表现为训练熵单调下降、pass@k 掉、reward 却还在涨。常见对策:放宽 clip 上界保护低概率 token、加熵奖励或 KL 惩罚、提高采样温度、做数据难度分层避免长期只刷简单样本、正则化 logits。reward hacking 是模型找到「拿高分但不解决问题」的捷径,比如输出变长骗长度奖励、堆砌关键词骗规则奖励、反复调工具刷调用分。治理思路分三层:指标上监控 reward 与人工评估/业务指标的背离;奖励设计上做多信号约束(结果奖励为主、过程奖励为辅,加长度与格式惩罚,规则校验可验证结果);训练上做 KL 约束防跑偏、定期用新数据重建 reward model 防被 exploit。RL 前期学不动,先分清是数据问题还是优化问题:如果一组样本 reward 方差接近 0(全对/全错),是数据太简单或太难,用动态采样和难度分桶解决;如果 KL 涨得很快、clip fraction 接近 0.2 以上,是步长太大,降 lr、缩 clip 范围、warmup 更久;如果是 reward 尺度太小,做归一化;如果 SFT 底座太弱连格式都稳不住,就先补冷启动 SFT。

Transformer 手撕与 KV cache、幻觉:手撕 MHA 的要点是写清四个投影 W_q/W_k/W_v/W_o、拆多头(view + transpose 成 [B, H, L, D])、scores = QK^T / sqrt(d_k)、因果 mask(上三角填 -inf 后 softmax)、加权求和再合并头。自注意力时间空间复杂度都是 O(L²·d),长上下文下平方项是瓶颈。优化方向:稀疏/局部注意力(Longformer、BigBird)、线性注意力与 SSM(Performer、Mamba)、FlashAttention 用分块 + 在线 softmax 把中间矩阵留在 SRAM 里降低显存访问、GQA/MQA 让多个 query 头共享 KV 头以压缩 KV cache、滑动窗口注意力。KV cache 的原理是自回归解码时每步只新增一个 token,历史 token 的 K/V 不变,缓存下来就能把每步计算从「重算全序列」降到「只算新 token」,代价是显存随 层数 × 头数 × 序列长 × head_dim 线性增长,于是有了 PagedAttention(vLLM 把 KV 按块分页管理、消除碎片并支持前缀共享)、量化 KV、驱逐与滑窗等做法;vLLM 的核心就是 PagedAttention + continuous batching(连续批处理让新请求随时插入,不等整批结束),吞吐比朴素实现高数倍。大模型幻觉的成因按来源分三类:训练数据里存在错误或长尾知识、解码阶段采样引入的随机性、以及提示词欠缺约束导致模型「必须回答」。对应手段是 RAG 把事实依据放到上下文、要求带引用并校验引用、降低温度或做自一致性投票、允许回答「不知道」、用工具/代码执行做可验证计算、输出后加规则或模型二次校验。