百度大模型算法岗一二面面经
- 轮次
- 一面二面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
一面
- 多模态大模型的整体核心架构由哪些模块组成?
- 主流的视觉语言 Adapter 有哪些类型,各自的核心功能是什么?Q-Former 的原理与应用场景是怎样的?
- ViT 的图像预处理与特征提取完整机制是怎样的?
- 自注意力 Self-Attention 的底层原理是什么?注意力分数为什么要除以根号 d,多头注意力相比单头注意力的核心优势在哪?
- ViT 与传统 CNN 在视觉任务上的性能优势与适配场景有什么差异?
- 手撕算法:LeetCode 221 最大正方形。
二面
- MHA、MQA、GQA 三种注意力机制有什么区别?在推理速度和显存占用上各自的优劣是什么?
- MHA、MQA、GQA 三种架构下,KV Cache 的显存占用比例与资源消耗特点分别是什么?
- Nano、Image 2.0、Seedream 这些主流图像生成模型的底层技术架构与迭代路线是怎样的?
- PagedAttention 的技术原理是什么,它能不能降低显存占用,背后的核心机制是什么?
- Dataset、DataLoader、Sampler 三者的定义、功能与使用场景有什么区别?
- 基于 Qwen3 搭建代码补全 Agent,如果由你负责 tokenizer 模块,会遇到哪些核心问题,对应的优化方案是什么?
- 主流代码智能 Agent 的工作模式有哪些,核心差异与适用场景是什么?
- 团队内部算法模块已经封装成 pip 包,怎么设计方案让代码 Agent 精准识别并调用内部私有函数?
《参考解析》
-
多模态大模型的组成与视觉语言 Adapter:典型结构是视觉编码器、模态对齐模块、语言模型三段。训练上通常冻结视觉塔和大模型,只训对齐层,先用图文对做对齐、再用指令数据微调,这样算力成本最低。Adapter 常见三类:Q-Former 用一组可学习 query 通过交叉注意力把图像压成固定数量的视觉 token,压缩率高但有信息损失;MLP/Linear Projector 结构最简单、保留 token 多、把对齐压力交给大模型容量;Perceiver Resampler 介于两者之间,用少量隐变量重采样。Q-Former 的关键是两阶段预训练——先做图文对比、图文匹配、基于图像的文本生成三个目标,再接到大模型上做生成式微调,因此它在细粒度 OCR 和密集问答上需要补更高分辨率输入。
-
ViT 的预处理、位置编码与注意力缩放:ViT 把图像切成固定大小的 patch,展平后过一层线性映射得到 patch embedding,再叠加分类 token 与位置编码——位置编码不能省,否则注意力对 patch 顺序无感。它缺少 CNN 的局部归纳偏置,需要大数据或强增强才训得动,换来的是全局建模能力,在高分辨率和多模态预训练里更适配;CNN 在小数据、边缘部署和局部纹理任务上依然更划算。注意力分数除以根号 d 是为了防止点积方差随维度增大、把 softmax 推入饱和区导致梯度消失;多头则是把表示空间切成多个子空间并行做注意力,让不同头关注不同的位置关系与语义,再拼接投影——它增加的是表达多样性,参数量与单头大维度基本相当。
-
MHA/MQA/GQA 与 KV Cache 的显存账:KV Cache 缓存每层历史 token 的 key/value,占用约为 2 × 层数 × KV 头数 × head_dim × 序列长度 × batch × 精度字节数,随 batch 和上下文线性增长,是长上下文推理的主要成本。MHA 每个 query 头各存一份 KV;MQA 让所有 query 头共享一份 KV,KV 显存降到 1/头数,解码访存少、吞吐高,但表达力有损;GQA 折中,把 query 头分组、每组共享一份 KV,组数即 KV 头数,通常取 8 组左右,在质量与速度之间平衡,也是现在多数开源模型的默认选择。面试官追问的方向一般是「给定层数、头数和上下文长度,让你当场估一个 70B 模型的 KV 占用」,所以公式里每一项都要说得清。
-
PagedAttention 到底省了什么:它借鉴操作系统的虚拟内存分页,把 KV Cache 切成固定大小的 block,用 block table 把逻辑连续的序列映射到物理不连续的显存块,于是不必按最大长度预留连续显存,碎片和内部浪费大幅下降,KV 显存利用率能从几成提到九成以上,同样的卡就能塞下更大的 batch、提高吞吐。要注意它减少的是预留与碎片造成的浪费,不改变「按 token 计算的理论 KV 大小」;配合前缀共享,相同的系统提示词可以复用同一批 block,还能再省一块。
-
代码补全 Agent 的 tokenizer 与私有函数调用:tokenizer 侧的核心矛盾在标识符切分——下划线、驼峰、长变量名被切碎后语义难学,内部私有包名又基本是未登录词。可做的优化是扩充词表把内部常用符号与 API 名加进去、在字符级兜底与 BPE 之间找平衡、保证输入输出 offset 对齐以便做填充中间(FIM)训练,以及控制截断策略别把关键 import 切掉。让 Agent 调到私有函数,靠的不是把源码全塞进上下文,而是三件事配合:把包做成可检索的接口文档(签名、类型、docstring、示例)建索引做 RAG;用 AST 与类型信息做静态分析生成结构化签名;把「生成调用」和「校验执行」分成两步——先生成候选调用,再用解释器或类型检查器验证参数,失败就把错误回灌重试。私有包不进公开语料,检索质量基本决定成败。