1. 为什么这8个问题成了LLM面试的硬门槛
面过LLM岗位的人大概都有体会:简历上写着“熟悉Transformer”“做过RAG”“调过Agent”,结果面试官几个问题下来,冷汗就冒出来了。不是问得偏,而是问得深——深到你必须真正理解过底层机制、踩过工程坑、做过取舍,才能答得上来。
我前后参与过几十场大模型相关岗位的技术面试,也帮朋友做过模拟面。一个很明显的规律是:面试官问来问去,核心就那么8个方向。这8个问题覆盖了从模型原理到工程落地的完整链路,任何一个答不上来,基本就暴露了知识体系里的硬伤。尤其是现在岗位竞争激烈,面试官没时间慢慢引导你,往往一个问题就能判断出你是“真做过”还是“只听过”。
这篇文章不打算给你一份标准答案让你背。我想做的是把这8个问题拆开,讲清楚面试官到底在考什么、你应该从哪个角度回答、哪些细节是加分项、哪些坑千万别踩。不管你是刚转行准备入局,还是已经做了几年想跳槽,这些内容都能直接拿来用。
先说一下这8个问题的整体框架,让你心里有个底:
| 序号 | 问题方向 | 核心考察点 | 常见追问 |
|---|---|---|---|
| 1 | Transformer架构理解 | 自注意力机制、位置编码、残差连接 | 为什么用多头?为什么除以根号d? |
| 2 | Tokenization与词表设计 | BPE原理、词表大小取舍、多语言处理 | 中文分词为什么容易出问题? |
| 3 | 预训练与微调策略 | 训练目标、数据配比、LoRA原理 | 全量微调vs参数高效微调怎么选? |
| 4 | 推理优化与部署 | KV Cache、量化、批处理 | 显存不够怎么办?延迟怎么降? |
| 5 | RAG系统设计 | 检索策略、重排序、上下文压缩 | 召回不准怎么排查? |
| 6 | Function Calling与Agent | 工具调用协议、规划能力、容错 | 模型不按格式输出怎么办? |
| 7 | 评估与对齐 | 评测指标、RLHF、DPO | 怎么判断模型变好了还是变差了? |
| 8 | 工程化与系统设计 | 分布式训练、数据管道、监控 | 训练loss突然飙升怎么排查? |
这8个方向不是孤立的,面试官往往会交叉着问。比如聊RAG的时候突然问你“检索回来的文档太长,KV Cache扛不住怎么办”,这就是在考推理优化。所以准备的时候不能只背单点,要把知识串起来。
接下来我逐个拆解,每个问题都会告诉你面试官的心理预期是什么、回答的层次怎么拉开、哪些细节能让面试官眼前一亮。
2. 逐个击破:8个必问问题的深度拆解
2.1 Transformer架构:别只会画图,要讲清楚“为什么”
这是LLM面试的必考题,没有之一。但很多人准备的方向就错了——背了一遍“Self-Attention就是QKV点积”,面试官一追问就露馅。
面试官真正想知道的,是你有没有从第一性原理理解这个架构的设计动机。我建议你按这个逻辑来组织回答:
第一层:自注意力到底解决了什么问题。在Transformer之前,RNN系模型处理长序列时有两个致命问题:一是串行计算导致训练慢,二是长距离依赖容易梯度消失。自注意力的核心创新是让序列中任意两个位置直接建立连接,计算复杂度虽然是O(n²),但换来了完全并行的训练和更好的长距离建模能力。这里你可以补一句:“其实O(n²)在早期不是大问题,因为当时序列长度普遍在512以内,真正成为瓶颈是后来长上下文需求爆发之后。”
第二层:QKV的本质。别只背公式,用类比讲。Query是“我在找什么信息”,Key是“我有什么信息可以被找到”,Value是“我实际提供的信息内容”。注意力权重就是Query和Key的匹配程度,然后对Value做加权求和。这个类比面试官一听就知道你理解了。
第三层:为什么是多头。单头注意力只能学到一种“关注模式”,多头让模型在不同子空间里并行学习不同的关系模式——有的头关注语法结构,有的头关注语义相似性,有的头关注位置邻近。你可以补一句实测经验:“我做过注意力头的可视化分析,确实能看到不同头分工不同,有些头甚至专门关注标点符号或句法边界。”
第四层:位置编码的演进。从正弦位置编码到可学习位置编码,再到RoPE旋转位置编码。面试官如果问到这里,说明他在试探你对长上下文扩展的理解。RoPE的核心优势是通过旋转矩阵编码相对位置信息,天然支持外推,这也是为什么现在主流模型都用它。你可以提一下:“RoPE的外推能力也不是无限的,实际用的时候还是需要配合NTK-aware插值或者YaRN这类方法做上下文扩展。”
第五层:残差连接和LayerNorm。残差连接解决深层网络的梯度传播问题,LayerNorm解决训练稳定性问题。Pre-Norm和Post-Norm的区别也值得说:Pre-Norm训练更稳定,适合深层模型,但表达力可能略弱;Post-Norm表达力强但需要更精细的学习率预热。现在主流大模型基本都用Pre-Norm或者RMSNorm。
注意:面试官如果问你“Transformer有什么缺点”,千万别只说“计算复杂度高”。更好的回答是:O(n²)的注意力计算、固定位置编码的外推限制、缺乏真正的递归推理能力、对训练数据质量和规模的高度依赖。这样回答显得你有全局视野。
2.2 Tokenization:最容易被忽视的“隐形杀手”
Tokenization看起来是个预处理步骤,但它对模型性能的影响远超大多数人想象。面试官问这个问题,往往是想看你有没有实际处理过数据、踩过坑。
BPE的核心原理。Byte Pair Encoding的本质是迭代合并高频字节对。从字符级别开始,每次找出现频率最高的相邻对,合并成新的token,重复直到达到目标词表大小。你可以用一句话总结:“BPE是在字符级和词级之间找平衡,让常见词保持完整,罕见词拆成子词。”
词表大小的取舍。词表太小,序列变长,推理成本增加;词表太大,embedding矩阵参数量膨胀,低频token训练不充分。主流模型一般在32K到128K之间。你可以补充:“我实际做过对比实验,中文场景下词表从32K扩到64K,平均序列长度缩短了约15%,但embedding层参数量增加了不少,需要根据实际场景权衡。”
中文Tokenization的特殊问题。很多模型的中文词表覆盖不够,导致一个常用汉字被拆成多个byte token,序列长度暴涨。比如“你好”在某些tokenizer里可能变成3-4个token。解决办法是在训练tokenizer时加入足够的中文语料,或者做词表扩展。你可以说:“我遇到过一个case,同样的中文文本,不同tokenizer的token数量差了将近一倍,直接影响了推理成本和效果。”
特殊token的设计。BOS、EOS、PAD、UNK这些基础的不说了,更重要的是对话模板相关的特殊token。比如ChatML格式里的<|im_start|>和<|im_end|>,Function Calling里的工具调用标记。这些token的设计直接影响模型的行为。面试官如果问“为什么模型有时候不按格式输出”,你可以从特殊token训练不充分的角度来分析。
| 常见问题 | 原因分析 | 解决思路 |
|---|---|---|
| 中文序列过长 | 词表中文覆盖不足 | 扩充中文语料训练tokenizer |
| 数字被拆散 | 数字未加入词表 | 添加数字相关合并规则 |
| 代码token效率低 | 缩进和符号处理差 | 代码语料专项训练 |
| 特殊token被忽略 | 训练时mask不当 | 检查loss mask设置 |
2.3 预训练与微调:从“能跑”到“跑得好”的关键
这个问题考察的是你对训练全流程的理解。面试官想知道的不是“你会不会调LoRA”,而是你能不能根据场景做出合理的技术选型。
预训练目标。主流是自回归语言建模,也就是预测下一个token。但细节上有区别:有的模型用因果掩码,有的用前缀语言建模。你可以提一下:“现在也有一些工作在探索多token预测,比如一次预测多个未来token,能提升训练效率。”
数据配比。这是预训练中最玄学也最关键的部分。代码、中文、英文、数学、多语言各占多少比例,直接决定模型的能力分布。你可以说:“我参与过一个继续预训练的项目,数据配比调了三轮才找到比较优的组合,代码比例太低会导致推理能力弱,中文比例太高又会影响英文表现。”
LoRA的原理和实操。LoRA的核心是在原始权重旁边加一个低秩分解矩阵,训练时只更新这个小矩阵。优势是显存占用低、可以多任务切换。但面试官可能会追问:“LoRA的秩怎么选?”我的经验是:简单任务rank=8到16够用,复杂任务可能需要64甚至128。另外,LoRA加在哪些层也很关键,一般Q、V层是标配,K、O层加上也有帮助,MLP层加不加要看任务。
全量微调vs参数高效微调。数据量足够大、任务和预训练分布差异大,全量微调效果更好;数据量小、需要快速迭代,LoRA更合适。你可以补充:“实际项目中我倾向于先用LoRA快速验证,效果达标就不做全量了,性价比高很多。”
实操心得:LoRA训练时学习率一般设得比全量微调大一个数量级,比如1e-4到3e-4。另外,LoRA的dropout不要设太大,0.05到0.1就够了,太大反而影响收敛。
2.4 推理优化:显存和延迟的“极限拉扯”
这是工程岗面试的重头戏。面试官会通过这个问题判断你有没有真正部署过模型、处理过线上问题。
KV Cache的原理。自回归生成时,每生成一个新token都需要和之前所有token做注意力计算。如果不缓存,每次都要重新计算之前所有token的K和V,计算量随序列长度平方增长。KV Cache就是把之前算过的K和V存下来,新token只需要计算自己的Q和当前K、V,然后和缓存拼接。你可以说:“KV Cache是用显存换计算,没有它推理速度根本没法接受。”
KV Cache的显存计算。这个面试官很爱问。公式是:2 × num_layers × num_heads × head_dim × seq_len × batch_size × dtype_size。以LLaMA-7B为例,32层、32头、head_dim=128、FP16,序列长度2048、batch=1时,KV Cache大约是2×32×32×128×2048×2字节,算下来约1GB。你可以现场算给面试官看,这比背答案有说服力得多。
量化。FP16到INT8再到INT4,显存占用逐级下降,但精度损失需要评估。GPTQ、AWQ、GGUF是常见的量化方案。你可以说:“我实测下来,INT8量化基本无损,INT4在大多数任务上也能接受,但数学和代码任务可能会有明显下降。”
批处理与调度。Continuous Batching和PagedAttention是现在推理引擎的标配。Continuous Batching让不同请求的动态拼接成为可能,PagedAttention解决了KV Cache的碎片化问题。你可以提一下vLLM和TensorRT-LLM的对比:“vLLM上手快、社区活跃,TensorRT-LLM性能极致但调优成本高,选哪个看团队情况。”
| 优化手段 | 显存收益 | 延迟影响 | 适用场景 |
|---|---|---|---|
| KV Cache | 增加占用 | 大幅降低 | 所有自回归生成 |
| INT8量化 | 减少约50% | 基本不变 | 大多数场景 |
| INT4量化 | 减少约75% | 略增 | 显存紧张场景 |
| Continuous Batching | 不变 | 吞吐大幅提升 | 高并发服务 |
| PagedAttention | 减少碎片 | 基本不变 | 长序列场景 |
2.5 RAG系统:检索质量决定上限
RAG看起来简单——检索加生成嘛。但真正做过的人都知道,RAG系统的瓶颈几乎永远在检索侧。面试官问这个问题,就是想看你对检索链路的理解深度。
检索策略。稠密检索用embedding做语义匹配,稀疏检索用BM25做关键词匹配。实际系统中往往是混合检索,各取所长。你可以说:“纯稠密检索在专有名词和罕见词上容易翻车,加上BM25做补充会稳很多。”
重排序。召回阶段追求高召回率,重排序阶段追求高精度。Cross-Encoder重排序效果最好但速度慢,ColBERT这类延迟交互模型是折中方案。你可以补充:“重排序的收益在Top-20到Top-5这个区间最明显,再往后边际收益就递减了。”
上下文压缩。检索回来的文档往往很长,全部塞进上下文既浪费token又引入噪声。压缩方法包括抽取式压缩、生成式压缩、LLMLingua这类token级压缩。你可以说:“我一般会先做一轮规则过滤,去掉明显不相关的段落,再用模型做精细压缩。”
RAG的常见失败模式。检索不到相关内容、检索到但排序不对、内容对但模型没用好、模型用了但格式不对。每个环节都需要针对性的排查手段。你可以分享:“我排查RAG问题一般先看检索结果,如果检索没问题再看生成,这样能快速定位是检索侧还是生成侧的问题。”
避坑技巧:RAG系统一定要做端到端评估,不能只看检索指标或生成指标。我见过检索Recall很高但最终答案质量很差的case,问题出在生成阶段模型没有正确使用检索内容。
2.6 Function Calling与Agent:从“会说”到“会做”
这是当前最热的方向,也是面试官区分“传统NLP背景”和“LLM原生背景”的分水岭。
Function Calling的协议设计。模型需要输出结构化的工具调用请求,包括工具名和参数。OpenAI的function calling格式是事实标准,但开源模型往往需要自己定义格式。你可以说:“格式设计的关键是让模型容易学会、解析器容易处理。我一般用JSON Schema定义参数,训练时加入足够的格式示例。”
Agent的规划能力。ReAct模式是基础——推理加行动交替进行。但实际系统中往往需要更复杂的规划,比如任务分解、多步推理、反思重试。你可以提一下:“纯ReAct在简单任务上够用,但复杂任务需要加入任务分解和中间结果验证。”
容错与鲁棒性。模型不按格式输出怎么办?工具调用失败怎么办?参数解析错误怎么办?这些都是实际部署必须处理的。你可以分享:“我的做法是加一层输出校验和重试机制,格式不对就重新生成,连续失败就降级到人工兜底。”
多工具编排。当有几十个工具时,模型怎么选?全部塞进prompt会太长,需要做工具检索或分组。你可以说:“工具数量超过20个之后,我一般会先做一轮工具召回,只把相关的工具描述给模型。”
| 失败模式 | 典型表现 | 处理策略 |
|---|---|---|
| 格式错误 | 输出不是合法JSON | 校验加重试 |
| 工具选错 | 调用了不相关的工具 | 工具描述优化+召回 |
| 参数错误 | 参数类型或值不对 | Schema校验+默认值 |
| 死循环 | 反复调用同一工具 | 最大步数限制 |
| 幻觉调用 | 调用不存在的工具 | 工具白名单校验 |
2.7 评估与对齐:怎么证明“模型变好了”
这个问题最容易被低估。很多人觉得“评估不就是跑个benchmark嘛”,但面试官想看到的是你对评估方法论的理解。
自动评估指标。Perplexity、BLEU、ROUGE这些传统指标在大模型时代局限性很大。现在更常用的是基于模型的评估,比如用GPT-4做裁判。你可以说:“自动指标只能做粗筛,最终还是要靠人工评估和线上指标。”
人工评估的设计。评估维度怎么定、评分标准怎么统一、标注者间一致性怎么保证,这些都是实操中的难点。你可以分享:“我做过一轮人工评估,发现不同标注者对‘有用性’的理解差异很大,后来加了详细的评分指南才把一致性提上来。”
RLHF与DPO。RLHF是经典方案,但训练复杂、不稳定。DPO直接优化偏好数据,省去了奖励模型。你可以对比:“DPO实现简单、训练稳定,但效果上限可能略低于精细调优的RLHF。实际选型看团队工程能力和数据情况。”
对齐税。对齐之后模型能力往往会下降,这就是对齐税。怎么在安全性和能力之间找平衡,是每个做对齐的人都要面对的问题。你可以说:“我的经验是,对齐数据质量比数量重要得多,少量高质量偏好数据往往比大量噪声数据效果好。”
2.8 工程化与系统设计:从“实验室”到“生产环境”
这是高级岗位面试的压轴题。面试官会给你一个场景,让你设计完整的系统方案。
分布式训练。数据并行、张量并行、流水线并行、ZeRO优化,这些是基础。面试官可能会问:“100B模型怎么训?”你需要根据显存、带宽、集群规模给出合理方案。你可以说:“小集群优先考虑ZeRO-3加数据并行,大集群再考虑张量并行和流水线并行。”
数据管道。训练数据的清洗、去重、配比、tokenize、打包,每个环节都有坑。你可以分享:“数据去重没做好,模型很容易记住重复内容,评估时看着好但泛化差。”
监控与告警。训练loss、梯度范数、学习率、吞吐量,这些指标需要实时监控。推理侧的延迟、QPS、错误率、显存占用同样重要。你可以说:“我一般会设loss突增和梯度爆炸的告警,这两个是最常见的训练故障信号。”
故障排查。Loss突然飙升怎么办?先看数据有没有问题,再看学习率是不是太大,然后看梯度范数。推理延迟突然变高怎么办?先看是不是有长序列请求,再看KV Cache是不是满了,然后看批处理调度。你可以说:“排查问题的核心思路是分层定位,从数据到模型到系统逐层排除。”
实操心得:生产环境的LLM系统一定要有降级方案。模型服务挂了怎么办?切到小模型或者规则兜底。检索服务挂了怎么办?用缓存结果或者直接让模型裸生成。这些预案平时用不上,但关键时刻能救命。
3. 面试官视角:他们到底在找什么样的人
聊完8个技术方向,我想换个角度说说面试官的评判逻辑。很多人技术不差,但面试总挂,问题往往出在没有站在面试官的视角思考。
3.1 知识深度vs工程经验,怎么平衡
面试官评估候选人时,通常看三个维度:知识深度、工程经验、学习能力。不同岗位侧重点不同:
- 研究岗:知识深度权重最高,会追问论文细节和数学推导
- 工程岗:工程经验权重最高,会追问部署细节和故障处理
- 应用岗:学习能力权重最高,会看你对新技术的敏感度和上手速度
但不管什么岗位,“真做过”和“只听过”的差距在面试中非常明显。真做过的人能说出具体的数字、踩过的坑、做过的取舍;只听过的人只能说出概念和流程。
我建议你在准备面试时,每个技术点都问自己三个问题:我实际做过什么?遇到过什么问题?怎么解决的?如果答不上来,说明这个点还需要补。
3.2 回答的层次感:从及格到优秀
同一个问题,不同层次的回答差距很大。以“什么是KV Cache”为例:
及格回答:KV Cache是缓存Key和Value的机制,加速自回归生成。
良好回答:加上显存计算公式、具体数字、和不用KV Cache的对比。
优秀回答:再加上PagedAttention怎么优化KV Cache、Continuous Batching怎么配合、实际部署中的调优经验。
面试官往往会在你回答的基础上追问一层,看你的边界在哪里。所以准备的时候不要只准备“标准答案”,要准备“追问答案”。
3.3 不会的问题怎么处理
面试中遇到不会的问题很正常,关键是怎么处理。我的建议是:
- 不要硬编,面试官一眼就能看出来
- 可以先说“这个点我了解得不够深入,但我可以从相关经验来推测”
- 然后展示你的思考过程,哪怕最终答案不对,思考过程也能加分
- 最后可以补一句“面试结束后我会去补一下这块”
面试官考察的不只是知识储备,还有面对未知问题的态度和方法。
4. 准备策略:从“背八股”到“真理解”
最后聊聊怎么高效准备这类面试。我见过太多人把八股文背得滚瓜烂熟,但面试官换个问法就懵了。根本原因是只记了结论,没理解逻辑。
4.1 建立知识树,而不是知识清单
零散的知识点很容易忘,也容易被问穿。建议你按“架构-训练-推理-应用-评估”这条主线把知识串起来。每个节点问自己:这个技术解决什么问题?有什么替代方案?为什么选这个?实际用的时候有什么坑?
比如“推理优化”这个节点,往下可以挂KV Cache、量化、批处理、投机采样;每个子节点再往下挂原理、参数、实操经验。这样面试官问到任何一个点,你都能从知识树里快速定位。
4.2 用项目经历串联技术点
面试官最喜欢听的是“我在某个项目里遇到了什么问题,用了什么方案,效果怎么样”。这种回答既有技术深度,又有工程经验,还能展示你的思考过程。
建议你准备3-5个项目故事,每个故事覆盖多个技术点。比如一个RAG项目可以覆盖Tokenization、检索、推理优化、评估;一个Agent项目可以覆盖Function Calling、规划、容错、监控。面试时根据问题灵活调用。
4.3 模拟面试:找人虐你
自己准备和实际面试差距很大。建议找朋友或者同行做模拟面试,让对方故意追问、故意问偏、故意打断。练几次之后你会发现,很多你以为会的问题其实经不起追问。
我帮人做模拟面时最常发现的问题是:回答太笼统,缺少具体数字和细节。比如问“推理延迟多少”,答“挺快的”就不行,要说“首token延迟200ms,每token 30ms,batch=8的情况下”。数字能让面试官相信你真的做过。
4.4 持续跟进:这个领域没有“复习完”的一天
LLM领域变化太快,今天的热点明天可能就过时了。但底层原理和技术框架是相对稳定的。我的建议是:底层原理要扎实,新技术要保持敏感。每周花点时间看看新论文、新工具、新方案,面试时能提到最近的技术进展,会让面试官觉得你是在持续学习的。
最后分享一个我自己的习惯:每次面试结束后,不管过没过,我都会把被问到的问题记下来,然后补上当时答得不好的点。几次下来,知识体系就补得差不多了。面试本身就是最好的学习机会。