一、大语言模型基础
1. 目前主流的开源模型体系有哪些?
主流开源模型体系包括:LLaMA 系、Qwen 系、GLM/ChatGLM 系、Mistral/Mixtral 系、Baichuan 系、DeepSeek 系、InternLM、Yi 等。面试里建议从以下维度比较:
- 参数规模(7B/13B/70B…)
- 上下文长度(8K/32K/128K…)
- 多语言能力
- 工具调用能力(function calling / agent)
- 推理成本与部署难度
- 开源协议(是否可商用)
2. Prefix LM 和 Causal LM 区别是什么?
- Causal LM:严格自回归,token 只能看左侧历史(下三角 mask)。
- Prefix LM:把输入分“前缀区”和“生成区”,前缀区通常可双向可见,生成区仍按自回归方式生成。
区别本质:Prefix LM在条件建模上更灵活,Causal LM在统一生成训练上更直接。
3. 为何现在的大模型大部分是 Decoder-only 结构?
核心原因:
- 训练目标统一:next-token prediction 可直接吃海量文本。
- 生成任务天然匹配:对话、写作、代码补全都属于自回归生成。
- 扩展性强:参数和数据放大时性能提升规律清晰。
- 工程生态成熟:KV Cache、并行推理框架都围绕 Decoder-only 深度优化。
4. LLM 复读机问题
“复读机”是模型重复输出相同短语/句子的现象。常见原因:
- 温度太低、top-p过窄
- repetition_penalty 未设置
- prompt指令不明确
- 长上下文导致局部高概率循环
常见解决:
- 调高 temperature / top-p
- 设置重复惩罚与 n-gram 限制
- 缩短上下文或分段生成
- 在提示词里明确“禁止重复”
outputs = model.generate(
**inputs,
max_new_tokens=256,
temperature=0.8,
top_p=0.9,
repetition_penalty=1.1,
no_repeat_ngram_size=3
)
5. 如何让大模型处理更长的文本?
常见方案:
- 分块+检索(RAG):检索相关片段喂给模型。
- 长上下文模型:选支持 32K/128K+ 的模型。
- 滑动窗口:分段重叠处理后聚合答案。
- 层次摘要:段落总结→全局总结。
- 位置编码外推技术(如 RoPE 相关扩展)。
def chunk_text(text, chunk_size=1000, overlap=150):
res, i = [], 0
while i < len(text):
res.append(text[i:i+chunk_size])
i += chunk_size - overlap
return res
二、大语言模型架构
1. 讲讲对 Attention 的理解?
Attention本质是“按相关性做加权聚合”:给定 Query(当前需求)、Key(索引线索)、Value(内容),先算 Q-K 相似度,再对 V 做加权求和。它让模型在每一步都能动态关注最相关上下文,而不是把信息压缩成固定向量。
2. Attention 的计算步骤是什么?
步骤:
- 输入经线性层得到 Q/K/V
- 计算分数:(QK^T)
- 缩放:除以 (\sqrt{d_k})
- 加 mask(因果/padding)
- softmax 得注意力权重
- 权重乘 V 得输出
import torch, math Q = torch.randn(2, 16, 64) K = torch.randn(2, 16, 64) V = torch.randn(2, 16, 64) scores = Q @ K.transpose(-1, -2) / math.sqrt(64) attn = torch.softmax(scores, dim=-1) out = attn @ V
3. Attention 机制和传统 Seq2Seq 模型有什么区别?
传统 Seq2Seq(无 attention)把整句压成单一向量,长句易丢信息。Attention 允许解码时直接访问编码端各位置,提高长距离依赖建模能力。Transformer进一步完全用自注意力替代RNN,实现更强并行性。
4. Transformer 中 multi-head attention 中每个 head 为什么要进行降维?
原因:
- 控制计算量与显存
- 每个head在不同子空间学习不同关系
- 保持总维度不变(多头拼接后再投影回去)
5. Encoder 编码器与 Decoder 掩码有什么区别?
- Encoder自注意力通常是双向可见(除padding位)。
- Decoder自注意力使用因果mask,当前位置不能看未来token。
这决定了:Encoder偏理解,Decoder偏生成。
6. 为什么 BERT 选择 mask 掉 15% 这个比例的词,可以是其他比例吗?
15%是经验上“信息破坏”和“训练信号”之间的平衡点:
- 太低:监督信号不足
- 太高:输入被破坏过多,语义上下文不完整可以改成其他比例,但效果要靠实验验证,不同语料/模型可能最优点不同。
7. BERT 非线性的来源在哪里?
主要来自:
- FFN中的激活函数(GELU)
- 注意力中的softmax
- 多层堆叠后残差+归一化形成的复杂非线性表示能力
8. 为什么要进行 LN(LayerNorm)?
LayerNorm在特征维度做归一化,使每层输入分布更稳定,缓解训练震荡、加快收敛。相比BatchNorm,LN不依赖batch统计,更适合NLP可变长度与小batch场景。
import torch.nn as nn ln = nn.LayerNorm(768)
三、训练数据集
1. SFT(有监督微调)的数据集格式?
典型格式是指令数据:
- instruction / input / output或 chat 格式:
- system / user / assistant 多轮消息。
{"instruction":"解释过拟合","input":"","output":"过拟合是训练集好、泛化差。"}
2. RM(奖励模型)的数据格式?
核心是“偏好对”:
- 同一 prompt 下,chosen(更好回答)与 rejected(较差回答)
{"prompt":"如何学NLP?","chosen":"先基础后项目","rejected":"随便看看"}
3. PPO(强化学习)的数据格式?
通常包含:
- prompt
- response
- reward
- old_logprobs / values / advantages(算法训练字段)
四、有监督微调
1. 微调方法是啥?如何微调?
微调是在预训练模型上用任务数据继续训练。流程:数据清洗→构建样本→选择全参或PEFT→训练→验证→导出。
from peft import LoraConfig, get_peft_model cfg = LoraConfig(r=8, lora_alpha=16, target_modules=["q_proj","v_proj"]) model = get_peft_model(base_model, cfg)
2. 微调和参数高效微调之间的区别是什么?
- 全量微调:更新全部参数,效果上限高但成本高。
- 参数高效微调(PEFT):只训练少量新增参数,显存和存储成本低。
3. PEFT 有什么优点?
- 显存占用小
- 训练快
- 多任务可维护多个小适配器
- 易与量化结合(如QLoRA)
4. 多种不同的高效微调方法对比
- LoRA:低秩矩阵注入,通用最好。
- Prefix Tuning:学习前缀向量,参数更少。
- Adapter:插入小模块,结构清晰。
- P-Tuning v2:深层prompt参数化,效果稳定。
5. 当前高效微调技术存在的一些问题
- 跨任务泛化不稳定
- 多adapter融合冲突
- 超参敏感(r、alpha、target modules)
- 线上多版本管理复杂(路由、回滚、兼容)
五、推理
1. 为什么大模型推理时显存涨得那么多还一直占着?
两部分:
- 模型参数常驻显存
- KV Cache随序列长度增长此外,推理框架常使用显存池,不会立即还给系统,看起来“占着不掉”。
2. 大模型在 GPU 和 CPU 上推理速度如何?
通常GPU显著快于CPU,尤其长序列与高并发场景。CPU适合低并发、成本敏感或边缘部署,GPU适合在线服务高吞吐。
3. 推理速度上,INT8 和 FP16 比起来怎么样?
一般INT8更省显存、吞吐更高;FP16精度通常更稳、生态更成熟。真实收益取决于硬件对INT8算子的支持程度。
4. 大模型有推理能力吗?
有,但不是严格符号推理。它能完成多步推断、代码和数学推导,但仍可能逻辑出错或幻觉,因此需结合工具与校验机制。
5. 大模型生成时的参数怎么设置?
常用参数:temperature、top_p、top_k、max_new_tokens、repetition_penalty、stop。经验:
- 事实问答:低温(0.2~0.7)
- 创意生成:高温(0.8~1.1)
gen_cfg = {
"temperature": 0.7,
"top_p": 0.9,
"max_new_tokens": 256,
"repetition_penalty": 1.1
}
6. 有哪些省内存的大语言模型训练/微调/推理方法?
- 量化(8bit/4bit)
- LoRA/QLoRA
- 梯度检查点
- ZeRO/FSDP分片训练
- 推理时KV Cache优化、PagedAttention(如vLLM)
六、强化学习
1. 简单介绍强化学习?
强化学习通过“状态-动作-奖励”交互学习策略,目标是最大化长期累计回报。与监督学习不同,它不是每步都有标准标签。
2. 简单介绍一下 RLHF?
RLHF常见三步:
- SFT让模型会按指令回答
- 训练奖励模型(RM)学习人类偏好
- 用PPO等方法优化策略模型
3. 奖励模型需要和基础模型一致吗?
不一定必须一致,但通常建议同家族或相近tokenizer/语料域,以减少奖励信号偏差和训练不稳定。
4. RLHF 在实践过程中存在哪些不足?
- 人工标注成本高
- 奖励黑客(讨好RM)
- 训练不稳定、超参敏感
- 可能牺牲事实性或多样性
5. 什么是 LLM Agent?
LLM Agent是以大模型为决策核心,结合工具调用、记忆、规划、执行与反馈闭环的系统。它不仅“回答”,还能“行动”。
6. LLM Agent 有什么关键能力?
- 任务分解与规划
- 工具选择与调用
- 记忆管理
- 自我反思与纠错
- 安全约束执行
7. 怎样构建基于 LLM 的 Agents?
流程:
- 明确任务边界
- 定义工具接口
- 设计提示与状态机
- 构建 Plan-Act-Observe 循环
- 监控与评估迭代
while not done:
plan = llm(plan_prompt(state))
action = llm(tool_prompt(plan))
obs = tool_call(action)
state = update(state, obs)
七、大语言模型评估
1. 大模型怎么评测?
三层:
- 离线基准(MMLU、GSM8K、HumanEval)
- 任务指标(F1、ROUGE、Pass@k)
- 线上指标(时延、成功率、满意度、幻觉率)
2. 大模型的 honest 原则是如何实现的?模型如何判断回答的知识是训练过的已知知识,怎么训练这种能力?
实现方式:
- 不确定时拒答(阈值/规则)
- 检索增强并要求给证据
- 事实校验器二次核查
- SFT中加入“不知道/信息不足”样本
- 用偏好数据强化“诚实优于胡编”的行为
模型无法真正“知道自己是否见过所有知识”,通常靠不确定性估计、检索证据和训练偏好共同近似实现。
3. 如何衡量大模型水平?
从“能力-稳定性-成本”三维衡量:
- 能力:知识、推理、代码、工具调用
- 稳定性:鲁棒性、安全性、一致性
- 成本:吞吐、时延、显存、单次调用价格
4. 大模型评估方法有哪些?
- 自动评测(benchmark)
- LLM-as-judge
- 人工盲评
- 红队对抗测试
- 线上A/B实验
5. 什么是大模型幻觉?
幻觉是模型生成了看似合理但事实错误或无依据的内容。
6. 为什么需要解决 LLM 的幻觉问题?
因为幻觉会导致错误决策、合规风险和用户信任下降,尤其在医疗、法律、金融等高风险领域。
7. 幻觉一定是有害的吗?
不一定。创意写作场景中“发散”可能有价值;但在事实型任务中幻觉通常是有害的。
8. 幻觉有哪些不同类型?
- 事实性幻觉
- 引用幻觉(伪造出处)
- 推理幻觉(逻辑链错误)
- 指令偏离型幻觉
- 上下文冲突型幻觉
9. 为什么 LLM 会产生幻觉?
- 训练目标是“概率最优”而非“事实真值最优”
- 语料噪声与知识过时
- 检索缺失
- 采样带来的随机性
10. 如何度量/复查幻觉?
- 人工抽检与事实核对
- 引入可验证参考答案集
- 统计“无依据回答率/引用错误率”
- 使用RAG并校验证据一致性
- 高风险场景加入人工复核
八、大语言模型应用
1. 什么是 LangChain?
LangChain是LLM应用开发框架,提供提示模板、模型调用、检索、Agent编排、记忆管理等模块,用于快速搭建问答和Agent系统。
2. LangChain 包含哪些核心模块?
- Prompt 模板
- Model I/O
- Retriever / VectorStore
- Chains
- Agents
- Memory
- Callback/Tracing
3. LangChain 如何调用 LLMs 生成回复?
基本过程:构造Prompt → 调用模型 → 解析输出。
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4o-mini")
prompt = ChatPromptTemplate.from_template("请解释:{topic}")
chain = prompt | llm
resp = chain.invoke({"topic": "LoRA"})
print(resp.content)
4. LangChain 如何修改提示模板?
通过 PromptTemplate/ChatPromptTemplate 参数化变量,按场景维护模板版本,结合评测或A/B持续优化。
from langchain_core.prompts import PromptTemplate
tpl = PromptTemplate.from_template("你是面试官,请回答:{q}")
print(tpl.format(q="什么是RAG?"))

全部评论
(1) 回帖