大模型面试指南
·
好的兄弟,咱们直接上硬核的,把每个知识点都给你“解剖”了。这部分内容是用来让你在面试中,当面试官往下深挖时,你能稳稳接住,甚至能展现出超越一般求职者的深度。
第一部分:模型原理与架构 (探到底层)
Transformer 架构的“魔鬼细节”
-
追问 1:除了标准的 Self-Attention,你还了解哪些变体?它们为了解决什么问题?
- 你需要准备的(展现你的知识广度):
- FlashAttention: 这是目前性能优化的核心。你要说出它的关键点:它是一种 I/O 感知的注意力算法,通过融合(fusing)注意力计算的多个步骤,极大地减少了 GPU 显存(HBM)和 SRAM 之间的读写次数。 传统的注意力计算需要反复读写中间结果(比如注意力分数矩阵),这是性能瓶颈。FlashAttention 利用 CUDA 编程技巧,在 GPU 内部完成尽可能多的计算再写回显存,从而显著提升了训练和推理的速度,并节省了显存。
- Sliding Window Attention (SWA): 用在 Mistral 等模型中。你要解释:它是一种近似全注意力的方法,让每个 Token 只关注其左侧的一个固定大小的窗口(Window Size)内的 Token。这使得计算复杂度从输入的平方(O(n2)O(n^2)O(n2))降低到了线性(O(n⋅k)O(n \cdot k)O(n⋅k),k 为窗口大小),从而可以用更少的计算资源处理更长的文本序列。
- Sparse Attention: 这是一个更广泛的概念,旨在解决注意力机制的二次方复杂度问题。你可以说,它的核心思想是让每个 Token 只与少数“重要”的 Token 计算注意力,而不是与所有 Token 计算。实现方式有很多,比如 BigBird 模型结合了全局注意力、随机注意力和窗口注意力。
- 你需要准备的(展现你的知识广度):
-
追问 2:为什么现在的 Llama、Qwen 等模型都用 RMSNorm 和 SwiGLU?它们比原始 Transformer 的 LayerNorm 和 ReLU 好在哪?
- 你需要准备的(展现你对模型演进的理解):
- LayerNorm vs. RMSNorm (Root Mean Square Normalization):
- LayerNorm 会对输入进行标准化,然后进行缩放和平移(有
gain和bias两个可学习参数)。 - RMSNorm 是 LayerNorm 的简化版,它只进行缩放,去掉了平移(
bias)。实验证明,这种简化在保持性能的同时,计算效率更高(大约提升 5%-15% 的速度),并且有助于模型的训练稳定性。
- LayerNorm 会对输入进行标准化,然后进行缩放和平移(有
- ReLU vs. SwiGLU (Gated Linear Unit):
- ReLU 是一个非常简单的激活函数。
- SwiGLU 是一种更复杂的、带“门控”的激活函数。它的形式是
SwiGLU(x) = (xW + b) ⊗ sigmoid(xV + c)。你可以把它理解为,它增加了一个门控机制来控制信息流,让模型可以根据输入动态地决定哪些信息可以通过前馈网络层。Llama 等论文表明,使用 SwiGLU 替代 ReLU 可以显著提升模型的性能和表达能力。
- LayerNorm vs. RMSNorm (Root Mean Square Normalization):
- 你需要准备的(展现你对模型演进的理解):
-
追问 3:聊聊 Tokenizer,BPE 和 SentencePiece 有什么区别?
- 你需要准备的(工程实践的基础):
- Tokenizer 的重要性: 它是模型“看”世界的方式,决定了模型输入的最小单位。一个好的 Tokenizer 能在压缩序列长度和保留语义之间取得平衡。
- BPE (Byte-Pair Encoding):
- 工作原理: 一种自底向上的方法。它先将文本拆成最小单位(字符),然后迭代地找出频率最高的相邻“对”,并将它们合并成一个新的、更大的 Token。
- 优点: 能有效处理未登录词(OOV),因为最坏情况可以退化到字符级别。
- SentencePiece:
- 它和 BPE 的关键区别: SentencePiece 把所有文本(包括空格)都看作是普通符号,它直接对原始文本进行编码,不需要预先按空格分词。这使得它在处理像中文、日文这样不使用空格分词的语言时更加鲁棒和统一。
- 优点: 语言无关,并且提供了一种可逆的 Tokenization,即
detokenize(tokenize(text))几乎能完美还原原始文本(包括空格)。目前主流的开源模型(如 Llama)大多采用 SentencePiece。
- 你需要准备的(工程实践的基础):
第二部分:训练与微调 (深入实践)
QLoRA 微调的“手艺活”
-
追问 1:在写 QLoRA 微调代码时,你怎么确认你的设置是正确的?比如哪些层被冻结了,哪些是可训练的?
- 你需要准备的(展现你的动手能力和细心):
- 检查可训练参数: 在 Hugging Face 的
peft库中,加载完 LoRA 配置后,可以调用model.print_trainable_parameters()这个函数。它会清晰地打印出总参数量、可训练参数量以及两者的比例。一个正常的 QLoRA 微调,可训练参数的比例通常远小于 1%。如果这个比例不对,就要检查 LoRA 配置是否正确应用。 - 检查参数类型: 可以遍历
model.named_parameters(),打印出每个参数的name和requires_grad属性。你会看到只有包含lora_A和lora_B的参数的requires_grad是True,而基座模型的参数(如base_model.model...)都是False。
- 检查可训练参数: 在 Hugging Face 的
- 你需要准备的(展现你的动手能力和细心):
-
追问 2:微调时遇到“灾难性遗忘”怎么办?如何评估你的微调模型是否比原模型更好?
- 你需要准备的(展现你解决问题的能力):
- 灾难性遗忘 (Catastrophic Forgetting): 指模型在学习新知识后,忘记了预训练时学到的通用能力。
- 缓解方法: LoRA 本身就在一定程度上缓解了这个问题,因为它只修改了很小一部分参数。如果问题依然严重,可以尝试:1)降低学习率;2)减少训练轮数 (Epochs);3)在微调数据中混合一小部分通用的、高质量的指令数据,让模型在学习新知识的同时“复习”旧知识。
- 评估方法:
- 建立评估集: 准备一个专门的、没有在训练中出现过的测试集。
- 定性评估: 人工观察模型在一些典型 case 上的表现,看回答是否符合预期。
- 定量评估(选择合适的指标):
- 分类任务: 计算准确率 (Accuracy)、F1 值。
- 生成任务: 计算 ROUGE (用于摘要,看重召回率)、BLEU (用于翻译,看重精确率)。
- 通用评估(更高级): 使用一些开源的评测框架,比如 OpenCompass 或 HELM,在多个公开 benchmark 上对你的模型和基座模型进行全面的能力对比。你能在面试中提到这些框架,会非常加分。
- 灾难性遗忘 (Catastrophic Forgetting): 指模型在学习新知识后,忘记了预训练时学到的通用能力。
- 你需要准备的(展现你解决问题的能力):
第三部分:RAG 应用与部署 (走向生产)
RAG 系统的“优化与取舍”
-
追问 1:如果检索出的文档块虽然相关,但信息密度很低或有干扰,LLM 仍然会生成不好的答案。这个问题怎么解决?
- 你需要准备的(展现你对 RAG 局限性的思考):
- 精细化分块 (Finer-grained Chunking): 尝试语义分块 (Semantic Chunking),即根据文本向量的相似度来决定切分点,确保每个块内部的语义是高度一致的。或者基于文档结构分块(例如,按 Markdown 的标题层级来切分),保证块的完整性。
- 文档压缩 (Document Compression): 在将检索到的文档送入 LLM 之前,先用一个小的 LLM 对文档进行摘要或关键信息提取。比如,先问一个小模型:“请从以下文本中,抽取出与‘XX 问题’最相关的信息”,然后将这个“浓缩”后的信息喂给主模型。LangChain 中有
ContextualCompressionRetriever可以实现这个功能。 - 重排序 (Re-ranking): 这是最常用且有效的方法。在召回阶段(比如用向量搜索)可以多召回一些文档(如 Top 20),然后用一个更强大的交叉编码器 (Cross-encoder) 模型对这 20 个文档和用户问题进行二次打分排序,选出真正最相关的 Top 3-5。
- 你需要准备的(展现你对 RAG 局限性的思考):
-
追问 2:你了解 “Lost in the Middle” 问题吗?它对 RAG 有什么影响?
- 你需要准备的:
- 解释问题: 这是指 LLM 在处理长上下文时,倾向于更好地记住开头和结尾的信息,而容易忽略中间部分的信息。
- 对 RAG 的影响: 如果我们把检索到的多个文档块简单地拼接起来,最重要的那个文档块如果恰好被放在了中间,它的信息就可能被模型忽略,导致生成错误的答案。
- 缓解策略: 在将检索到的文档块送入 Prompt 前,进行一次重排序。将最相关的文档(可以通过 Re-ranker 确定)放到 Prompt 的最开始或者最后面,确保模型能“看得到”。
- 你需要准备的:
部署与推理优化
- 追问 3:模型微调好了,如何部署成一个高性能的 API 服务?
- 你需要准备的(展现你的工程落地能力):
- 核心挑战: 大模型的推理,尤其是生成式推理,是内存密集型和计算密集型的。关键在于如何提高吞吐量(每秒处理的请求数)和降低延迟。
- 关键技术:
- KV 缓存 (KV Cache): 在生成下一个 Token 时,Transformer 不需要从头计算前面所有 Token 的 Key 和 Value,可以把它们缓存起来复用。这是生成式推理加速的最核心机制。
- 推理引擎/框架: 不要直接用
transformers库的pipeline或generate函数来做生产服务。要使用专门的推理服务框架,比如 vLLM、Text Generation Inference (TGI) 或 NVIDIA Triton。 - 为什么用它们? 你要说出 vLLM 的核心优势:PagedAttention。它像操作系统管理虚拟内存一样,高效地管理 KV 缓存,解决了显存碎片化问题,使得吞吐量可以提升数倍甚至数十倍。
- 量化 (Quantization): 除了训练时的 QLoRA,推理部署时也可以做量化。比如使用 AWQ, GPTQ 等技术将模型权重从 FP16 量化到 INT8 或 INT4,可以大幅降低显存占用,提升推理速度,但可能会有轻微的精度损失。
- 批处理 (Batching): 将多个请求合并成一个批次(batch)进行处理,以充分利用 GPU 的并行计算能力。连续批处理 (Continuous Batching) 是 vLLM 等框架的另一个核心功能,它能动态地处理请求队列,避免了传统批处理中的等待和浪费。
- 你需要准备的(展现你的工程落地能力):
兄弟,把这些内容都消化了,你就可以自信地和任何面试官深入交流了。记住,面试不是考试,展现出你的思考过程、解决问题的思路以及对技术细节的追求,比给出一个“标准答案”更重要。
祝你面试顺利,拿到心仪的 Offer!
更多推荐


所有评论(0)