
一年一度的秋招季又到了身边不少师弟师妹问我第四范式的自然语言处理岗笔试到底考什么、难度如何、该怎么准备。说实话第四范式的NLP笔试在AI独角兽里算是很有代表性的不偏门、不炫技但覆盖面广基础考察极其扎实同时又带一点企业级应用的味道。我当时做这套题的时候最深的感受是它不像某些公司那样堆一堆最新论文里的冷门细节而是踏踏实实考你“能不能上手干活”的基本功。今天我就把这道笔试题掰开揉碎从考点拆解到解题思路再到备考方向一次性讲清楚。无论你是正在准备秋招的应届生还是想系统自查NLP基础的从业者这篇文章都值得你花十分钟认真看完。1. 笔试前的信息收集先搞清楚第四范式到底考什么1.1 第四范式的技术底色与岗位定位在聊具体题目之前我个人觉得有必要先说说第四范式这家公司的技术风格因为这直接决定了笔试的出题倾向。第四范式做的是企业级AI平台核心方向是机器学习平台、AutoML、迁移学习、决策智能这些偏工业落地的领域。这和纯研究院风格的公司有明显区别它不至于考你“某个Transformer变体的Flash Attention具体怎么实现”这种极度前沿的细节但一定会考你对模型底层原理、工程实现、效果评估这些“真干活要用的东西”是否熟练。自然语言处理岗位放在这样的公司里定位也很清晰不是单纯做 research而是要把 NLP 能力落地到金融、零售、制造等场景里比如文本分类、实体抽取、相似度匹配、智能客服、文档结构化这些方向。所以笔试里出现的题目往往都带着“实用性”的标签。这点大家在备考时要特别留意纯粹背概念不足以应付要能理解每个模型解决什么问题、在什么场景下选型、成本多少。1.2 NLP笔试题的考察范围画像第四范式 NLP 笔试题的题型结构我做的时候大概是这么几类选择题包括单选和多选、简答题、手推公式题、编程题。整体考察范围可以分成四大块机器学习基础模型评估指标、损失函数、正则化、偏差方差、经典模型原理LR、SVM、决策树等深度学习基础与 NLP 专项词向量、RNN/LSTM、Attention、Transformer、BERT 等预训练模型以及NER、文本分类、语义匹配等典型任务数学基础概率论、信息论、矩阵求导相关内容通常融合在模型推导里考编程能力用 Python/C 实现算法题考察数据结构和基本编码能力这个画像和很多大厂的 NLP 岗笔试是重合的但第四范式有几个侧重点一是对机器学习基础的考察比例明显偏高尤其是模型评估和损失函数这类“日常调参会用到”的内容二是手推公式的题目占比不小三是部分题目会结合具体业务场景要求你给出方案设计。如果你只刷了深度学习不重视传统机器学习基础可能会在选择题上吃不少亏。2. 机器学习基础NLP岗位绕不开的底盘2.1 模型评估指标不只是背公式要懂怎么选第一类高频考点是模型评估。NLP 任务里最常见的评估指标就是精确率Precision、召回率Recall、F1、准确率Accuracy以及 ROC 曲线和 AUC。笔试里通常不会只让你写公式而是会给你一个具体场景问你应该关注哪个指标。我记得有一道题差不多是这么出的在一个信用卡欺诈识别的场景里正样本欺诈占比极低模型A的准确率是99%但欺诈召回率只有20%模型B的准确率是97%欺诈召回率是85%。问哪个模型更好说明理由。这类题核心考的就是“类别不平衡下准确率的误导性”。正确答案肯定是模型B因为在欺诈识别场景里漏掉欺诈的代价远大于误伤正常样本。另一个常考的点是 ROC 曲线和 AUC 的性质。比如问你AUC0.5 代表什么AUC 对类别不平衡敏感吗ROC 曲线和 PR 曲线在什么情况下选择哪个更合适这里要记住几个关键结论AUC0.5 说明模型等同于随机猜测AUC 对类别不平衡相对不敏感因为它是按排序计算的但当正样本非常稀少时PR 曲线比 ROC 曲线更能反映模型性能。这个知识点在实际业务里也特别常用做文本分类时如果类别分布极不均衡看 PR 曲线几乎是标配操作。2.2 损失函数与优化交叉熵为什么是NLP的默认选择损失函数这块交叉熵几乎是必考内容。至少要能回答这么几个层层递进的问题交叉熵的公式怎么写为什么分类任务用交叉熵而不是均方误差MSE二分类交叉熵和多分类交叉熵有什么区别先说说公式。二分类的交叉熵是L -[y·log(p) (1-y)·log(1-p)]。多分类的交叉熵则是 L -Σ y_i·log(p_i)其中 y_i 是 one-hot 标签的第 i 位p_i 是模型预测第 i 类的概率。这个公式要能默写还要能解释它的含义当模型对正确类别的预测概率越接近1时损失越小越接近0时损失趋于无穷大。一句话概括就是“对错误预测的惩罚力度是超线性的”。至于为什么分类用交叉熵而不用 MSE可以从两个角度回答。第一个角度是梯度如果最后一层是 sigmoid/softmax配合 MSE 损失求导后梯度里会出现 sigmoid 导数的因子而 sigmoid 在两端饱和时导数接近0会导致梯度消失模型学不动交叉熵和 softmax 组合求导后梯度形式是 (p - y)非常干净不会因为预测值极端而导致梯度消失。第二个角度是概率解释交叉熵本身就是在衡量两个概率分布之间的差异和分类任务的本质更匹配。面试官如果追问“那回归任务呢”你要能接上“回归任务用 MSE 更合适因为它的输出是连续值且 MSE 在高斯噪声假设下等价于极大似然估计”。2.3 经典模型手推朴素贝叶斯与逻辑回归的细节第四范式的笔试里有一类题是让你手推经典模型的推导我遇到的至少有两道一道是朴素贝叶斯分类器另一道是逻辑回归。朴素贝叶斯那道题会给一组训练数据每个样本有几个离散特征然后让你计算某个新样本属于各类别的后验概率并给出分类结果。这里核心考点有两个一是条件独立性假设的公式展开即 P(X|Y) P(x1|Y)·P(x2|Y)·...·P(xn|Y)二是拉普拉斯平滑。很多人在计算时容易忘记平滑项导致某些特征在训练集中没出现过时概率直接为0。拉普拉斯平滑就是在每个计数上加一个α通常取1公式是 P(xi|Y) (count(xi, Y) α) / (count(Y) α·V)其中 V 是特征取值总数。这道题算分点很细每一步都要写清楚计算过程别跳步。逻辑回归那道题则更偏推导。给定损失函数是交叉熵要你写出参数更新的梯度表达式。核心就是要会求 softmax 或 sigmoid 下的梯度最后导出 w 的更新公式w w - η·(p - y)·x。这里有个容易出错的点对 sigmoid 函数求导时σ(z) σ(z)·(1-σ(z))很多人写到这一步就卡住了。建议大家备考时把 sigmoid、softmax、交叉熵组合的梯度推导过一遍做到能不看笔记独立推完。这不仅是笔试需要面试手撕代码环节也经常问。3. NLP专项考察从词向量到预训练模型3.1 文本表示TF-IDF、word2vec与BERTNLP专项题目里文本表示的发展脉络是个绕不开的考点。笔试常常会对比 TF-IDF、word2vec、BERT 这三种表示方式的原理和适用场景。TF-IDF 的核心是一个公式TF-IDF(t, d) TF(t, d) × IDF(t)。IDF 的常见形式是 log(N / (1 df(t)))其中 N 是文档总数df(t) 是包含词 t 的文档数。考点通常集中在IDF 的作用是什么为什么需要加平滑防止分母为0TF-IDF 的局限性是什么无法捕捉语义信息只是词频统计有一道题我记得特别清楚给了两篇文档的词频统计表让你手工计算某个词的 TF-IDF 值。这种题只要公式记得住、log 计算别出错基本是送分题。但就怕你把 IDF 的 log 底数搞混一般题目里会说明没说就用自然对数 e 为底。word2vec 考察集中在两种架构的区别CBOW 和 Skip-gram。CBOW 用上下文词预测中心词Skip-gram 用中心词预测上下文词。考选择时问你“在大规模语料下哪个架构对生僻词更友好”答案是 Skip-gram因为 Skip-gram 对每个词都会单独作为中心词进行训练生僻词也能得到充分更新CBOW 则会把上下文词向量平均导致生僻词的信号被稀释。另外还有一个高频考点负采样Negative Sampling的作用。它把原本是 Vocabulary 大小的 softmax 多分类问题转化为二分类问题极大降低了计算量。词向量这块深度学习的基本功笔试几乎必考。BERT 相关的题主要考察它的预训练任务Masked Language ModelMLM和 Next Sentence PredictionNSP。我遇到的一道题是如果下游任务是文本分类用 BERT 做句子表示时[CLS] token 的输出为什么不完全等价于全句语义表示这题其实考的是对 BERT 结构的理解BERT 输出不是句子级向量[CLS] 位置的输出经过多层 Transformer 编码后融合了全局信息但它不是专门为语义相似度设计的所以做语义匹配任务时用 [CLS] 往往不如用句子内所有 token 输出的池化或直接用 Sentence-BERT 这类专门模型效果好。3.2 序列标注HMM与CRF的理论细节序列标注题在第四范式的 NLP 笔试题里占的分量不小毕竟是词性标注、命名实体识别这些任务的基础。HMM 和 CRF 的对比是经典考点几乎每年都会以某种形式出现。HMM 的核心是五元组状态集合、观测集合、初始状态概率、状态转移概率、观测发射概率。它的三个基本问题要能说出来概率计算问题前向算法/后向算法、解码问题Viterbi 算法、学习问题Baum-Welch 算法。笔试一般不会让你完整推导前向算法但会考你 Viterbi 的动态规划思想维护每个状态在每一步的最大概率路径最终回溯得到最优状态序列。这里有个关键理解Viterbi 是动态规划问题最优路径的局部也是最优的因为状态转移满足马尔可夫性。CRF 的考点就更细一些尤其是它的特征函数机制。线性链 CRF 的形式是 P(Y|X) exp(Σ_k λ_k f_k(y_i, y_{i-1}, X, i)) / Z(X)其中 Z 是配分函数。笔试或面试官很喜欢问HMM 和 CRF 的本质区别是什么答案的关键是HMM 是生成式模型对联合概率 P(X, Y) 建模且强假设观测之间条件独立CRF 是判别式模型直接对条件概率 P(Y|X) 建模可以灵活设计任意特征函数不要求特征之间独立。用一句话概括HMM 是“先建模数据怎么生成再求状态”CRF 是“直接学条件概率特征可以随意组合”。这也是为什么在 NER 任务上 CRF 通常优于 HMM 的原因。我当时备考时花了不少时间手推了一遍 Viterbi 算法事实证明很值得。因为笔试里不仅可能出概念题还可能给你一个具体的状态转移图让你手工模拟 Viterbi 的递推过程。这种题目只要理解动态规划表的填充逻辑就能一步步写出来。建议大家在考前至少手算一遍。3.3 注意力机制与Transformer从原理到细节Attention 和 Transformer 基本是 NLP 笔试的“必考大题”难度从概念到细节都有覆盖。最基础的是 Attention 的计算公式Attention(Q, K, V) softmax(QK^T / √d_k) V。考选择题时经常问为什么要除以 √d_k答案是为了防止 QK^T 的点积结果过大导致 softmax 梯度极小除以 √d_k 本质上是做缩放让点积结果的方差保持在可控范围。Transformer 的多头注意力Multi-Head Attention也是一个高频考点。它先把 Q、K、V 分别线性变换成 h 个子空间表示然后分别做注意力计算最后 Concat 拼起来再投影。这里要能说清楚多头注意力的意义不同头可以关注不同的信息比如有的头关注句法关系有的头关注指代关系相当于给模型多个“视角”。笔试如果考简答你可以从“多视角并行计算不同的特征子空间”这几个角度作答。更深的考察是 Transformer 的位置编码。原版 Transformer 用的是三角函数位置编码PE(pos, 2i) sin(pos / 10000^(2i/d))PE(pos, 2i1) cos(pos / 10000^(2i/d))。需要理解为什么要加位置编码因为 self-attention 本身是置换不变的并行计算时没有天然的序列顺序信息必须显式注入位置信息。有些选择题会问“正余弦位置编码和可学习位置编码如 BERT 用的哪个更好”这题没有绝对标准答案但要知道可学习位置编码在面对超长序列时的外推性较差而正余弦编码能处理一定程度的长度外推。第四范式笔试里还出现过一道综合题大概意思是在 Transformer 编码器中为什么每个 sublayer 都要做 LayerNorm 和残差连接这个考点要答出两点残差连接缓解深层网络梯度消失和退化问题LayerNorm 稳定训练。还要提一下为什么用 LayerNorm 而不是 BatchNorm——NLP 里序列长度不固定BatchNorm 在小 batch 上统计均值和方差不稳定而且它沿着 batch 维度做归一化会引入 batch 内样本间的依赖LayerNorm 沿着特征维度做归一化跟样本和序列长度无关更适合 Transformer。这个细节能答出来面试官会觉得你是真懂原理而不是背了层数。4. 编程与手推题笔试的真正分水岭4.1 算法题的考察倾向基础为主兼顾场景编程题方面第四范式给的时长不算特别宽裕所以算法题的难度设置是“进阶但不过分”。我印象里有一道题非常典型给定一个字符串数组要求找出出现频率最高的前 K 个单词并按频率降序、字典序升序输出。这题本质是“Top K Frequent Words”LeetCode 上也有原题核心解法是哈希表统计 堆优先队列排序时间复杂度 O(n·log k)。这种题考察两点一是基础数据结构的熟悉程度二是对 Java/Python 标准库的掌握。做这种题我有个建议不要一上来就手写堆先用语言自带的优先队列接口把想法写出来如果时间剩余再优化。笔试时间有限能跑通拿满分才是目标。另外第四范式的编程题环境是 ACM 模式也就是要自己处理输入输出跟 LeetCode 核心函数模式不一样。很多人第一次接触会栽在 input() 和 sys.stdin.readline() 的处理上。建议考前一定要去牛客网练几道 ACM 模式的题熟悉读一行整数、读一行字符串、循环读到 EOF 这些基础操作。还有一类编程题会结合 NLP 场景出比如给定两个字符串计算它们的编辑距离Levenshtein Distance并输出最小操作次数。这道题在很多 NLP 岗的面试中出现率极高笔试也容易考。核心是二维动态规划dp[i][j] 表示 s1 前 i 个字符和 s2 前 j 个字符的编辑距离状态转移方程是当 s1[i-1] s2[j-1] 时 dp[i][j] dp[i-1][j-1]否则 dp[i][j] 1 min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])。要注意初始化边界条件dp[0][j] jdp[i][0] i代表空串到非空串的插入/删除代价。这类题一写出来就知道你代码功底和 DP 基础是否扎实。4.2 手推题交叉熵反向传播的完整推导手推题是第四范式笔试里比较有区分度的部分。除了前面提到的朴素贝叶斯和逻辑回归我印象里还有一道交叉熵反向传播的推导题难度中上但非常经典。题目大致是一个两层的神经网络输入 x隐层激活函数是 ReLU输出层是 softmax损失函数是交叉熵要求写出反向传播过程中每一层的梯度更新公式。做这类题有一个固定的框架前向传播定网络结构 - 计算损失对输出的梯度 - 通过链式法则逐层往回推 - 整理成矩阵表达。关键的几个步骤隐层输出是 h ReLU(W1·x b1)输出层 logits 是 z W2·h b2概率是 p softmax(z)。损失 L 对 z 的梯度有经典的简洁形式∂L/∂z p - y其中 y 是 one-hot 标签。这个结果是因为 softmax 交叉熵组合的导数正好是“预测值减真实值”推导过程其实涉及 Jacobian 矩阵和 softmax 导数的巧妙化简你要能独立推导一遍。拿到 ∂L/∂z 之后继续往回求 ∂L/∂W2 (∂L/∂z)·h^T∂L/∂b2 ∂L/∂z。然后计算 ∂L/∂h W2^T·(∂L/∂z)再乘上 ReLU 的导数z0 时为1z≤0 时为0得到 δ_h。最后 ∂L/∂W1 δ_h·x^T∂L/∂b1 δ_h。这就是一个完整的全连接网络反向传播。写题时要注意矩阵的维度一定要标清楚很多阅卷老师在意这个ReLU 导数是逐元素相乘和矩阵乘法不要混在一起。这类手推题没别的技巧就是考前多练。我备考时把“线性层 - BN - ReLU - Softmax - 交叉熵”这条链路的梯度推了三遍以上确保任何一步被突然提问都能迅速反应。你如果时间紧至少要推一遍二分类交叉熵加 sigmoid 输出的梯度、多分类交叉熵加 softmax 的梯度、以及一层隐藏层的反向传播。5. 做题策略与时间分配别在难题上耗死5.1 选择题控制在40分钟内先易后难整套卷子时间大概是90到120分钟题目量不小。我最想提醒的一点是选择题千万不要过度纠结。第四范式的选择题有些是多选选项之间的干扰性很强往往两个选项看起来都对但实际上有一个更精确。这种题如果超过两分钟还拿不准先果断标记继续往下做把简答和编程题的时间留足。一个我自己总结的做题顺序是选择题快速过遇到不确定的标记不恋战- 简答题文字输出先搭框架- 手推题需要思路清晰趁状态好- 编程题最后留充足时间调试。之所以把编程题放最后是因为它最容易出现“调Bug 半小时”的意外需要有完整的时间块。但每个人习惯不同如果你代码能力很强、文字表达弱一些也可以先把编程题做完。关键是要清楚自己哪部分拿分最有把握先拿稳。5.2 简答题的答题框架定义-原理-场景简答题占分很高且是拉开差距的地方。我印象里有一道简答题是请比较 word2vec、ELMo、BERT 三者在词表示上的区别。这种题如果只是堆名词肯定拿不到高分。我提供一个比较通用的答题框架第一步分别定义第二步指出核心区别第三步给场景选型建议。以这道为例核心区别有三层word2vec 是静态词向量训练好后每个词只有一个固定向量无法解决一词多义ELMo 基于双向 LSTM能够根据上下文动态生成词表示但它是基于 LSTM 的序列建模长距离依赖能力有限BERT 基于 Transformer通过 MLM 预训练能捕捉更深层的双向上下文信息。最后补上选型建议如果任务是短文本、资源有限、对语义要求不高word2vec 就够用如果强调一词多义和上下文动态词义选择 ELMo 或 BERT如果追求效果上限且算力充足直接用 BERT 家族。这个框架同样适用于其他简答题比如“比较 LSTM 和 GRU”“Attention 的作用是什么”“如何解决文本分类中的类别不平衡问题”。我的建议是答简答题时要先给结论再列理由最后举一个具体场景收尾。这样写阅卷人一眼就能抓到你的逻辑。5.3 主观方案设计题展示系统思维第四范式的题目里还有一类比较有意思的方案设计题。大致是给你一个业务场景比如“电商平台的用户评论情感分析”要求你给出从数据到模型到上线评估的完整方案。这种题没有标准答案考察的是你能不能完整地思考一个 NLP 项目。我的答题套路分五步走数据说明数据来源、标注方式、类别体系以及标注质量如何把控交叉标注、计算 Kappa 系数预处理文本清洗、分词、去停用词、处理 emoji 和网络用语考虑是否要做数据增强同义词替换、回译等建模给出候选方案从简单到复杂。先上 TF-IDF LR 做 baseline再试 FastText再到 BERT fine-tune。说明每个方案的时间和效果预期评估明确离线评估指标F1、AUC、混淆矩阵以及线上评估方法A/B test迭代分析错误案例循环优化最后再补一句如果成本受限线上用蒸馏后的小模型如果准确率优先直接上预训练模型。这套答题结构能把你和只会写“用 BERT 做分类”的应聘者区分开阅卷人会觉得你是有工程经验的人。6. 复盘与避坑那些我踩过的坑和总结经验6.1 知识点准备上的几个盲区我笔试结束后复盘发现自己有几个地方准备不足差点丢分。第一个是 CRF 的细节特征函数。我当时只准备到“CRF 比 HMM 好”这种层面但实际题目会深入到特征函数如何定义、如何训练所以还是要把线性链 CRF 的公式和训练目标过一遍。第二个盲区是信息论基础。有一道选择题涉及信息熵、交叉熵、KL 散度之间的关系选项设置得比较复杂。公式 P 和 Q 的 KL 散度是 Σ P log(P/Q)交叉熵是 Σ P log(1/Q)信息熵是 Σ P log(1/P)。三者满足关系交叉熵 信息熵 KL 散度。如果你对这个关系不够清晰很容易选错。建议这种“一句话公式类”的知识点整理成一个速查表考前过一遍效率很高。第三个盲区是各种误差分析。偏差-方差分解、Bagging 和 Boosting 分别减少哪类误差这类题目容易出现在选择题前几道。记住结论就好Bagging 主要减少方差Boosting 主要减少偏差。但不要只背结论最好能理解背后的逻辑Bagging 对多个模型的预测取平均显然降低了波动Boosting 是逐步拟合残差重点在于提高模型拟合能力。6.2 笔试现场的应试细节说到现场应试有几个非常实用的小技巧想分享。第一多选选择题如果不确定宁可少选不要多选。很多公司的多选规则是“少选得部分分多选或错选不得分”。虽然不确定第四范式每场是否都能这样但国内不少公司都类似策略上保守一些更稳。第二手推题的每一步都要写清楚公式推导和文字说明不要把几行公式扔在那里就完事。阅卷是按步给分的哪怕最后结果错了过程正确也能拿大部分分数。我见过很多考生结果算对但跳步严重反而被扣了过程分。第三编程题写完一定要自己再构造几个测试用例跑一遍特别是边界情况空数组、只有一个元素、全是相同元素、输入包含空格和特殊字符。我当年就是少测了一个“空输入”的用例导致一个隐形 bug 没有发现浪费了不少时间。第四由于是线上笔试提前确认好网络环境和编译器环境。第四范式用的评测系统支持的 Python 版本和库范围最好提前了解有的系统不支持某些第三方库如果你代码里 import 了一个不支持的库整个题就废了。6.3 考后反思这套题给求职者的长期价值说实话四年后再回看这套笔试题我觉得它不仅仅是一次筛选更像是一次高质量的知识体检。它覆盖的知识点都是 NLP 工程师日常工作中真正要用到的做文本分类得会看 P/R/F1做序列标注得理解 CRF 的机制做语义匹配得懂得怎么选预训练模型上线模型得会算损失函数的梯度来调优。如果你准备明年或者后年秋招我的建议很明确不要盲目追新模型。把机器学习基础、NLP 核心模型、数学推导这三块地基打牢效果远好于囫囵吞枣看十篇 Transformer 的变体论文。第四范式这套题恰好就是一个很好的备考清单你按这个清单去准备覆盖到的知识面会非常广。笔试只是求职第一关后面还有面试。我个人的体会是笔试考的是“你会不会”面试考的是“你能不能讲清楚为什么”。所以笔试阶段的笔记和推导过程不要丢面试前拿出来复习很多内容可以直接复用到讲项目经历、手撕代码和白板推导环节。这套题的整体难度放在当年的秋招里属于中等偏上但它考察的方向非常合理直到现在我都觉得它值得每个做 NLP 的求职者认真刷一遍。