滴滴算法面经合集:RL 八股与 Agent 项目深挖
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- GRPO 的训练过程中要看什么指标?数据怎么构造?如何优化 GRPO?相对 PPO 的区别是什么?
- agentic RL 中数据怎么来?SFT 的数据怎么来?如果按照这个数据采集逻辑会有什么问题,怎么解决?
- SFT 和 RL 分别什么时候做?什么时候只做 SFT 就够了?
- RL 训练中的 reward hacking 问题怎么处理?
- PPO、GRPO、DAPO 的区别和各自优缺点是什么?
- 大致介绍 DAPO 相比 GRPO 的四项改进;它的 loss 计算方式和 GRPO 有什么区别?能不能把 token-level 和 sequence-level 的方式结合起来(GSPO)?
- 是否遇到过熵坍塌?如何解决?
- 动态采样的原理和具体流程是什么?
- 重要性采样机制的原理是什么?clip 的作用是什么?为什么 clip higher 对 A<0 的动作不起作用?
- PPO 里 value model / critic 的作用是什么?
- GRPO 的组内优势怎么估计?为什么 GRPO 不需要 value model?
- group 里 reward 全 0 或者全 1 会有什么后果?
- DPO 的损失函数是什么?
- DAPO、GSPO 这些 GRPO 变体分别改了什么?
- RL 训练前期学不动应该怎么处理?
- SFT 冷启动相关问题:数据从哪来、怎么配比?
- SFT 训练阶段如果不看测试集,如何衡量训练效果?GRPO 阶段呢?
- 样本难度分层、课程学习和有效样本选择怎么做?
- 训练时 reward、KL、clip fraction 这些指标怎么看?
- trajectory-level reward 和 token-level optimization 之间的 gap 在哪?
- token 级训练里 credit assignment 不精确的问题怎么缓解?
- 业务场景里的 reward 应该怎么设计?
- VERL 基于什么框架做的?底层训练和推理引擎是什么?
- LoRA 和 QLoRA 的区别?
- 分类任务样本不均衡如何解决?
- 机器模型、树模型相关知识点。
- 项目二拷打:在什么场景下使用?相较于现有工具有什么优势?
- 数据如何处理?数据量多少?
- 各个模块怎么设计、什么作用?比如记忆压缩机制、reflect 模块机制,如何确定筛选边界?
- 项目相关八股:nanocc 结构、RRF、双塔模型和单峰模型的区别?
- 数据量多的时候怎么优化检索速度?
- ReAct 范式是什么?
- Agent 多轮对话如何记住最初的任务?
- Agent 的记忆与自我改进如何实现?
- 工具调用型 Agent 的基本流程怎么设计?
- 用 AI coding 设计一套系统,你会怎么做?
- 手撕:Transformer 实现(含 MHA)。
- 手撕:代码实现开根号。
- Transformer 自注意力机制的原理?时间空间复杂度是多少?
- 自注意力存在什么问题?有什么优化方案?
- 讲一下 vLLM 推理框架。
- KV cache 的原理是什么?
- 大模型幻觉的原因以及解决办法?如何降低大模型输出幻觉?
- 结合项目经历,挑一个完成度最高、最能体现个人能力的核心项目,完整介绍项目背景、实现方案与落地价值。
- 你所做的对话类 AI 项目,核心面向的目标用户群体和实际服务场景分别是什么?
- 你落地的智能问答系统是否仅用于信息查询辅助、不参与最终业务决策?请说明系统的实际定位。
- 在智能问数项目落地过程中,你碰到的最大技术瓶颈是什么?详细说明排查过程与最终解决方案。
- 智能问数场景下的数据误差,根源是数据获取链路存在缺陷,还是大模型对数值逻辑的理解能力不足?
- 你的项目落地中是否遇到过大模型幻觉现象?具体通过哪些方案针对性优化解决?
- 从工程落地角度,讲讲知识库增强与模型微调两种方案的适用边界,什么场景优先微调、什么场景优先扩知识库?
- 开展模型微调工作时,你选择基座模型参数量、模型版本的核心判断依据是什么?
- 微调任务的训练数据集,你是如何筛选、构造以及扩充生成的?
- 微调效果评估体系如何搭建?会从哪些维度量化模型优化效果?
- 项目推进过程中,你遇到过最棘手的非技术类问题是什么?复盘来看最优的处理方式是什么?
- 你现阶段求职、更换工作的核心诉求是什么?对新岗位的工作内容与成长路径有哪些期待?
《参考解析》
这份合集怎么用:原帖作者在前言里给了一条很实用的观察——他的面试里,面试官大部分时间在问实习内容和细节;如果实习或项目与面试官做的业务相似,就深挖实习;如果方向不同,面试官更倾向于问八股,并通过项目细节确认「这个项目是不是你真做的、难度到底有多大」。所以准备时别只堆八股,把项目里「数据量、模块边界、为什么这么设计、踩过什么坑」这些能被追问三轮的细节先理顺,性价比最高。
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 把事实依据放到上下文、要求带引用并校验引用、降低温度或做自一致性投票、允许回答「不知道」、用工具/代码执行做可验证计算、输出后加规则或模型二次校验。