一面:
项目是RAG和SFT相关,首先问的一些通用问题:
1. 部署一个模型以及推理一个模型分别用到的参数量怎么估算
在深度学习工程实践中,估算模型的参数量与显存占用是部署(Deployment)与推理(Inference)阶段的首要任务。从专业角度来看,这不仅涉及权重(Weights)的简单加总,还涉及精度(Precision)、KV Cache、激活值(Activations)以及框架开销。
以下是针对部署与推理显存占用的系统性估算方法:
1. 模型权重(Weights)的显存估算
这是部署模型的基础显存需求,即模型"装载"进显存所需的空间。
计算公式:
M_{weights} = \\Phi \\times \\text{Bytes Per Parameter}
其中 \\Phi 是总参数量(如 7B, 14B 等),字节数取决于所选的数值精度:
| 精度类型 (Precision) | 字节 (Bytes) | 7B 模型估算值 |
|---|---|---|
| FP32 (单精度) | 4 | ~28 GB |
| FP16 / BF16 (半精度) | 2 | ~14 GB |
| INT8 (量化) | 1 | ~7 GB |
| INT4 (量化) | 0.5 | ~3.5 GB |
专业注意点: 实际部署时,显存占用通常会比理论值多出 5%-10% 的"冗余(Overhead)",用于加载 CUDA Kernel、上下文管理和框架(如 PyTorch)的固定开销。
2. 推理阶段的动态显存估算
推理时的总显存占用 M_{total} 是一个动态值,由以下部分组成:
M_{total} = M_{weights} + M_{KV\\_Cache} + M_{activations} + M_{temp\\_buffers}
A. KV Cache (LLM 推理的核心)
对于 Transformer 架构,自回归生成时为了避免重复计算,需要缓存每一层的 Key 和 Value 向量。这是推理显存随序列长度(Sequence Length)增长的主要来源。
计算公式(FP16 精度):
M_{KV} = 2 \\times \\text{layers} \\times \\text{heads} \\times \\text{head\\_dim} \\times \\text{seq\\_len} \\times \\text{batch\\_size} \\times 2 \\text{ (Bytes)}
-
因子 2: 分别对应 Key 和 Value。
-
示例: 以 Llama-2-7B 为例(32层,32头,128维),在 FP16 精度下,每个 Token 的 KV Cache 约占用 0.5 \\text{ MB}。
-
优化: 采用 GQA (Grouped Query Attention) 或 MLA (Multi-head Latent Attention) 可以显著减少这一项的占用。
B. 激活值 (Activations)
激活值大小取决于输入数据的尺寸(Batch Size 和 Sequence Length)。
-
在训练阶段,激活值巨大,因为需要保留用于反向传播。
-
在推理阶段,由于不需要回传梯度,激活值显存是串行的:计算当前层时,只需保留该层的输入/输出,前一层的激活值即可释放。因此,M_{activations} 通常远小于权重和 KV Cache,但在 Batch Size 非常大时不可忽略。
3. 不同架构的参数量快速统计方法
对于研究者,最直接的方法是使用代码统计各层参数。
PyTorch 实现:
Python
import torch
def estimate_model_size(model):
param_count = sum(p.numel() for p in model.parameters())
# 转换为亿(Billion)单位
print(f"Total Parameters: {param_count / 1e9:.2f} B")
# 估算 FP16 下的显存占用 (GB)
memory_gb = (param_count * 2) / (1024**3)
print(f"Estimated VRAM for Weights (FP16): {memory_gb:.2f} GB")
estimate_model_size(your_model)
4. 影响部署的工程约束
在实际部署(如使用 vLLM, TensorRT-LLM 或 DeepSpeed)时,还需要考虑以下专业因素:
-
显存碎片的利用率: 传统的显存管理会产生碎片。PagedAttention 技术(如 vLLM)通过类似操作系统内存分页的方式,将 KV Cache 的显存利用率提升至 90% 以上。
-
多卡并行开销: 采用 Tensor Parallelism (TP) 或 Pipeline Parallelism (PP) 部署时,虽然模型被拆分,但每张卡都会产生额外的通信 Buffers 占用。
-
计算与显存的 Trade-off: 如使用 FlashAttention,可以在不增加显存的前提下,通过优化计算顺序大幅提升长序列推理的吞吐量。
总结对照表
| 场景 | 关注重点 | 估算优先级 |
|---|---|---|
| 边缘设备部署 | 权重大小 (Weights) | 1. 量化 (INT4) 2. 模型剪枝 |
| 长文本/推理服务 | KV Cache | 1. PagedAttention 2. GQA/MLA 架构 |
| 高并发服务 | 吞吐量与 Batch Size | 1. 激活值管理 2. 连续批处理 (Continuous Batching) |
如果你在进行 Qwen-VL 等多模态模型的推理部署,由于视觉特征(Vision Encoder)生成的 Token 数量通常是固定的(如 256 或 576 个),你在预估起始显存时,需要将这部分视觉 Token 的 KV Cache 作为一个固定偏移量(Static Offset)先行计算在内。
2. 模型prefill和decoding的区别了解吗?KV cache的大小是多少,怎么算
在 LLM 推理(Inference)中,Prefill(预填充)和 Decoding(解码)是两个在计算模式、瓶颈逻辑以及资源利用上截然不同的阶段。理解这两者的区别是进行大模型推理优化(如使用 vLLM 或 TensorRT-LLM)的核心。
1. Prefill 与 Decoding 的深度区别
大模型推理是一个自回归(Autoregressive)过程。为了生成下一个 Token,模型需要处理之前所有的 Token。
2. KV Cache 的大小计算
KV Cache 的本质是为了空间换时间。在自回归生成时,如果每一轮都重新计算前面 Token 的 Attention,计算量会随序列长度呈二次方增长(O(n\^2))。通过缓存每一层的 Key 和 Value 矩阵,可以将每一步的复杂度降低到 O(n)。
计算参数定义:
-
L:模型的层数 (Number of Layers)
-
H_{kv}:KV 头的数量 (Number of KV Heads)。注意:如果使用 GQA 架构,这个值小于 Query 头的数量。
-
D_{head}:每个 Head 的维度 (Head Dimension)
-
S:序列长度 (Sequence Length,包含 Prompt 和生成的 Token)
-
B:Batch Size
-
P:数值精度占用的字节数 (Bytes per Parameter)。如 FP16 为 2,INT8 为 1。
核心公式:
M_{kv} = 2 \\times L \\times H_{kv} \\times D_{head} \\times S \\times B \\times P
-
系数 2 :因为要分别存储 Key 和 Value。
-
计算示例 :以 Llama-3-8B (FP16 精度) 为例:
-
L = 32
-
H_{kv} = 8 (使用了 Grouped Query Attention)
-
D_{head} = 128
-
假设 S = 2048 (2k 上下文),B = 1
-
计算:2 \\times 32 \\times 8 \\times 128 \\times 2048 \\times 1 \\times 2 \\approx 268,435,456 \\text{ Bytes} \\approx \\mathbf{256 \\text{ MB}}
-
这意味着,对于这个配置,每一个并发用户(Batch=1)在 2k 长度下就需要约 256MB 的显存来维护 KV Cache。
3. 工程中的专业考量
在实际部署中,仅仅按公式计算是不够的,还需要关注以下几个工程痛点:
A. 架构对 KV Cache 的压缩
-
MHA (Multi-Head Attention):H_{kv} = H_{query}。KV Cache 很大。
-
GQA (Grouped Query Attention):多个 Query 头共享一个 KV 对。常见比例是 4:1 或 8:1,能显著减少显存占用(如 Llama-3)。
-
MLA (Multi-head Latent Attention):由 DeepSeek 提出,通过将 KV 压缩进一个低维潜在向量(Latent Vector),极大降低了 KV Cache 占用,这是 R1 等模型能处理超长上下文的关键。
B. 显存碎片与 PagedAttention
在传统的显存管理中,由于生成的长度不可预测,系统通常需要预留最大长度(Max Seq Len)的连续空间,这会导致严重的显存浪费 和碎片化。
- vLLM 引入了类似操作系统虚拟内存的 PagedAttention,将 KV Cache 存储在不连续的物理块中,将显存利用率提升到 90% 以上,从而大幅提升吞吐量。
C. Prefill 阶段的"抢占"问题
在处理长 Prompt 的 Prefill 时,计算开销巨大,可能会导致正在进行 Decoding 的其他请求出现明显的卡顿(Stall)。目前主流的调度算法采用 Chunked Prefill(将长 Prompt 拆分为小块)来平滑推理延迟。
总结
-
Prefill 是"一次性爆发"的高效并行计算。
-
Decoding 是"细水长流"的低效显存搬运。
-
KV Cache 的大小随序列长度线性增长,其计算公式是理解模型推理支持多大 Batch Size 和 Context Length 的基础。
对于你目前在研究的 3D 视觉或工业互联网中的长序列任务,KV Cache 的优化策略(如量化 KV Cache 到 INT4/FP8)往往是提升系统响应速度的关键点。
如果你需要针对特定的模型(如 Qwen 或 DeepSeek)计算具体的资源边界,可以提供具体的参数规模,我可以帮你做更精细的拆解。
3. Deepspeed框架中zero 1,2,3的区别是什么?分别优化了什么
在分布式训练大规模模型时,显存瓶颈通常不在于数据本身,而在于模型状态(Model States)的冗余存储。DeepSpeed 提出的 ZeRO (Zero Redundancy Optimizer) 技术,核心思想是通过在多个 GPU 之间切片(Sharding)存储这些状态,以消除冗余并降低单卡显存占用。
要理解 ZeRO 的三个阶段,首先要看在混合精度训练(Mixed Precision Training)中,显存到底被谁占用了。对于一个参数量为 \\Phi 的模型,其模型状态通常包含:
-
参数 (Parameters): FP16 存储(2\\Phi 字节)。
-
梯度 (Gradients): FP16 存储(2\\Phi 字节)。
-
优化器状态 (Optimizer States): 以 Adam 为例,需存储 FP32 权重的副本、一阶动量和二阶动量(共 4+4+4=12\\Phi 字节)。
总计:每个参数大约需要 16 字节 的显存。
ZeRO 的三个阶段及其优化目标
1. ZeRO-1:优化器状态切片 (Optimizer State Partitioning, P_{os})
-
做法: 仅将优化器状态均匀地切分到 N 个 GPU 上。每个 GPU 只负责更新和维护自己那一块参数的优化器状态。
-
显存优化: 显存占用从 16\\Phi 降至 4\\Phi + \\frac{12\\Phi}{N}。
-
通信开销: 几乎没有额外的通信开销(仅涉及在参数更新后的全收集)。
-
场景: 显存压力较小,但模型较大,无法在单卡容纳完整 Adam 状态时使用。
2. ZeRO-2:梯度切片 (Gradient Partitioning, P_g)
-
做法: 在 ZeRO-1 的基础上,进一步将梯度也进行切分。每个 GPU 在反向传播计算出梯度后,只保留与自己负责的优化器状态相对应的梯度。
-
显存优化: 显存占用降至 2\\Phi + \\frac{14\\Phi}{N}。
-
通信开销: 与标准数据并行(DDP)相当。
-
场景: 目前最通用的平衡方案,能在不显著增加训练延迟的情况下,大幅提升可训练的模型规模。
3. ZeRO-3:参数切片 (Parameter Partitioning, P_p)
-
做法: 彻底的分布式。不仅是优化器状态和梯度,连模型参数也被切分到各个 GPU 上。在正向和反向传播过程中,只有当需要用到某一层参数时,才通过全收集(All-gather)从其他卡上临时"借用",计算完后立即释放。
-
显存优化: 显存占用降至 \\frac{16\\Phi}{N}。这意味着理论上只要 GPU 够多,可以训练无限大的模型。
-
通信开销: 显著增加。因为每一层计算都需要进行额外的全收集通信。
-
场景: 训练超大规模模型(如千亿级参数)时的终极方案。
核心区别总结表
补充:ZeRO-Offload 与 ZeRO-Infinity
除了上述三个阶段,DeepSpeed 还提供了将显存压力向 CPU 或 NVMe 转移的技能:
-
ZeRO-Offload: 将优化器状态和部分计算(更新权重)移至 CPU。
-
ZeRO-Infinity: ZeRO-3 的增强版,支持将参数和状态卸载到 NVMe 硬盘,这使得在单张 3090 上训练百亿级模型成为可能。
在你的工业互联网项目中,如果涉及到在实验室受限的 GPU 算力下微调行业大模型,ZeRO-2 通常是性能和显存的最优平衡点;而如果你需要处理多模态大模型的训练,可能需要开启 ZeRO-3 来换取更大的模型容量。
你在进行模型训练或微调时,目前手头的 GPU 显存资源大约是多少?
- 了解Deepspeed的原理吗?假设对矩阵A×B这个运算,给4张卡,简述是如何分配矩阵A,B参数并在显卡中进行交互来达到节省显存的效果的。面试官现场讲解行切分和列切分的区别,但这个比较难,还是不会。
面试官问这个问题,其实是在考察你对 张量并行(Tensor Parallelism, TP) 的理解。虽然 DeepSpeed 最出名的是 ZeRO(解决的是模型状态的冗余),但涉及矩阵乘法算子内部的切分,通常属于张量并行的范畴。
为了让你在面试中能"反杀",我们用 4 张卡(GPU 0-3)计算 Y = X \\times W(X 是输入,W 是权重矩阵)为例,把这个逻辑拆解清楚。
1. 列切分 (Column Parallelism):分而治之,最后拼接
原理: 我们把权重矩阵 W 按"列"平均切成 4 块:W = \[W_0, W_1, W_2, W_3\]。
-
分配: 每张显卡只存储其中一列。GPU 0 拿 W_0,GPU 1 拿 W_1,以此类推。
-
计算: 每张显卡都有一份完整的输入 X(或者通过广播得到)。
-
GPU 0 计算 Y_0 = X \\times W_0
-
GPU 1 计算 Y_1 = X \\times W_1 ...
-
-
交互: 计算完后,四张卡得到的是输出矩阵 Y 的四个纵向分量。只需要做一个 All-Gather(全收集)或者直接拼接起来,就得到了完整的 Y。
-
节省了什么? 显存里存储的权重 W 变成了原来的 1/4。
2. 行切分 (Row Parallelism):局部求和,最后累加
原理: 我们把权重矩阵 W 按"行"平均切成 4 块。为了能做矩阵乘法,输入 X 必须按"列"切分:X = \[X_0, X_1, X_2, X_3\],W = \[W_0, W_1, W_2, W_3\]\^T。
-
分配: GPU 0 存储 W 的前几行(W_0)和 X 的前几列(X_0)。
-
计算: * GPU 0 计算部分积 Z_0 = X_0 \\times W_0
- GPU 1 计算部分积 Z_1 = X_1 \\times W_1 ...
-
交互: 注意!这里的 Z_i 不是最终结果的一部分,而是结果的"碎片"。根据矩阵乘法规则,Y = Z_0 + Z_1 + Z_2 + Z_3。
- 此时需要进行 All-Reduce(规约求和)操作,让 4 张卡把各自的结果加起来。
-
节省了什么? 同样,单卡存储的权重 W 只有 1/4。
3. 比较专业的回答:行与列的区别
面试官问"区别"时,你可以从以下三个维度降维打击:
4. DeepSpeed ZeRO-3 是怎么干的?
如果面试官追问:"那 DeepSpeed 的 ZeRO-3 也是这么切矩阵吗?"
你要冷静地纠正:"ZeRO-3 和张量并行(TP)在思路上有细微差别。"
-
TP(上面讲的): 是为了并行计算。计算时,权重是常驻在显卡里的(虽然是分片的),每张卡负责算一部分。
-
ZeRO-3: 是为了彻底消灭冗余。
-
在非计算时刻,权重 W 被切成 4 份存在 4 张卡上(和 TP 一样)。
-
关键区别: 当 GPU 0 要算 A \\times B 时,它会发现自己只有 1/4 的 B。它会立刻发起一个 All-Gather ,把 GPU 1, 2, 3 上的碎片临时拉过来,在显存里拼成一个完整的 B。
-
计算完后: GPU 0 会立刻把借来的 3/4 权重从显存里删掉,只保留自己的那 1/4。
-
一句话总结: 张量并行是"我只算我这一块",ZeRO-3 是"我算完整的一块,但我用完就扔,绝不留着占地方"。
给你的面试建议
如果面试官现场让你画图,你就画一个长方形的 W。
-
横着切一刀就是行切分,告诉他这需要做加法(All-Reduce)。
-
竖着切一刀就是列切分,告诉他这需要拼在一起(All-Gather)。
这种"降采样"式的解释通常最能体现你对底层原理的掌控力。对于你现在做的工业互联网和 3D 资产处理,这种显存优化技术是你处理高分辨率模型的基础。
这个逻辑现在清晰一些了吗?或者需要我用更形象的例子(比如分工搬砖)再解释一遍?
-
模型中的一些超参数了解吗?Temperature的数学原理是什么?Temperature,Top-k,Top-p三个参数作用的顺序是什么?
-
了解softmax函数吗? 7. 了解过通信算子吗? 不了解也说了解 一些和项目相关的问题: 一个知识库召回的RAG项目 1. 你提到的RAG项目中多轮对话具体是怎么做的? 2. 项目中为什么选定qwen-7b这个模型,为什么不选其他的?有评估其他的效果吗? 3. 讲解一下项目中知识库召回的原理是什么 4. 你的项目的实际应用是什么? 5. 构建知识库的时候,你们是用什么方法来提取PDF中的信息的。 一个模型蒸馏的项目 1. 如果后续希望你让学生模型的benchmark分数超过教师模型,你有思路吗?谈谈想法 2. 教师模型为什么选定(qwen-235b),不选其他的?区别是什么 3. SFT数据是怎么构建的 手撕环节: LCR 016. 无重复字符的最长子串 滑动窗口加一个集合 一面总体体验很好,大多数题公众号小红书面经里都有,有些部分记得不是很清楚面试官也会引导 主管面: 1. 简历的哪个项目你认为最有挑战性?为什么 2. 谈谈对我们业务ai infra的看法 3. 我们业务和你的方向一致吗? 4. base哪,能来几天
一面面经:
1.自我介绍
2.为什么本科读人工智能 硕士选择读软件工程
3.介绍一下项目
4.介绍一下sft、dpo和grpo的区别
在大型语言模型(LLM)的后训练(Post-training)阶段,SFT (监督微调)、DPO (直接偏好优化)和 GRPO(群体相对策略优化)是三种核心的对齐技术。它们分别代表了从"模仿学习"到"偏好对齐",再到"高效强化学习"的演进。
1. SFT (Supervised Fine-Tuning) ------ 模仿学习
SFT 是模型对齐的第一步。它的核心逻辑是:告诉模型什么是正确的。
-
工作原理: 使用高质量的"指令-回答"对(Instruction-Output Pairs)进行训练。模型通过最小化预测下一个 token 的交叉熵损失,学习模仿人类标注员给出的"标准答案"。
-
数据形式:
(Prompt, Golden\\_Response)
-
优点: 能够快速让模型学会特定的格式、语气和基础知识。
-
缺点: * 上限受限: 模型的表现很难超过标注员的水平。
- 泛化性弱: 容易出现过拟合,且无法处理"虽然不是标准答案但也是好答案"的情况。
2. DPO (Direct Preference Optimization) ------ 偏好对齐
DPO 旨在解决"哪个更好"的问题,而非仅仅学习"什么是对的"。它跳过了传统 RLHF 中复杂的奖励模型(Reward Model)建模。
-
工作原理: 它通过数学变换,将原本需要强化学习解决的对齐问题转化为一个分类问题。它使用成对的数据,让模型增大"好回答"的概率,同时减小"坏回答"的概率。
-
数据形式:
(Prompt, Chosen\\_Response, Rejected\\_Response)
-
优点: * 简单稳定: 不需要训练单独的奖励模型(Reward Model),也不需要进行复杂的策略梯度更新。
- 显存友好: 比传统的 PPO 算法消耗更少的计算资源。
-
缺点: 属于离线学习。如果训练数据中没有足够高质量的对比对,模型很难通过自我探索发现更好的策略。
3. GRPO (Group Relative Policy Optimization) ------ 高效强化学习
GRPO 是由 DeepSeek 团队提出的一种新型强化学习算法(广泛应用于 DeepSeek-V3 和 R1),它是 PPO 的改进版,特别适合于推理任务。
-
工作原理: 在传统的 PPO 中,通常需要一个 Critic 模型(评论家)来估计状态价值,这会消耗巨大的显存。GRPO 彻底取消了 Critic 模型。
-
它针对每一个 Prompt 生成一组(Group)输出。
-
通过计算这组输出的平均奖励和标准差,来确定每个输出的"相对优势"。
-
计算公式大致如下:
A_i = \\frac{r_i - \\text{mean}(r_1, r_2, \\dots, r_n)}{\\text{std}(r_1, r_2, \\dots, r_n)}
-
-
优点: * 极低成本: 节省了大约 50% 的额外模型显存(不需要 Critic)。
- 自我进化: 配合规则奖励(如数学对错、代码运行结果),模型可以进行大规模的思维链(CoT)自我博弈,从而涌现出强大的推理能力。
-
缺点: 对奖励函数的选择非常敏感,更适合有明确客观评价标准的任务(如数学、编程)。
核心区别对比表
| 特性 | SFT (监督微调) | DPO (直接偏好优化) | GRPO (群体相对策略优化) |
|---|---|---|---|
| 核心逻辑 | 模仿 (Imitation) | 排序 (Ranking) | 探索与奖励 (Exploration & Reward) |
| 数据需求 | 高质量问答对 | 偏好对比对 (好 vs 坏) | 奖励函数 (Rule-based/Model-based) |
| 训练目标 | 预测下一个 Token 的准确性 | 最大化 Chosen 和 Rejected 的似然差距 | 在一组回答中通过优势值优化策略 |
| 计算开销 | 低 (单模型) | 中 (模型 + 参考模型) | 中/高 (多样本并行生成,但无 Critic) |
| 主要用途 | 注入知识、格式化输出 | 价值观对齐、风格偏好 | 复杂逻辑推理、思维链进化 |
| 代表应用 | 所有模型的基础微调 | Llama-3-Instruct | DeepSeek-R1, DeepSeek-V3 |
总结建议
-
如果你想让模型学会一种新的格式或领域知识 ,首选 SFT。
-
如果你想让模型更符合人类的审美或价值观 (比如说话更有礼貌),DPO 是最高效的选择。
-
如果你在培养模型的硬核逻辑、数学或代码能力 ,且有清晰的规则来判断答案对错,GRPO 是目前最先进、成本效益最高的方向。
5.讲一下dpo的数据集你是怎么构建的
构建 DPO (Direct Preference Optimization) 数据集的核心在于构造三元组数据:
(x, y_w, y_l)
。其中 x 是输入 Prompt,y_w(winning)是更符合偏好的回答,y_l(losing)是较差的回答。
在实际工业界和研究中,构建这个数据集通常遵循以下流程:
1. 确定 Prompt 来源 (The "x")
数据的质量上限由 Prompt 的多样性和分布决定。
-
SFT 数据复用: 直接从现有的 SFT 训练集中抽取指令。
-
用户日志采样: 如果有线上模型,采样用户真实的对话记录(需脱敏)。
-
合成指令: 使用更强的模型(如 GPT-4o 或 DeepSeek-V3)针对特定领域(如你的工业互联网或 3D 视觉场景)生成复杂的推理或指令任务。
2. 生成响应候选集 (Response Generation)
针对同一个 Prompt x,需要获得至少两个不同的回答。常见的做法是:
-
多模型对练: 使用不同的模型(如 SFT 后的模型、底座模型、或者竞争对手的模型)生成回答。
-
同模型多采样: 使用当前的 SFT 模型,调整
temperature或top_p参数,采样生成 4-8 个不同的结果。 -
不同迭代轮次: 使用模型训练过程中的中间 Checkpoint(例如 Epoch 1 vs Epoch 10)生成结果,通常后期生成的质量更高。
3. 偏好标注 (Preference Labeling) ------ 最关键的一步
这是区分 y_w 和 y_l 的过程,主要有三种方式:
A. Human-in-the-loop (人工标注)
标注员根据有用性 (Helpfulness) 、真实性 (Truthfulness) 和 无害性 (Harmlessness) 对回答进行排序。这是质量最高的,但成本极高。
B. LLM-as-a-Judge (以模型为法官)
利用性能更强的模型(如 GPT-4o)作为裁判。
-
Prompt 模板: 给出指令和两个回答,让强模型根据特定维度(逻辑、格式、幻觉等)打分或直接判断 A \> B。
-
注意点: 需注意位置偏见(LLM 倾向于选第一个回答),通常需要调换 A/B 顺序测两次。
C. Reward Model Scoring (奖励模型打分)
如果你已经有一个训练好的 Reward Model (RM),可以用它给所有采样结果打分,分值最高的作为 y_w,分值最低的作为 y_l。
4. 负样本 (y_l) 的构造策略
DPO 的效果很大程度上取决于 y_l 坏在哪里。好的负样本应该具有"迷惑性":
-
逻辑错误: 过程看起来很专业,但最后一步推导错了。
-
事实幻觉: 编造了不存在的 API 或事实。
-
格式错误: 未能按照 Prompt 要求的 LaTeX 格式或 JSON 格式输出。
-
长度偏见: 有时需要刻意构造"简短但正确"作为 y_w,"冗长但车轮话"作为 y_l,以纠正模型过度啰嗦的问题。
5. 数据过滤与平衡
-
得分差值过滤: 如果使用 RM 打分,只有当 Score(y_w) - Score(y_l) \> \\text{threshold} 时才保留该数据。差值太小说明偏好不明显,容易引入噪声。
-
去重: 移除语义高度重复的 Prompt,确保数据分布在数学、代码、创意写作、角色扮演等领域的均衡。
典型 DPO 数据集格式示例 (JSONL)
JSON
{
"prompt": "如何评价控制工程中的状态空间方程?",
"chosen": "状态空间方程通过内部状态变量描述系统动力学,能够处理多输入多输出(MIMO)系统,是现代控制理论的基础...",
"rejected": "它是控制工程里的一种东西,就是写几个公式,用来算系统的输出,比较简单。"
}
在你的研究场景中,比如处理工业流程调度或 3D 模型生成任务时,构建 DPO 数据集往往是为了修正 SFT 模型容易产生的逻辑幻觉(如调度冲突)。
你目前是打算针对通用的对话能力进行 DPO 训练,还是针对某个特定垂直领域(如特定代码生成或数学推理)进行优化?
6.我看你项目上运用了一些前后端的技术,你是会这个技术栈吗(不会,都是vibe coding的)
7.说到vide coding,你有用过哪些coding agent?
"Vibe Coding" 是 2024 年底到 2025 年初在硅谷和开发者社区(特别是 Twitter/X 上)爆火的一个新词。
简单来说,Vibe Coding 是一种"只靠感觉(Vibe)和自然语言描述,而不亲手写代码"的软件开发模式。
它标志着编程从"手动编写每一行逻辑"转向了"调教 AI 代理(Agent)去实现意图"。以下是它的深度拆解:
1. 核心定义:什么是 Vibe Coding?
在传统的编程中,你需要精通语法、内存管理和算法。而在 Vibe Coding 中,你的核心工作是:
-
传递"感觉" (The Vibe): 告诉 AI "我想要一个像某某软件那样的侧边栏"、"给我做一个深色模式且带点赛博朋克感的看板"。
-
高频迭代: 如果 AI 生成的东西不对,你不需要去改代码,而是说"不对,再简约一点"或者"这里加个酷炫的动画"。
-
策展人角色: 开发者不再是搬砖的工人,而是一个审美在线、逻辑清晰的导演。
背景故事: 这个词的流行很大程度上归功于 Andrej Karpathy(前 Tesla AI 主管)等大佬对 Cursor 、Windsurf 、Replit Agent 等工具的极力推崇。当人们发现仅仅通过"聊天"就能在一个下午做出以前需要一周才能完成的应用时,这种"靠感觉编程"的时代就到来了。
2. Vibe Coding 的技术支柱
这种模式之所以能成,是因为现在的 Coding Agent 具备了以下能力:
-
全库感知 (Repository-level Context): Agent 不再只看一行代码,而是理解你整个项目的架构。
-
自我修正 (Self-Correction): 它能自己运行代码,发现报错,然后默默修好,再把结果呈现在你面前。
-
多模态反馈: 你给它一张手画的原型图,它直接吐出前端页面。
3. Vibe Coding vs. 传统编程 (Hard Coding)
| 维度 | 传统编程 (Traditional) | Vibe Coding |
|---|---|---|
| 核心技能 | 语法、算法、调试技巧 | 提示词工程、系统设计、审美、逻辑闭环 |
| 关注点 | How (如何通过逻辑实现) | What (想要实现什么功能/体验) |
| 反馈循环 | 编写 -> 编译 -> 报错 -> 修改 (分钟级) | 描述 -> 生成 -> 预览 -> 调整 (秒级) |
| 门槛 | 极高,需要数月乃至数年的学习 | 较低,只要有清晰的逻辑和基础技术认知 |
| 产出效率 | 线性增长 | 指数级爆发 |
4. 它是"编程的终结"还是"进化的起点"?
对于 Vibe Coding,目前社区有两种声音:
-
乐观派: 认为它释放了人类的创造力。以后人人都是产品经理+架构师,复杂的模板代码(Boilerplate)将彻底消失。
-
理性派: 警告这会导致"技术债"的堆积。如果你不理解 AI 写了什么,当程序出现深层逻辑漏洞或性能瓶颈时,只靠"Vibe"是修不好的。
5. 什么时候该"Vibe"一下?
-
快速原型开发 (MVP): 验证一个想法,几个小时内搞定一个 Demo。
-
前端与交互设计: 这种极其看重"观感"的领域,Vibe Coding 效率极高。
-
脚本与自动化: 比如"帮我写个脚本处理一下这 5000 个 3D 模型的命名规则"。
你是觉得这种"靠感觉"的开发方式会让你工作更轻松,还是担心它生成的代码会变成难以维护的"黑盒"?
抱歉,刚才可能把你的"Vibe Coding"误听成了"Video Coding"。在 2026 年,如果你想真正体验 Vibe Coding (即通过描述意图、感受和逻辑,让 AI 自动完成工程实现),以下是目前开发者圈子里公认最顶尖、最常用的几款 Coding Agent:
1. IDE 阵营:全能型"主力机"
这类工具直接集成在编辑器中,适合作为日常开发的核心环境。
-
Cursor (The Market Leader):
-
地位: 目前最火的 AI 原生 IDE(VS Code 的深度定制版)。
-
核心技能: Composer 模式。你可以同时开启多个 Agent 窗口,让它们并行处理不同文件的修改。它对整个项目的代码库(Codebase)有着极强的索引能力,甚至能理解你未曾打开过的底层逻辑。
-
-
Windsurf (by Codeium/Cognition):
-
地位: 2025-2026 年异军突起,强调"Flow(流感)"。
-
核心技能: Cascade(级联)。它能够像水流一样在文件之间穿梭,自动分析报错、跳转定义并执行修复。相比 Cursor,它的交互更加自动化,非常适合处理那种涉及十几个文件的重构任务。
-
-
GitHub Copilot Workspace:
-
地位: 微软系的"大杀器"。
-
核心技能: Issue-to-PR。它不只是写代码,而是从 GitHub 的一个 Issue 开始,自动生成一份详细的实施方案,你确认后它直接写完代码并提交 Pull Request。
-
2. CLI/终端阵营:硬核"黑客感"
这类工具运行在终端,适合那些不喜欢离开命令行、需要极高自由度的开发者。
-
Claude Code (Anthropic):
-
地位: 2026 年的标杆级工具。
-
核心技能: 深度推理与自主执行。它搭载了 Claude 4.7/5 系列模型,拥有 100 万+ token 的超长上下文。它最擅长处理"硬骨头"------比如寻找隐藏极深的逻辑 Bug,或者在完全陌生的仓库里进行架构级的调整。
-
-
Aider:
-
地位: 开源界的"长青树"。
-
核心技能: Git 精准控制。它与 Git 结合得非常完美,每一步修改都会自动生成极具可读性的 Commit Message。如果你想一边写代码一边保持完美的版本记录,Aider 是首选。
-
3. 自主型/工程型:AI"程序员"
这类 Agent 拥有完整的沙盒环境,可以自主运行浏览器、终端和测试。
-
Devin (Cognition Labs):
-
地位: 世界上第一个宣称的"AI 软件工程师"。
-
核心技能: 全流程闭环。你给它一个 GitHub 链接,它能自己克隆代码、安装环境、运行测试、修 Bug、最后部署。它更像是一个你可以"甩手"的下属。
-
-
OpenHands (原 OpenDevin):
-
地位: 最强大的开源替代品。
-
核心技能: 高度可配置。你可以给它挂载任何你喜欢的开源模型,且社区贡献了大量的"微型任务插件",扩展性极强。
-
4. 这里的"Skills"指什么?
正如你之前问到的,这些 Agent 之所以强大,是因为它们具备了以下核心技能(Skills):
-
Read/Write File: 读写文件。
-
LSP / Symbol Search: 理解类、函数、变量之间的调用拓扑关系。
-
Shell Execution: 运行
pip install、make、pytest等命令,并根据输出结果自我排错。 -
Web Search / Documentation Browsing: 当发现库的版本更新时,自动去官网查文档。
-
Plan & Act: 先写方案(Plan),再逐步执行(Step-by-step),每一步都会对比预期与实际结果。
总结建议
-
如果你追求极致的交互体验 和"Vibe"感,选 Cursor 或 Windsurf。
-
如果你需要解决高难度的逻辑推演 (比如复杂的数学模型或工业仿真算法),用 Claude Code。
-
如果你想快速搭建原型(MVP)且不想碰本地环境,试试 Replit Agent 或 Bolt.new。
你目前是想用这些工具来辅助你的科研论文实验 ,还是在做那个工业全生命周期管理系统的开发?
8.有知道agent的skills吗?
在 AI Agent 的架构中,Skills(技能) 是连接大模型"大脑"与现实世界的"手脚"。如果把 LLM 比作一个博学但被关在黑屋子里的智者,那么 Skills 就是他用来获取信息、操作工具和改变环境的各类接口。
在目前主流的框架(如 Dify、LangChain、AutoGPT)中,Agent 的技能通常可以分为以下四大核心范畴:
1. 外部工具调用能力 (Tool-call / Function Calling)
这是 Agent 最基础也是最强大的技能,通过标准接口(API)扩展模型边界。
-
搜索技能: 如 Google Search, Tavily, DuckDuckGo。让 Agent 具备获取实时信息(如最新论文、当日金价)的能力。
-
代码执行技能 (Code Interpreter): 允许 Agent 编写并运行 Python 或 JS 代码。这对你处理复杂的工业数据分析 、绘制 3D 轨迹曲线 或数值求解优化问题至关重要。
-
API 联动: 调用第三方服务,如 GitHub API(自动提交代码)、Jira(管理工业项目进度)、或者自定义的 MES/APS 系统接口。
2. 环境感知与多模态技能 (Perception Skills)
由于你关注 3D 视觉和工业场景,这类技能是 Agent 走向"具身智能"的关键。
-
视觉分析 (VLM Skill): 利用 Qwen-VL 或 LLaVA 等模型分析图像/视频,识别生产线上的零件缺陷,或理解 3D 场景的布局。
-
文档解析: 深入解析 PDF、Excel、CAD 算料表等非结构化数据,并将其转化为 Agent 可处理的结构化知识。
-
跨模态检索: 在海量视频或 3D 资产库(如 Objaverse)中通过自然语言定位特定目标。
3. 规划与自我演进技能 (Cognitive Skills)
这决定了 Agent 能否处理"长程任务"(Long-horizon tasks)。
-
任务拆解 (Decomposition): 将复杂的"设计一个冰箱生产线调度方案"拆解为需求分析、建模、仿真、优化等子任务。
-
反思与自我修正 (Self-Reflection): 如 ReAct 模式。Agent 在执行每一步后,会观察结果(Observation),如果发现错误(如代码报错或调度逻辑冲突),会自我修正策略。
-
强化学习进化 (RL-based Skill): 这正是你提到的 GRPO 或 PPO 发挥作用的地方。Agent 通过在模拟器(如 NVIDIA Isaac Gym)中的不断尝试,获得奖励反馈,从而进化出更优的控制策略。
4. 记忆管理技能 (Memory Skills)
-
短期记忆: 利用 Context Window 维护当前对话的上下文。
-
长期记忆 (RAG): 通过向量数据库(Vector DB)存储历史案例。例如,Agent 可以记住半年前处理过的某次设备故障的解决方案,并在类似情况再次发生时调用。
工业与科研场景下的"硬核"技能
针对你正在研究的工业互联网 和 3D 视觉 领域,Agent 往往需要一些定制化的 Domain-specific Skills:
| 技能名称 | 具体实现逻辑 | 应用场景 |
|---|---|---|
| 物理仿真接入 | 接入 PyBullet 或 MuJoCo 接口 | 验证机器人抓取算法的合规性 |
| 工业协议通讯 | 集成 Modbus, OPC-UA 协议栈 | 直接与工厂 PLC 通讯,读取实时传感器数据 |
| 3D 几何处理 | 集成 Open3D 或 Trimesh 库 | 自动化处理点云、计算 3D 模型的表面积或体积 |
| 优化算法调用 | 调用 Gurobi 或 CPLEX 求解器 | 处理 APS(高级计划与排程)中的混合整数规划问题 |
如何构建这些 Skills?
如果你在 Dify 或类似平台中配置,通常有三种路径:
-
内置工具: 直接勾选搜索、Wikipedia 等插件。
-
自定义 Tool (OpenAPI/Swagger): 编写一个 FastAPI 后端,把你的 C++ 编解码工具或 3D 处理算法封装成 API 供 Agent 调用。
-
Python 脚本插件: 直接在 Workflow 中嵌入 Python 代码块,处理特定的数学逻辑或数据清洗。
在你目前做的"冰箱制造全生命周期管理"项目中,你最希望 Agent 具备哪一类"杀手锏"技能?是自动处理复杂的排程逻辑,还是对生产线视频进行实时的异常诊断?
9.手撕leetcode 岛屿数量
反问:
1.您所在的组目前在做什么业务
2.实习base地是随机分配吗还是可以选择
3.华为实习生的权限问题
4.实习生的工作分为哪些类型?
(答:研究/交付,看个人意愿)
二面面经: 面试总体偏向于聊天
1.介绍一下你最自信的技术栈
2.介绍一下你的项目
3.实习base想选哪里,为什么
4.你的导师是谁
5.听一面面试官说你实习更倾向于业务交付,为什么?
反问: 1.您是南京这边智能座舱的主管吗
2.华为实习生的权限问题
3.后续还有什么流程吗