面灵AI→

百度大模型算法岗一二面面经

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

《面试题目》

一面

  1. 多模态大模型的整体核心架构由哪些模块组成?
  2. 主流的视觉语言 Adapter 有哪些类型,各自的核心功能是什么?Q-Former 的原理与应用场景是怎样的?
  3. ViT 的图像预处理与特征提取完整机制是怎样的?
  4. 自注意力 Self-Attention 的底层原理是什么?注意力分数为什么要除以根号 d,多头注意力相比单头注意力的核心优势在哪?
  5. ViT 与传统 CNN 在视觉任务上的性能优势与适配场景有什么差异?
  6. 手撕算法:LeetCode 221 最大正方形。

二面

  1. MHA、MQA、GQA 三种注意力机制有什么区别?在推理速度和显存占用上各自的优劣是什么?
  2. MHA、MQA、GQA 三种架构下,KV Cache 的显存占用比例与资源消耗特点分别是什么?
  3. Nano、Image 2.0、Seedream 这些主流图像生成模型的底层技术架构与迭代路线是怎样的?
  4. PagedAttention 的技术原理是什么,它能不能降低显存占用,背后的核心机制是什么?
  5. Dataset、DataLoader、Sampler 三者的定义、功能与使用场景有什么区别?
  6. 基于 Qwen3 搭建代码补全 Agent,如果由你负责 tokenizer 模块,会遇到哪些核心问题,对应的优化方案是什么?
  7. 主流代码智能 Agent 的工作模式有哪些,核心差异与适用场景是什么?
  8. 团队内部算法模块已经封装成 pip 包,怎么设计方案让代码 Agent 精准识别并调用内部私有函数?

《参考解析》

  1. 多模态大模型的组成与视觉语言 Adapter:典型结构是视觉编码器、模态对齐模块、语言模型三段。训练上通常冻结视觉塔和大模型,只训对齐层,先用图文对做对齐、再用指令数据微调,这样算力成本最低。Adapter 常见三类:Q-Former 用一组可学习 query 通过交叉注意力把图像压成固定数量的视觉 token,压缩率高但有信息损失;MLP/Linear Projector 结构最简单、保留 token 多、把对齐压力交给大模型容量;Perceiver Resampler 介于两者之间,用少量隐变量重采样。Q-Former 的关键是两阶段预训练——先做图文对比、图文匹配、基于图像的文本生成三个目标,再接到大模型上做生成式微调,因此它在细粒度 OCR 和密集问答上需要补更高分辨率输入。

  2. ViT 的预处理、位置编码与注意力缩放:ViT 把图像切成固定大小的 patch,展平后过一层线性映射得到 patch embedding,再叠加分类 token 与位置编码——位置编码不能省,否则注意力对 patch 顺序无感。它缺少 CNN 的局部归纳偏置,需要大数据或强增强才训得动,换来的是全局建模能力,在高分辨率和多模态预训练里更适配;CNN 在小数据、边缘部署和局部纹理任务上依然更划算。注意力分数除以根号 d 是为了防止点积方差随维度增大、把 softmax 推入饱和区导致梯度消失;多头则是把表示空间切成多个子空间并行做注意力,让不同头关注不同的位置关系与语义,再拼接投影——它增加的是表达多样性,参数量与单头大维度基本相当。

  3. 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 占用」,所以公式里每一项都要说得清。

  4. PagedAttention 到底省了什么:它借鉴操作系统的虚拟内存分页,把 KV Cache 切成固定大小的 block,用 block table 把逻辑连续的序列映射到物理不连续的显存块,于是不必按最大长度预留连续显存,碎片和内部浪费大幅下降,KV 显存利用率能从几成提到九成以上,同样的卡就能塞下更大的 batch、提高吞吐。要注意它减少的是预留与碎片造成的浪费,不改变「按 token 计算的理论 KV 大小」;配合前缀共享,相同的系统提示词可以复用同一批 block,还能再省一块。

  5. 代码补全 Agent 的 tokenizer 与私有函数调用:tokenizer 侧的核心矛盾在标识符切分——下划线、驼峰、长变量名被切碎后语义难学,内部私有包名又基本是未登录词。可做的优化是扩充词表把内部常用符号与 API 名加进去、在字符级兜底与 BPE 之间找平衡、保证输入输出 offset 对齐以便做填充中间(FIM)训练,以及控制截断策略别把关键 import 切掉。让 Agent 调到私有函数,靠的不是把源码全塞进上下文,而是三件事配合:把包做成可检索的接口文档(签名、类型、docstring、示例)建索引做 RAG;用 AST 与类型信息做静态分析生成结构化签名;把「生成调用」和「校验执行」分成两步——先生成候选调用,再用解释器或类型检查器验证参数,失败就把错误回灌重试。私有包不进公开语料,检索质量基本决定成败。