快手 大模型算法 一面
1. 自我介绍
2. 为什么要用 DPO,你的 DPO 数据从哪里来
DPO 主要用来做偏好对齐,让模型在两个候选答案中更倾向于选择符合业务偏好的回答,而不是只学会复现标准答案。SFT 解决的是“会不会做”,DPO 更偏向解决“更喜欢哪种做法”。数据一般不是直接从线上拿一问一答就能用,而是先用上一版 checkpoint 对同一批 prompt 做多候选采样,再经过规则、模型评审和人工复核构造 chosen/rejected。这里不用商业 API 蒸馏正反样本,是因为不同模型的输出分布和本地模型不一致,直接蒸馏会让偏好边界偏到外部模型的风格上,最后 DPO 学到的是别人的分布,不一定能提升当前模型。
def build_dpo_pair(prompt, candidates, judge_fn):
scored = [(judge_fn(prompt, c), c) for c in candidates]
scored.sort(key=lambda x: x[0], reverse=True)
return {
"prompt": prompt,
"chosen": scored[0][1],
"rejected": scored[-1][1]
}
3. DPO 为什么常配合 rejection sampling,而不是直接拿随机负样本训练
随机负样本很多时候太弱,模型很容易区分,但学不到真正细粒度的偏好边界。Rejection sampling 的作用是从当前模型或上一版模型的候选输出里筛掉不合格样本,把质量差异相对接近但偏好明确的样本保留下来。这样的 chosen/rejected 更接近模型真实会犯的错,对 DPO 更有价值。如果正负样本都来自商业 API,或者和当前模型分布差太远,训练容易变成风格迁移,而不是偏好优化。
4. 为什么说 DPO 数据最好来自上一版 checkpoint 的采样分布
因为 DPO 的优化假设里,模型需要在自身可能生成的候选空间里调整偏好。如果 rejected 完全来自另一个强模型或另一个风格体系,它可能不是当前模型真实会生成的坏答案,优化信号就会变弱。上一版 checkpoint 采样出来的候选更贴近当前模型的错误模式,DPO 才能真正修正它的偏好。实际训练时还会控制采样温度、候选数量和过滤规则,避免数据太简单或者全是噪声。
5. DPO 的核心公式是什么,里面的 πθ 和 πref 分别代表什么
DPO 的核心思想是让当前策略模型 πθ 相比参考模型 πref,更偏向 chosen 而不是 rejected。常见损失可以写成:

其中 yw 是 chosen,yl 是 rejected,πθ 是当前要训练的模型,πref 通常是 SFT 后冻结的参考模型。β 控制偏好优化强度。它不是简单让 chosen 概率变大,而是要求当前模型相对参考模型,在 chosen/rejected 的概率差上产生更符合偏好的变化。
import torch
import torch.nn.functional as F
def dpo_loss(pi_logp_w, pi_logp_l, ref_logp_w, ref_logp_l, beta=0.1):
pi_logratios = pi_logp_w - pi_logp_l
ref_logratios = ref_logp_w - ref_logp_l
logits = beta * (pi_logratios - ref_logratios)
return -F.logsigmoid(logits).mean()
6. DPO 中 beta 参数过大或过小会发生什么
beta 可以理解为偏好约束强度。太小的时候,chosen 和 rejected 的差异信号被压得很弱,训练会变慢,甚至看不到明显偏好提升;太大的时候,模型会过度追求偏好对里的差异,容易偏离 SFT 分布,出现格式不稳、长度漂移和泛化下降。实际使用中不会只看训练 loss,还会看 win rate、拒答准确率、长度分布和业务验证集表现。很多 DPO 翻车,不是公式错,而是 beta、数据质量和参考模型没配好。
7. GRPO 的公式讲一下,实际使用时 pi_theta 和 pi_old 怎么处理
GRPO 是一种基于组内相对优势的强化学习优化方法。对同一个问题采样多个回答,得到一组 reward,然后用组内均值和方差归一化得到 advantage,再更新当前策略。它常见形式会包含重要性比率:

实际使用时,πold 通常是采样时的旧策略。很多工程实现里一轮 rollout 后旧策略比例近似为 1,真正优化时主要用 advantage 和 KL 约束控制模型别跑太远。最后落地经常不是完全照论文每个细节做,而是用优势分数加 KL 散度做稳定优化。
def normalize_advantage(rewards, eps=1e-6):
r = torch.tensor(rewards, dtype=torch.float32)
return (r - r.mean()) / (r.std() + eps)
8. GRPO 和 DPO 的区别是什么
DPO 依赖成对偏好数据,优化的是 chosen 相对 rejected 的概率差;GRPO 更依赖同一个 prompt 下多候选的 reward,通过组内相对优势来更新策略。DPO 工程更轻,适合已有偏好对的场景;GRPO 更适合数学、代码、推理这类可以打分或验证的任务。DPO 的关键是 pair 质量,GRPO 的关键是 reward 设计和采样质量。两者不是谁替代谁,而是适用阶段不同:SFT 后可以先 DPO 稳偏好,再用 GRPO 针对可验证任务继续提升。
9. 为什么 GRPO 里经常要做组内归一化 advantage
组内归一化是为了消掉不同 prompt 之间 reward 标尺不一致的问题。比如一道题 reward 普遍很低,另一道题普遍很高,如果直接混在一起训练,会让 reward 绝对值影响更新,而不是让模型学会“同一道题里哪个答案更好”。组内归一化后,模型关注的是同一个问题下候选答案的相对优劣。这样训练更稳定,也更适合多候选采样场景。
10. 为什么文档类 RAG 不一定要按固定长度分段
文档类 RAG 最怕的是把一个完整语义单元切碎。固定长度切分虽然简单,但会把标题、定义、表格、条款和上下文关系切断,导致召回片段看起来相关却证据不完整。实际业务里更常用按标题层级、段落、条款编号、页面结构或元数据切分。比如药品说明书、合同、制度文档这类内容,本身就有天然结构,直接按结构切会比固定 to
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以“原理+场景+实战”为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.