本文来源公众号“Datawhale”,仅用于学术分享,侵权删,干货满满。
原文链接:超全解析!大模型面试宝典60题
最近没有什么事,想系统的梳理一下大模型相关的事情。偶然阅读了李博杰翻译的《图解大模型》一书,其中有配套阅读:大模型面试题 60 问,根据自己的理解给了相应的一个答案,供大家参考。
我在面试候选人和参加业内研讨会时,常常发现很多人有大量实战经验,但对模型的基本原理知之甚少。为了帮助大家更好地理解本书,也为了方便部分有面试需求的朋友更有针对性地阅读本书,围绕本书各章主题,我系统梳理了大模型领域常见的面试题,其中的大多数问题可以在书中直接找到答案,部分进阶问题可以从本书的参考文献或网络上的最新论文中找到答案。希望所有的朋友都能够带着这些问题阅读本书。
部分答案引用了大语言模型进行了辅助回答,笔者进行了新筛选与矫正。
Q1:仅编码器(BERT 类)、仅解码器(GPT 类)和完整的编码器-解码器架构各有什么优缺点?
Q2:自注意力机制如何使大模型能够捕捉长距离依赖关系,它跟 RNN 有什么区别?
自注意力机制允许序列中每个位置直接与所有其他位置交互,通过计算 Query 和 Key 的相似度,对全局信息进行加权聚合。因此,无论依赖关系有多远,都能在一次计算中捕捉到。
相比之下,RNN 是一步步传递信息,远距离依赖需要多步传播,容易造成梯度消失,也限制了模型对长依赖的建模能力。
此外,自注意力机制支持并行计算,而 RNN 必须串行执行,训练效率也低很多。
Q3:大模型为什么有上下文长度的概念?为什么它是指输入和输出的总长度?
Transformer 模型在处理文本时,会把输入 token 编码成一个固定长度的序列,并通过位置编码保留顺序信息。
模型的注意力机制是全局的,每个 token 都会与序列中其他 token 进行交互,其计算复杂度是 O(n^2),这在显存或内存上有较高开销,因此在训练阶段我们就需要设定一个最大的上下文长度,比如 2048 或 4096 个 token。
而这个“上下文长度”指的是当前模型可感知的全部 token 的数量,也就是“输入 token + 已生成 token”的总和。
原因是像 GPT 类模型是自回归的,每生成一个新 token,都需要重新读取整个已有上下文作为输入。所以如果总长度超过了模型的最大支持范围,就必须截断或者做缓存处理。
Q4:大模型的分词器和传统的中文分词有什么区别?对于指定的词表,一句话是不是只有唯一的分词方式?
大模型的分词是为了满足模型输入 token 的形式,而传统中文分词是为了符合人类语义理解习惯。
大模型的分词器在编码阶段,对于一个固定词表,一句话的分词方式是唯一的。
因为大模型的分词器会使用固定的词表,并且按照最长匹配优先的规则从前往后一个个切分。
这个过程是贪心算法,没有随机性,也不考虑上下文,词表一样,分词规则一样,输入一样,输出就一定一样。
Q5:大模型是如何区分聊天历史中用户说的话和 AI 说的话的?
大模型区分用户和 AI,是靠在输入里加明确的角色标记,如 <|im_start|>user 和 <|im_start|>assistant。
模型并不理解“谁是谁”,它只是学会了这些格式对应的说话模式。只要格式规范,模型就能正确判断并生成对应角色的回复。
Q6:传统的静态词嵌入(如 word2vec)与大模型产生的上下文相关的嵌入相比,有什么区别?有了 与上下文相关的嵌入,静态词嵌入还有什么价值?
静态词嵌入的价值:
-
轻量、计算快:适合资源受限场景,不需要大型模型推理
-
可解释性强:向量空间更易可视化,便于分析词语相似性。
-
预训练简单:不依赖上下文,可以用大规模语料快速训练。
Q7:在 word2vec 等词嵌入空间中,存在 king – man + woman ≈ queen 的现象,这是为什么?大模型 的词元嵌入空间是否也有类似的属性?
Word2Vec 学到的词向量不仅捕捉了语义相似性,还在向量空间中学到了一些语义关系的方向性。
在大模型(如 GPT、BERT)中,词元嵌入层也会保留类似的结构关系,尤其在 embedding 层和初始的表示空间中,可以观测到一些类似的加减逻辑。
但因为大模型后续加入了上下文建模,经过多层 Transformer 的非线性变换后,最终的 token 表示是上下文相关的,不一定再保持简单的线性结构。
Q8:注意力机制是如何计算上下文各个词元之间的相关性的?每个注意力头只关注一个词元吗?
注意力机制的核心原理是通过动态权重分配,让模型在处理输入数据时能够聚焦于关键信息。
其计算过程分为三步:
-
相似度计算:用查询向量(Query)与键向量(Key)计算点积,衡量词元间的关联强度,并通过缩放避免数值过大
-
权重归一化:对相似度分数应用Softmax,转化为概率分布,突出重要词元
-
上下文生成:用归一化权重对值向量(Value)加权求和,得到融合全局信息的表示
每个注意力头并不只关注一个词元,而是从不同子空间学习多样化的关联模式,一个头可能捕捉语法结构(如主谓一致),另一个头关注关键词匹配,多头并行计算后拼接结果,综合多视角信息。
Q9:如果需要通过修改尽可能少的参数值,让模型忘记某一特定知识,应该修改注意力层还是前馈神经网络层的参数。
要让模型快速忘记某个特定知识,优先修改注意力层的参数(尤其是 Q/K 矩阵),因为注意力层直接控制词元间的关联性,调整少量参数即可切断目标知识的上下文联系。
理由如下:
-
精准性:注意力层直接控制词元关联性,调整 Q/K 矩阵可快速切断目标知识的上下文联系
-
高效性:仅需修改 0.1%-1% 参数(如冻结特定注意力头或 LoRA 微调),远少于 FFN 层
-
安全性:对模型其他功能干扰更小,避免 FFN 层修改引发的连带遗忘
Q10:为什么注意力机制需要多个头?跟简单地减少注意力头的数量相比,多查询注意力和分组查询 注意力优化有什么不同?它们优化的是训练阶段还是推理阶段?
多头设计(MHA)通过并行计算多个注意力头,使模型能同时捕捉序列中不同维度的依赖关系(如语法、语义、长距离关联等),显著提升模型表达能力。
多查询注意力(MQA)与分组查询注意力(GQA)的优化差异:
Q11:Flash Attention 并不能减少计算量,为什么能提升推理速度?Flash Attention 是如何实现增量计算 softmax 的?
Flash Attention 主要通过以下几种方式提升推理速度:
内存访问优化:传统的注意力计算需要大量的内存访问,尤其是在计算 Query、Key 和 Value 的矩阵乘法时。
Flash Attention 使用了更高效的内存访问模式,通过利用 GPU 的高效缓存和内存带宽,减少了不必要的数据传输。
特别是在大模型的推理中,大量的内存访问和数据复制会拖慢速度,而 Flash Attention 通过优化内存访问方式,显著加速了计算。
减少重复计算:传统注意力机制计算时,softmax 和加权求和是独立计算的,Flash Attention 通过增量计算softmax,避免了重复计算,减少了计算量。
更高效的硬件利用:Flash Attention 通过专为 GPU 设计的高效算法,能够更好地利用 GPU 上的计算资源,减少了计算延迟。
它将注意力矩阵按块(block)读取,每次只处理一部分 token,在计算 softmax 时,不是一次性对整行做归一化,而是边读边计算最大值与加权和,逐步更新 softmax 的中间结果。
这样可以避免保存整个注意力矩阵,用更少的内存完成等价计算,从而提升速度和效率。
Q12:跟原始 Transformer 论文中的绝对位置编码相比,RoPE(旋转位置嵌入)有什么优点? RoPE 在长上下文外推时会面临什么挑战?
RoPE 的优势:
-
RoPE 编码的是“相对位置”,而不是固定的位置编号,所以模型更容易捕捉词和词之间的距离关系。
-
RoPE 可以自然推广到更长的上下文,因为它是通过旋转角度连续编码位置的,只要角度公式支持,就能处理比训练时更长的文本。
-
更适合生成任务,因为它直接作用在注意力计算里,对位置敏感,但不改变 token 本身的表示。
RoPE 在长上下文外推时的挑战:
-
位置越大,旋转角度越大,容易导致表示混乱,模型难以判断远距离 token 的真实关系。
-
超出训练长度后,模型没见过这些角度,就会“失去记忆力”,注意力权重变得不准确。
-
高频维度变化太快,长距离信息反而被扭曲,模型难以稳定利用上下文。
Q13:嵌入模型 + 逻辑回归的分类方式获得了 0.85 的 F1 分数,而零样本分类方式获得了 0.78 的 F1 分数。如果有标注数据,什么情况下会选择零样本分类?
即使有标注数据,也会在以下几种情况下选择零样本分类:
-
标注数据太少,训练出来的模型效果不稳定,反而不如零样本;
-
分类标签经常变,比如新增类别,用零样本不用重新训练;
-
需要快速上线,零样本即用即测,不需要模型训练;
Q14:与 BERT 的掩蔽策略相比,掩码语言建模有何不同?这种预训练方式如何帮助模型在下游的文本分类任务中获得更好的性能?
BERT 用的就是掩码语言建模(MLM),它会把句子里一部分词换成 [MASK],然后让模型去猜被遮住的词是什么。这种方法让模型学会理解整个句子的意思,而不是像 GPT 那样只预测下一个词。
因为模型在预训练时学会了看一句话的上下文,理解句子的语义,所以在做文本分类时,比如判断情感、话题、意图,只需要在上面接一个简单的分类器,模型就能表现很好。
Q15:假设你有一个包含 100 万条客户评论的数据集,但只有 1000 条带有标签的数据,请同时利用有标签和无标签的数据,结合表示模型和生成模型的优势,构建一个分类系统。
Step1:构建基础表示模型,使用 BERT 类预训练模型,加载 MLM 预训练权重,用这 1000 条标注样本训练。
Step2:利用无标签数据做伪标签增强,用初始模型对部分高置信度的无标签数据打标签,将这些“伪标签样本”加入训练集,继续训练模型。
Step3:引入生成模型增强(Prompt + 少样本能力),使用 LLM 做 zero-shot 或 few-shot 辅助,和 BERT 模型的预测结果进行融合,提升低资源条件下的准确率。
Q16:有了强大的生成式大模型,嵌入模型还有什么用?
嵌入模型速度快、成本低,适合做大规模文本检索和相似度计算。
嵌入能把文本转成向量,方便做分类、聚类和搜索等基础任务。
生成模型更重,更适合复杂对话和文本生成,嵌入模型更轻量,能做很多高效的辅助工作。
嵌入模型可以跟生成模型配合使用,提升整体系统效果。
Q17:词袋法和文档嵌入在实现原理上有什么区别?词袋法是不是一无是处了?
词袋法的优势:
-
计算快,资源占用低,适合快速原型和小数据场景;
-
可解释性强,方便理解和调试;
Q18:BERTopic 中的 c-TF-IDF 与传统的 TF-IDF 有何不同?这种差异如何帮助改进主题表示的质量?
c-TF-IDF 与传统 TF-IDF 的区别:
传统 TF-IDF 是针对单个文档计算词频和逆文档频率,用来衡量词在文档中的重要性。
c-TF-IDF 是针对一个“类”或“主题下的所有文档的集合”来计算词频和逆文档频率,强调词在该主题下的重要性,同时抑制在其他主题中的普遍词。
c-TF-IDF 可以更准确地找到某个主题的代表性关键词,因为它把主题内词频和跨主题词频都考虑进去了。
这样主题关键词更具区分性,不容易被在所有主题中都出现的高频词干扰。因此,c-TF-IDF 提升了主题的清晰度和区分度,使得主题表示更精准、更有意义。
Q19:基于质心和基于密度的文本聚类算法有什么优缺点?
基于质心的文本聚类(如 K-means)优缺点:
优点:
-
算法简单、计算速度快,适合大规模数据;
-
易于实现和理解;
-
聚类结果通常是凸形,便于解释。
缺点:
-
需要预先指定簇数;
-
对初始质心敏感,容易陷入局部最优;
-
不能很好处理非凸形簇或噪声数据。
基于密度的文本聚类(如 DBSCAN)优缺点:
优点:
-
不需要预先指定簇数;
-
能发现任意形状的簇;
-
能有效识别噪声和离群点。
缺点:
-
对参数(邻域大小、最小点数)敏感,参数选择困难;
-
计算复杂度较高,不太适合超大规模数据;
-
在高维文本空间中,密度判断可能失效(“维度灾难”)。
Q20:在一个主题建模项目中,你发现生成的主题中有大量重叠的关键词,如何使用本章介绍的技术来提高主题之间的区分度?
可以用以下几种技术:
使用 c-TF-IDF:c-TF-IDF 会针对每个主题集合计算词权重,抑制在多个主题中都高频的词,从而突出每个主题的独特关键词。
调整主题数量和模型参数:适当调整主题数,避免主题过多导致语义重复;通过正则化或增加主题间距离约束,提高区分度。
基于密度的聚类方法:采用 DBSCAN 等密度聚类替代 K-means,避免不同主题被划入同一簇。
关键词后处理:对重复关键词做过滤或降权处理,保留区分度高的词。
Q21:针对翻译类、创意写作类、头脑风暴类任务,分别如何设置 temperature 和 top_p?
任务越标准越严谨(如翻译),temperature 就越低;任务越开放越创新(如写作、头脑风暴),就适当提高 temperature 和 top_p,增强多样性。
Q22:一个专业的提示词模板由哪几部分构成?为什么提示词中需要描述角色定义?
一个专业的提示词(Prompt)模板通常包含以下几部分:
-
角色定义(Role)→ 告诉模型“你是谁”(例如你是医生/律师/客服/算法工程师)。
-
任务目标(Task)→ 明确你要模型完成什么任务,比如“写摘要”、“做分类”、“写代码”。
-
上下文信息(Context)→ 提供必要背景,让模型理解问题场景。
-
输入数据(Input)→ 提供需要处理的具体内容,如文本、问题或数据片段。
-
输出格式要求(Output Format)→ 规定模型输出的格式或风格,比如表格、列表、JSON 或限制字数等。
因为大模型是通过模式学习的,角色定义能引导模型以更专业、更符合预期的语气和风格回答问题。
Q23:为了尽可能防止提示词注入,如何设计提示词模板?如何在系统层面检测提示词注入攻击?
1. 提示词模板设计防护
明确角色设定:在 prompt 中指定模型身份和行为范围,如“你是一个只能回答财经问题的助手”。
使用指令封闭结构:避免开放式提示,使用模板化结构如 "指令: {instruction} \n 输入: {input} \n 输出: "。
控制用户插入点:将用户输入限制在变量 slot 中,避免影响系统指令。
2. 系统层面注入检测
关键词黑名单匹配:检测如“忽略之前的指令”“你现在是…”等注入特征。
提示词审查机制:在提示词构造后进行语义分析,识别可能的角色切换、指令覆写。
响应行为监控:监控输出是否越权,如输出系统不允许的内容,可触发告警或拒答。
使用上下文分离机制:通过系统-用户分段处理,防止用户内容污染系统 prompt。
Q24:在没有推理模型之前,如何让模型先思考后回答?思维链、自洽性、思维树等几种技术各有什么优缺点?
在没有推理能力前,如何让模型“先思考后回答”?
通过提示词工程引导模型“思考”,即在 prompt 中显式要求模型列出推理过程,如加上:
-
"请一步步思考再作答"(思维链)
-
"请验证你的答案是否与前提一致"(自洽性)
-
"请考虑多种可能情况,再做判断"(思维树)
Q25:如何保证模型的输出一定是合法的 JSON 格式?将大模型用于分类任务时,如何保证其输出一定是几个类别之一,而不会输出无关内容?如果开发一个学习英语的应用,如何确保其输出的语言始终限定在指定的词汇表中?
如何保证输出是合法 JSON 格式?
结构化提示词:明确指令,如:“请仅输出以下 JSON 格式:{"label": ..., "score": ...},不添加任何解释。”
使用函数调用(Function Calling / Tool Use)机制:如 OpenAI / Qwen 支持结构化 schema,让模型输出严格符合预定义结构。
后处理校验:使用 JSON 解析库进行合法性校验,不合法则重试生成或触发 fallback 策略。
分类任务中如何约束输出为限定类别?
封闭式提示设计:明确说明“只允许从以下选项中选择一个:A、B、C”。
Few-shot 示例引导:通过提供标准分类示例(如“输入:... → 输出:B”)提高一致性。
输出校验与纠偏:使用正则或解析器判断输出是否合法,不合法时触发二次问答或重新生成。
可选:使用 Logits Bias / 多标签 token sampling 控制输出 token(限 API 层实现)
英语学习应用中如何限制词汇范围?
词汇表内提示约束:在提示中加入说明:“请仅使用以下词汇表中的单词作答”,并附上词表。
使用词表检索后重写(Constrained decoding):结合规则或重写策略,将非词表内词替换或拒答。
训练或微调阶段加入词表限制示例:增强模型对“词汇边界”的理解。
结合语法校正模块二次过滤:检测并剔除越界词汇。
Q26:如果我们需要生成小说的标题、角色描述和故事梗概,当单次模型调用生成效果不佳时,如何分步生成?
可以采用分步生成策略,分阶段控制质量与连贯性:
分步流程设计:
-
Step1:生成小说主题或关键词
-
Step2:基于主题生成小说标题
-
Step3:根据标题设定角色
-
Step4:生成故事梗概
优点:
-
更高控制力:每步可加入人工或规则约束,确保输出质量。
-
提升上下文一致性:逐步构建世界观,避免信息混乱。
-
易于纠错与重试:某一步生成不佳时,仅重试该步。
Q27:如果用户跟模型对话轮次过多,超出了模型的上下文限制,但我们又希望尽可能保留用户的对话信息,该怎么办?
信息摘要:对早期对话进行摘要压缩,保留核心内容,如用户目标、偏好、历史提问等。
结构化记忆:将对话转为结构化格式存入外部 memory,后续构建 prompt 时引用这些结构化内容,而非逐轮堆叠原始对话。
轮次截断:固定保留最近 N 轮对话,加上摘要或记忆,构成上下文窗口。
外部记忆+RAG 机制:将历史对话存入向量数据库,用户提问时检索相关历史片段,再拼接进 prompt
Q28:如何编写一个智能体,帮助用户规划一次包含机票预订、酒店安排和景点游览的旅行?需要配置哪些工具?如何确保系统在面对不完整或矛盾的信息时仍能提供合理建议?
采用基于工具调用的智能体架构
用户输入 → 智能体分析任务意图 → 规划任务流程 → 多工具调用 → 整合回复结果
方法:
利用 LLM 分析用户输入中缺失的关键信息(如日期、预算、偏好),主动进行“反问式追问”
设定默认值与容错机制,未指定预算则设定默认中档;未指定具体日期,则提示最近可用时间段。
多轮规划修正能力,使用 ReAct 思维链提示结构,支持思考—行动—观察—再决策循环,自动纠偏
Q29:如果单一智能体的提示词过长,导致性能下降,如何将其拆分为多个智能体,并在合适的时机调用不同的智能体?
当单一智能体的提示词过长,影响性能时,我会采用“模块化智能体架构”解决,具体如下:
功能拆分:将大智能体按功能划分为多个子智能体,例如:行程规划、机票预订、酒店推荐等,每个子体负责单一任务,提示词更短、聚焦。
主控调度器:设计一个主控 Agent 作为“路由器”,根据用户请求类型或上下文意图,动态调用对应子体。例如:识别“订酒店”意图后,调用酒店智能体。
上下文共享:通过共享存储(如 Memory 模块)或摘要传递,实现子体间信息协同,避免重复问询。
提示词压缩:对每个子体使用结构化提示+嵌入指令压缩技术,确保上下文长度控制在合理范围内。
这种方式能提升系统响应效率、增强可维护性,并保持智能体的扩展性。
Q30:在 RAG 中,为什么要把文档划分成多个块进行索引?如何解决文档分块后内容上下文缺失的问题?如何处理跨片段的依赖关系?
在 RAG 中,将文档划分为多个块是为了提高召回精度和效率,避免整篇文档过长导致嵌入不准确或超出上下文长度限制。
为解决分块后的上下文缺失问题,我通常采用以下策略:
-
滑动窗口分块:使用一定重叠率的滑窗分块,保留前后句的上下文信息,减少语义割裂。
-
块内结构优化:结合标题、段落、位置等结构信息,将语义强相关的内容聚为一块。
跨片段依赖处理:
-
多块召回:允许模型检索多个相邻片段,并在生成阶段融合;
-
块间链接:建立块与块之间的逻辑引用,例如使用链式召回或构建知识图谱辅助。
通过这些方式,RAG 系统能在保持检索效率的同时,尽量还原原始文档的上下文完整性。
文章略长,下半部分请继续看下一篇文章!!!
THE END !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。