大模型面试题整理
1. RAG 的整体流程
检索增强生成(Retrieval-Augmented Generation, RAG)这套方案,本质上是把'模型会说'和'知识能查'拼到一起。流程并不复杂,但每一步都能影响最后效果:
- 数据预处理:先把原始数据里的噪声、重复内容和脏数据清掉。
- 分块(Chunking):这一步通常最容易被低估。切得太细,语义断裂;切得太粗,检索粒度又会变差。常见做法有固定长度分块、语义分块。
- 文本向量化:把文本块编码成向量。
- Query 向量化:把用户问题也转成向量。
- 向量检索:在向量数据库里找 Top-K 相似内容。
- 重排(Rerank):用更精细的模型重新排序,通常能把前面的'凑数结果'筛掉。
- 输入 LLM:把 Query 和检索结果一起拼进 Prompt。
- 输出回答:模型根据上下文生成最终结果。
2. 外挂知识库主要解决什么
纯参数化模型有几个绕不开的限制:训练完知识就固定了,遇到冷门领域容易答偏,回答来源也不好追。外挂知识库就是拿来补这些短板的。
- 解决知识截止问题
- 降低幻觉概率
- 覆盖垂直领域知识
- 让回答更容易追溯和审计
如果场景里'准确'比'流畅'更重要,RAG 往往比单纯让大模型硬答更稳。
3. 怎么看 RAG 项目的效果
我一般会把评估拆成两段看:检索有没有把料找对,生成有没有把话说对。
检索环节
- MMR (Maximal Marginal Relevance):看相关性和多样性的平衡
- Hits Rate:前 K 条里有没有命中正确答案
- NDCG (Normalized Discounted Cumulative Gain):更看重排序位置
生成环节
- 非量化指标:完整性、正确性、相关性、流畅度
- 量化指标:Rouge-L、BLEU 等
现实里只看一个指标很容易误判。检索分高,不代表生成就稳;生成分看着高,也可能只是句子更顺。
4. 幻觉问题和复读机问题是什么
- 幻觉问题:模型说得像真的,但其实和事实不符,或者和给定上下文对不上。
- 复读机问题:长文本生成时开始打转,反复输出相同词组或句子。
这两个问题看起来不一样,底层都和模型在'该信什么、该停哪儿'这件事上不够稳定有关。
5. 幻觉和复读机怎么处理
幻觉
- 接入高质量知识库
- 加输出约束,比如格式校验
- 控制输出长度,减少发散
- 用 CoT 提示引导推理路径
复读机
- 清理训练数据里的重复文本
- 做适度的数据增强
- 调高 Temperature,别让生成太死
- 加后处理,发现重复就截断
6. 这两个问题一般怎么来的
幻觉的来源
- 训练数据和源数据不一致:模型学到的表示和真实输入对不上,或者解码策略把结果带歪了。
- 问题超出模型认知范围:模型不知道,就只能补一个看起来合理的答案。
复读机的来源
- 数据本身质量差,重复内容太多
- 文本太长,训练或推理时注意力被冲散
- Greedy Search 太贪,老是挑局部最优 Token,最后容易陷进循环
7. 目前主流的开源大模型架构
开源生态里讨论最多的还是 Meta 的 LLaMA 系列。它基于 Transformer,但做了几处比较实用的改动:
- RMSNorm:前置归一化,替代 LayerNorm,训练更稳
- SwiGLU:用门控激活替换 ReLU,表达能力更强
- RoPE:用旋转位置编码替代绝对位置嵌入
- 高效 Attention 实现:减少显存和计算浪费
这些改动单看都不算颠覆,但叠在一起,训练和推理体验会顺很多。
8. SFT 常见的微调方法
- 全微调(Full Fine-tuning):更新全部参数,效果通常最好,代价也最大
- Adapter Tuning:插入小模块,主模型参数冻结
- Prefix Tuning / Prompt Tuning:在输入侧加可学习向量,不动原权重
- P-Tuning v1/v2:连续提示微调
- LoRA (Low-Rank Adaptation):低秩适配,算是现在最常见的高效微调方案
- RLHF:严格说不属于 SFT,但经常一起被问
SFT 时学习率通常会比预训练阶段低很多,常见经验是大概预训练阶段的 10%。 这个值不是死规则,但开大了通常更容易把基座模型冲坏。
9. LoRA 是怎么工作的
LoRA 的思路很直接:不直接改原来的大矩阵,而是在旁边加一条低秩分支,用两个小矩阵去近似参数更新。
- 公式:$W' = W + BA$,其中 $A \in R^{r \times d}$,$B \in R^{d \times r}$,且 $r \ll d$
- 初始化:A 用随机高斯分布初始化,B 用零矩阵初始化,这样一开始旁路不影响主模型
- 优势:主模型参数冻结,只训练 A 和 B,显存和计算量都会明显下降
# LoRA 核心逻辑示意
import torch.nn as nn
class LoRALayer(nn.Module):
def __init__(self, in_features, out_features, rank):
super().__init__()
self.lora_A = nn.Linear(in_features, rank, bias=False)
self.lora_B = nn.Linear(rank, out_features, bias=False)
# 初始化策略...
10. RAG 检索阶段常见的向量检索模型
- ANN 算法:近似最近邻,速度和精度之间做平衡
- Product Quantization:压缩向量,减少检索成本
- Brute Force:小规模数据还能用,结果最准确,但不便宜
- HNSWlib:层次导航小世界图,实际工程里很常见
- KD 树:更适合低维空间
11. 通用 RAG 可以从哪些地方改
- Query 侧优化:纠错、改写、规范化、扩展,比如 HyDE
- 索引优化:层次索引、分层召回,提高速度和召回质量
- 模型微调:针对垂直领域调优 LLM
- 后处理:对输出做合理性检查,过滤明显不合逻辑的结果
这类优化里,Query 侧和检索侧通常最先见效,改起来也最划算。
12. LangChain 是什么
LangChain 可以理解成一套给大模型应用做编排的框架。它把 Prompt、记忆、检索、工具调用这些东西封装成组件,开发时不用每次都从头搭。
它和 TensorFlow / PyTorch 不完全是一类东西,但在'把很多零散能力串起来'这件事上,定位有点像应用层的积木框架。
13. LangChain 常用模块
- Document Loaders:文档加载器,支持 PDF、TXT、Web 等
- Text Splitters:文本分块
- Embeddings:向量化服务,比如 HuggingFace
- Vector Stores:向量存储后端,比如 Chroma、FAISS、Milvus
- Chains:链式编排,比如
RetrievalQA
14. SFT 和 RLHF 的差别
- SFT (Supervised Fine-Tuning)
- 优点:收敛快、成本低、能把输出格式调顺
- 缺点:依赖标注质量,难学到细粒度偏好
- RLHF (Reinforcement Learning from Human Feedback)
- 优点:更容易对齐人类偏好,安全性和有用性通常更好
- 缺点:训练不稳定,成本高,还要额外训练 Reward Model
如果只是想把模型调成'按指令办事',SFT 往往够用;如果要继续把偏好和安全边界往前推,才会考虑 RLHF。
15. RLHF 的流程
RLHF 一般分三步:
- SFT 阶段:先让模型学会基本的指令遵循
- Reward Model 训练:收集人类对不同回答的偏好,训练奖励模型打分
- PPO 优化:用近端策略优化,根据奖励信号更新策略模型
做完这套之后,模型不只是'会说',还会尽量往人更喜欢的表达方式上靠。
16. 训练 OOM 时常用的优化手段
- 梯度累积:用更小的 batch 模拟大 batch
- 混合精度训练:FP16 / BF16 降显存
- ZeRO 优化:DeepSpeed 的显存切分方案
- 分布式训练:多卡分摊负载
- 减小批量大小:最朴素,但通常最先能跑起来
- 优化数据加载:减少内存驻留和等待时间
17. LLaMA 的输入能无限长吗
不能。
原因很现实:
- Attention 的复杂度会随着序列长度快速上升
- 训练时长序列更容易把优化搞不稳
- 推理时上下文越长,显存和错误累积压力都更大
所以'理论上能塞多少'跟'工程上能不能跑得住'不是一回事。
18. 想让大模型处理更长文本,通常怎么做
- 分块处理:把长文本切开,必要时加重叠窗口
- 架构升级:用稀疏 Attention 等方法降低成本
- 位置编码优化:用 RoPE 这类更适合外推的编码方式
19. 推理时显存里通常有什么
- 模型参数:权重本身
- 输入数据:Prompt 的 Embedding
- 中间计算结果:最关键的是 KV Cache
- 内存管理策略:有些框架会延迟释放显存,换一点性能和更少的频繁分配
推理阶段里,KV Cache 往往才是真正吃显存的地方。
20. ChatGLM 的特点
ChatGLM 的基座是 GLM,兼具 Encoder 和 Decoder 的能力。
- Mask 方式
[mask]:类似 BERT,随机 Mask 短 Span[gmask]:更接近 GPT,用于生成任务
- 结构变化
- 位置编码改成 RoPE
- 激活函数从 GeLU 走到 GLU,再到 ChatGLM2 的 SwiGLU
- Normalization 从 LayerNorm 到 DeepNorm,再到 RMSNorm
- ChatGLM 2.0 新特性
- FlashAttention:减少 IO 开销
- Multi-Query Attention:共享 KV 头,显存占用更低
21. GLU 和 SwiGLU
- GLU (Gated Linear Unit):通过门控机制筛选信息,常见形式是 $x \otimes \sigma(Wx)$
- SwiGLU:把 Swish 激活和 GLU 结合起来,形式上可以写成 $x \otimes \text{Swish}(Wx)$
从工程上看,SwiGLU 的吸引力很简单:通常更强一点,但代价并不夸张。
22. LLaMA 1 和 LLaMA 2 的差别
- 数据规模:Llama 1 是 1.4T tokens,Llama 2 是 2.0T tokens
- 上下文长度:Llama 1 为 2k,Llama 2 为 4k
- 架构细节
- 位置编码都用 RoPE
- Llama 1 用 LayerNorm,Llama 2 用 RMSNorm
- 激活函数都采用 SwiGLU
23. 训练和推理分别占多少显存
- 训练:通常大约是模型参数量的 16 倍左右,FP16 场景下尤其明显
- 推理:大约是模型参数量的 2 倍左右,主要由 FP16 权重和 KV Cache 构成
这个比例不是放之四海皆准,但拿来做容量估算已经够用了。
24. DeepSpeed 的核心机制
DeepSpeed 本质上是在数据并行的基础上,把显存和通信拆开处理。
Ring All-Reduce
传统 Parameter Server 容易卡在单点上。Ring All-Reduce 把通信压力摊到各个 GPU,整体吞吐会更好。
ZeRO 分阶段优化
- Zero1:分割 Adam 参数,Forward 基本不受影响,Gradient 需要 All-Reduce
- Zero2:分割 Adam 和 Gradient,进一步减少通信量
- Zero3:参数、Adam、Gradient 全部分割,Forward 时需要 All-Gather 参数,Backward 时再释放不属于本卡的部分。通讯开销大概比 Zero2 高一些,但显存节省更明显
ZeRO-Offload
在 Zero2 的基础上,把 Adam 和 Gradient 卸载到 CPU 内存,继续压 GPU 显存。
25. 什么是混合精度训练
混合精度训练就是同时利用 FP16 和 FP32:
- FP16:占用更小,速度更快,Tensor Core 也更友好
- FP32:精度更高,避免数值溢出
关键点一般有三个:
- 权重备份(Weight Backup):保留一份 FP32 主权重
- 损失放大(Loss Scaling):防止 FP16 下梯度太小被直接舍掉
- 精度累加:梯度累加时尽量用 FP32
26. Prefix LM 和 Causal LM
- Prefix LM:前缀部分双向可见,输出部分单向生成。常见于 ChatGLM、U-PaLM 这类模型
- Causal LM:严格自回归,只能从左到右看上下文。LLaMA、Qwen 属于这一类
这两个概念很容易被写错,很多资料里还会把 Causal 拼成 Casual,但意思完全不是一回事。
27. MHA 之后常见的计算优化
- KV Cache:缓存 Key 和 Value,避免重复算历史 Token
- MQA (Multi-Query Attention):多个 Head 共享同一组 KV,显存占用更低
- GQA (Grouped-Query Attention):按组共享 KV,兼顾性能和显存
- FlashAttention:把 Q、K、V 分块,减少对 HBM 的访问,缓解 IO 瓶颈
28. 常见 Attention 计算方式
- Self-Attention:序列内部 token 之间互相作用
- Cross-Attention:不同序列之间交互,比如 Encoder-Decoder
- DIN Attention:Deep Interest Network 里的注意力形式,不走 Softmax 归一化,更强调原始信号强度
结尾
面试里问大模型,很多题看上去分散,其实绕不开几条主线:检索怎么做,微调怎么省,训练怎么稳,推理怎么扛。把 RAG、LoRA、DeepSpeed、Attention 这些底层概念吃透,比背一串名词有用得多。真正落到工程上,大家最后拼的也不是'知道多少术语',而是能不能判断哪一步该省,哪一步不能省。


