/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
2026 年,AI 行业已经从"会调参就能拿 offer"的时代,进化到了"既要懂大模型,又要懂工程落地"的阶段。面试考察范围越来越广:从传统的 ML/DL 基础,到 LLM 原理、RAG 架构、Prompt Engineering、模型微调,再到工程化部署。
这篇文章把 AI 算法面试的完整流程拆成 准备 → 简历 → 笔试 → 技术面 → HR 面 五个阶段,每个阶段都给出具体的备考策略和真题示例。
一、面试全流程概览
AI 算法岗的面试通常经历以下环节:
投递简历 → 在线笔试/测评 → 一面(基础+手撕代码) → 二面(项目深挖+场景题) → 三面(系统设计+综合能力) → HR面 → Offer
| 笔试 | 90-120分钟 | 算法题+ML基础选择题 | 约60% |
| 一面 | 45-60分钟 | 基础八股+手撕代码 | 约40% |
| 二面 | 45-60分钟 | 项目深挖+场景设计题 | 约30% |
| 三面 | 30-45分钟 | 系统设计+职业规划 | 约20% |
| HR面 | 20-30分钟 | 稳定性+沟通能力 | 约10% |
二、简历准备
2.1 简历结构
一份合格的 AI 算法简历应包含以下模块:
1. 基本信息(姓名、学历、联系方式、GitHub/个人主页)
2. 教育背景(学校、专业、GPA、核心课程)
3. 专业技能(编程语言、框架、领域知识)
4. 实习/工作经历(STAR法则描述)
5. 项目经历(重点,至少2-3个)
6. 论文/竞赛/开源贡献(加分项)
2.2 项目描述模板(STAR 法则)
【项目名称】基于 RAG 的企业知识库问答系统
– Situation(背景):公司内部文档超过 10 万份,员工检索效率低
– Task(任务):设计一套基于 LLM 的智能问答系统
– Action(行动):
– 使用 LangChain 框架搭建 RAG 管线
– 对文档进行语义分块(chunk size=512, overlap=64)
– 使用 BGE-M3 生成 Embedding,存入 Milvus 向量数据库
– 接入 Qwen2.5-72B 作为生成模型,设计 Re-rank 策略
– 实现多轮对话记忆和来源溯源功能
– Result(结果):
– 检索准确率提升至 89%(人工评估)
– 平均响应时间 < 3秒
– 系统已上线服务 500+ 员工
2.3 技能描述规范
❌ 错误写法:
熟悉 Python,了解机器学习,会用 PyTorch
✅ 正确写法:
– 编程语言:Python(5年)、C++(2年)、SQL
– 深度学习框架:PyTorch、HuggingFace Transformers、LangChain
– 机器学习:熟悉 CNN/RNN/Transformer 架构原理,有 BERT/GPT 模型微调经验
– 大模型:了解 LoRA/QLoRA 微调、RAG 架构设计、Prompt Engineering
– 工程能力:Docker、FastAPI、Milvus、Redis
– 竞赛:Kaggle 银牌(Top 5%)
三、笔试备考
3.1 笔试题型分布
| 算法编程题 | 40% | LeetCode Medium | 重点刷 Hot 100 |
| 机器学习选择题 | 25% | 中等 | 刷面经+西瓜书 |
| 数学/概率题 | 15% | 中等 | 概率论基础 |
| 深度学习选择题 | 10% | 中等偏难 | 花书+论文 |
| 大模型选择题 | 10% | 较新 | 关注最新论文 |
3.2 算法题高频考点
AI 岗笔试算法题和后端岗侧重点不同,更偏向以下方向:
高频 Top 10 算法类型:
1. 二叉树遍历/操作(DFS/BFS)
2. 动态规划(背包、最长子序列)
3. 排序算法(快排、归并、堆排)
4. 二分查找及变体
5. 字符串匹配(KMP、Trie 树)
6. 图的遍历(最短路径、拓扑排序)
7. 滑动窗口
8. 回溯法(全排列、组合)
9. 栈/队列应用
10. 矩阵运算(模拟计算过程)
经典真题示例:
# 题目:给定一个无序数组,找到其中第 K 大的元素
# 要求:时间复杂度优于 O(nlogn)
import heapq
def find_kth_largest(nums, k):
"""
使用小顶堆,维护大小为 K 的堆
时间复杂度:O(nlogk),空间复杂度:O(k)
"""
heap = []
for num in nums:
heapq.heappush(heap, num)
if len(heap) > k:
heapq.heappop(heap)
return heap[0]
# 测试
nums = [3, 2, 1, 5, 6, 4]
k = 2
print(find_kth_largest(nums, k)) # 输出: 5
3.3 ML 基础选择题高频知识点
1. 偏差与方差的权衡关系
2. L1/L2 正则化的区别(稀疏性)
3. 交叉熵 vs 均方误差的适用场景
4. 梯度消失/梯度爆炸的原因和解决方案
5. Batch Normalization 的原理和作用
6. Dropout 的训练/推理模式区别
7. Adam 优化器 vs SGD 的对比
8. SVM 的核函数选择
9. 决策树剪枝策略
10. 过拟合的判断和应对方法
四、技术一面:基础八股 + 手撕代码
4.1 机器学习基础高频题
Q1:解释偏差-方差分解
偏差(Bias):模型预测值的期望与真实值之间的差异
→ 衡量模型的拟合能力
→ 高偏差 → 欠拟合
方差(Variance):模型在不同训练集上预测结果的变化范围
→ 衡量模型对数据扰动的敏感度
→ 高方差 → 过拟合
总误差 = 偏差² + 方差 + 不可约误差(噪声)
| 模型复杂度 | 偏差 | 方差 |
|———–|——|——|
| 太简单 | 高 | 低 |
| 适中 | 低 | 适中 |
| 太复杂 | 低 | 高 |
应对策略:
– 高偏差 → 增加模型复杂度、增加特征、减少正则化
– 高方差 → 增加训练数据、减少模型复杂度、增加正则化、Dropout
Q2:L1 和 L2 正则化的区别
L1 正则化(Lasso):L = L0 + λ * Σ|wi|
– 产生稀疏解(部分权重为0)
– 可用于特征选择
– 不可导(在0点),需要次梯度或软阈值
L2 正则化(Ridge):L = L0 + λ * Σ(wi²)
– 不产生稀疏解,但权重趋近于0
– 可导,优化更稳定
– 对大权重惩罚更大
为什么 L1 产生稀疏解:
几何解释:L1 约束区域是菱形,最优解常在顶点(坐标轴上)
概率解释:L1 对应拉普拉斯先验,L2 对应高斯先验
Q3:解释梯度下降的变体
| BGD(批量) | 全部训练集 | 稳定、全局最优 | 慢、内存大 |
| SGD(随机) | 单个样本 | 快、可跳出局部最优 | 震荡大 |
| MBGD(小批量) | 一小批样本 | 平衡速度和稳定性 | 需调 batch size |
优化器演进路线:
SGD → Momentum → Nesterov → AdaGrad → RMSProp → Adam → AdamW
Adam 公式:
# Adam 优化器伪代码
m = 0 # 一阶矩估计
v = 0 # 二阶矩估计
beta1, beta2 = 0.9, 0.999
eps = 1e-8
for t in range(1, max_iter + 1):
g = compute_gradient(params, data)
m = beta1 * m + (1 – beta1) * g # 一阶矩
v = beta2 * v + (1 – beta2) * g ** 2 # 二阶矩
m_hat = m / (1 – beta1 ** t) # 偏差修正
v_hat = v / (1 – beta2 ** t)
params -= lr * m_hat / (np.sqrt(v_hat) + eps)
4.2 深度学习高频题
Q4:解释 Transformer 的 Self-Attention 机制
核心公式:Attention(Q, K, V) = softmax(QK^T / √dk) * V
步骤分解:
1. 输入序列 X 经过三个线性变换得到 Q、K、V
Q = X * Wq, K = X * Wk, V = X * Wv
2. 计算注意力分数
scores = Q * K^T / √dk
(√dk 缩放防止内积过大导致 softmax 梯度消失)
3. softmax 归一化
attention_weights = softmax(scores)
4. 加权求和
output = attention_weights * V
Multi-Head Attention:
– 将 Q、K、V 分成 h 个头
– 每个头独立做 attention
– 拼接后线性变换
– 作用:让模型从不同子空间关注不同位置的信息
Q5:BERT 和 GPT 的核心区别
| 架构 | Transformer Encoder | Transformer Decoder |
| 注意力 | 双向(Bidirectional) | 单向(Causal/Masked) |
| 预训练任务 | MLM + NSP | 自回归语言建模 |
| 微调方式 | 加分类头微调 | Prompt/PEFT 微调 |
| 适用任务 | 理解类(分类、NER) | 生成类(对话、摘要) |
| 参数规模 | 通常百兆级 | 可达千亿级 |
4.3 大模型(LLM)高频题
Q6:LoRA 微调的原理
LoRA(Low-Rank Adaptation)核心思想:
不修改原始权重 W,而是学习一个低秩增量 ΔW = B * A
原始:h = W * x
LoRA:h = W * x + B * A * x
其中:
– W ∈ R^(d×k),原始权重(冻结不更新)
– A ∈ R^(r×k),降维矩阵,r << min(d, k)
– B ∈ R^(d×r),升维矩阵
– A 用高斯初始化,B 初始化为0(训练开始时 ΔW=0)
优点:
1. 训练参数量从 d*k 降低到 r*(d+k),大幅减少
2. 原始权重不变,可随时切换不同 LoRA
3. 效果接近全参数微调
QLoRA:
在 LoRA 基础上,将原始权重量化为 4-bit NF4
进一步减少显存占用,可在单卡上微调大模型
Q7:RAG 架构的核心组件
RAG(Retrieval-Augmented Generation)管线:
1. 文档处理
– 加载文档(PDF/Word/HTML)
– 文本分块(Chunking)
– 常用策略:固定大小分块 + overlap、按语义分块
2. 向量索引
– 使用 Embedding 模型(如 BGE、text-embedding-ada-002)
– 存入向量数据库(Milvus/Pinecone/FAISS)
3. 检索
– 用户 Query → Embedding → 向量相似度搜索
– 召回 Top-K 相关文档块
– 可选:Re-rank 重排序
4. 生成
– 将检索到的文档拼入 Prompt
– LLM 生成最终回答
– 可选:来源溯源、引用标注
常见问题与优化:
– 检索不准 → 换更好的 Embedding 模型、调整 chunk size
– 回答不相关 → 加 Re-rank、优化 Prompt
– 响应慢 → 缓存常见 Query、异步检索
4.4 手撕代码高频题
题目1:实现 Softmax 函数
import numpy as np
def softmax(x):
"""
数值稳定的 Softmax 实现
"""
# 减去最大值防止数值溢出
x_max = np.max(x, axis=–1, keepdims=True)
exp_x = np.exp(x – x_max)
return exp_x / np.sum(exp_x, axis=–1, keepdims=True)
# 测试
x = np.array([1.0, 2.0, 3.0])
print(softmax(x)) # [0.090, 0.245, 0.665]
print(sum(softmax(x))) # 1.0
题目2:实现交叉熵损失
import numpy as np
def cross_entropy_loss(y_pred, y_true):
"""
y_pred: softmax 后的概率分布, shape (N, C)
y_true: one-hot 标签, shape (N, C)
"""
eps = 1e-12 # 防止 log(0)
y_pred = np.clip(y_pred, eps, 1.0 – eps)
loss = –np.sum(y_true * np.log(y_pred)) / y_pred.shape[0]
return loss
# 测试
y_pred = np.array([[0.7, 0.2, 0.1], [0.1, 0.8, 0.1]])
y_true = np.array([[1, 0, 0], [0, 1, 0]])
print(f"Loss: {cross_entropy_loss(y_pred, y_true):.4f}")
题目3:实现 K-Means 聚类
import numpy as np
def kmeans(X, k, max_iter=100):
n, d = X.shape
# 随机初始化聚类中心
centroids = X[np.random.choice(n, k, replace=False)]
for iteration in range(max_iter):
# 分配步骤:每个点分配到最近的聚类中心
distances = np.linalg.norm(X[:, np.newaxis] – centroids, axis=2)
labels = np.argmin(distances, axis=1)
# 更新步骤:重新计算聚类中心
new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(k)])
# 收敛判断
if np.allclose(centroids, new_centroids):
print(f"收敛于第 {iteration} 次迭代")
break
centroids = new_centroids
return labels, centroids
# 测试
np.random.seed(42)
X = np.vstack([
np.random.randn(100, 2) + [5, 5],
np.random.randn(100, 2) + [–5, –5],
np.random.randn(100, 2) + [5, –5]
])
labels, centroids = kmeans(X, k=3)
print(f"聚类中心:\\n{centroids}")
五、技术二面:项目深挖 + 场景设计
5.1 项目深挖常见追问
面试官会围绕你简历上的项目进行"剥洋葱式"追问:
第一层:这个项目解决了什么问题?
第二层:你为什么选择这个技术方案?有没有考虑过其他方案?
第三层:具体的参数是怎么调的?调参依据是什么?
第四层:遇到了什么问题?怎么解决的?
第五层:如果数据量扩大 10 倍,你的方案需要怎么改?
第六层:如果不用这个方案,你会怎么做?
回答策略:
1. 先说结论,再展开细节
2. 展示你的思考过程("我一开始用了 A 方案,发现 B 问题是…所以换成了 C")
3. 量化结果("准确率从 82% 提升到 89%")
4. 诚实承认不足("这个方案在 XX 场景下确实有局限")
5.2 场景设计题示例
题目:设计一个智能客服系统,日均咨询量 50 万次
回答框架:
1. 需求分析
– 输入:用户文本/语音咨询
– 输出:准确、快速的自动回复
– 指标:准确率 > 90%、平均响应 < 2s、人工接管率 < 20%
2. 系统架构设计
用户 → API网关 → 意图识别 → 路由分发
├── FAQ 检索(向量匹配)
├── RAG 问答(LLM生成)
└── 人工转接(兜底)
3. 关键模块
a. 意图识别:BERT 微调分类器,区分 FAQ/RAG/人工
b. FAQ 模块:向量检索 + 精排
c. RAG 模块:文档分块 → Embedding → Milvus检索 → LLM生成
d. 缓存层:Redis 缓存高频问题的回答
e. 监控:回答质量评分、人工接管率、响应延迟
4. 性能优化
– 批量 Embedding 减少调用次数
– 异步队列处理非实时请求
– 模型量化部署降低推理成本
5. 数据飞轮
– 记录用户反馈(有用/无用)
– 定期更新 FAQ 库和文档库
– 持续优化意图识别模型
六、技术三面:系统设计
6.1 系统设计题框架
1. 澄清需求(5分钟)
– 业务场景:推荐系统/搜索/风控/对话?
– 数据规模:日活用户、请求量、数据量
– 延迟要求:实时/近实时/离线
2. 架构设计(10分钟)
– 画出系统架构图
– 说明数据流向
– 选择技术栈
3. 核心模块设计(15分钟)
– 特征工程
– 模型选择
– 训练流程
– 部署方案
4. 优化与扩展(5分钟)
– 性能瓶颈在哪
– 如何水平扩展
– 容灾与降级策略
6.2 经典系统设计题:推荐系统
需求:设计一个内容推荐系统,日活 1000 万
架构:
┌─────────┐ ┌──────────┐ ┌───────────┐
│ 用户端 │───→│ API 网关 │───→│ 召回服务 │
└─────────┘ └──────────┘ └─────┬─────┘
│
┌──────────────────┼──────────────────┐
│ │ │
┌─────┴─────┐ ┌───────┴──────┐ ┌───────┴──────┐
│ 协同过滤 │ │ 内容召回 │ │ 向量召回 │
│ (CF) │ │ (标签匹配) │ │ (Embedding) │
└─────┬─────┘ └───────┬──────┘ └───────┬──────┘
│ │ │
└──────────────────┼──────────────────┘
│
┌──────┴──────┐
│ 排序服务 │
│ (精排模型) │
└──────┬──────┘
│
┌──────┴──────┐
│ 重排服务 │
│ (多样性/去重) │
└──────┬──────┘
│
┌──────┴──────┐
│ 返回推荐列表 │
└─────────────┘
关键设计决策:
– 召回层:多路并行,目标是从百万级候选中召回千级
– 精排层:使用 DeepFM/DIN 等模型做 CTR 预估
– 重排层:加入多样性策略,避免信息茧房
– 特征工程:用户特征、物品特征、上下文特征、交叉特征
– 实时性:用 Flink 做实时特征更新
七、HR 面:职业规划与软技能
7.1 HR 面高频问题
| 为什么选择 AI 方向? | 展示对行业的认知和热情,结合自身经历 |
| 你的职业规划? | 短期→技术深耕,中期→独立负责项目,长期→技术专家/架构 |
| 最大的优点/缺点? | 优点给具体案例,缺点说真实但非致命的,并说明改进措施 |
| 为什么离职? | 不说前公司坏话,强调个人成长和平台匹配 |
| 期望薪资? | 给区间,参考市场行情,表达可协商 |
| 能接受加班吗? | 表达高效工作的态度,同时对合理加班表示理解 |
7.2 反问环节准备
面试结束前面试官通常会问"你有什么问题想问我的?"
好的反问:
1. 团队目前的技术栈和正在做的项目方向是什么?
2. 这个岗位前三个月的主要工作目标是什么?
3. 团队的技术氛围和成长机制怎么样?
4. 在 AI 大模型方向,团队接下来的技术规划?
避免的反问:
❌ 加班多吗?(显得不积极)
❌ 薪资能到多少?(留到谈 offer 时问)
❌ 面试能过吗?(显得不自信)
八、备考清单
8.1 知识点 Checklist
□ 机器学习基础
□ 线性回归/逻辑回归推导
□ 决策树/随机森林/XGBoost
□ SVM 核函数
□ K-Means/DBSCAN
□ 偏差-方差分解
□ 正则化(L1/L2)
□ 评估指标(Precision/Recall/F1/AUC)
□ 交叉验证
□ 特征工程方法
□ 深度学习
□ 反向传播推导
□ CNN(卷积/池化/感受野)
□ RNN/LSTM/GRU
□ Transformer/Self-Attention
□ BatchNorm/LayerNorm
□ 激活函数(ReLU/GELU/SiLU)
□ 优化器(SGD/Adam/AdamW)
□ 梯度消失/爆炸
□ 大模型
□ GPT/BERT/T5 区别
□ 预训练与微调流程
□ LoRA/QLoRA/Adapter
□ RLHF/DPO
□ RAG 架构
□ Prompt Engineering
□ 模型量化(INT8/INT4)
□ 位置编码(RoPE/ALiBi)
□ 工程能力
□ Python 并发/异步
□ Docker 基础
□ FastAPI 接口开发
□ 向量数据库使用
□ Git 版本控制
□ Linux 基础命令
□ 算法
□ LeetCode Hot 100
□ 排序算法手写
□ 动态规划经典题
□ 二叉树操作
□ 图的遍历
8.2 推荐学习资源
| 书籍 | 《机器学习》周志华(西瓜书) | ML 基础理论 |
| 书籍 | 《深度学习》花书 | DL 基础 |
| 书籍 | 《动手学深度学习》李沐 | 代码实践 |
| 课程 | 吴恩达机器学习/深度学习 | 入门 |
| 课程 | 李宏毅机器学习 | 深入 |
| 论文 | Transformer、BERT、GPT 系列 | 原理理解 |
| 论文 | LoRA、RAG、InstructGPT | 大模型前沿 |
| 刷题 | LeetCode Hot 100 | 笔试准备 |
| 面经 | 牛客网 AI 面经区 | 真题参考 |
| 实践 | HuggingFace 官方教程 | 动手能力 |
九、面试当天注意事项
面试前:
1. 提前 10 分钟进入会议室,测试设备
2. 准备纸笔用于推导和画图
3. 准备好 IDE/白板环境(如牛客在线编辑器)
4. 把简历放在手边,随时能翻到对应项目
面试中:
1. 听清问题再回答,不懂可以追问
2. 先说思路再写代码
3. 写完代码主动跑测试用例
4. 不会的题诚实说,不要硬编
5. 面试官提示时积极回应,展示学习能力
6. 保持自信但不傲慢
面试后:
1. 记录被问的问题和自己的回答
2. 复盘答得不好的题,查漏补缺
3. 如有 HR 联系方式,发一条感谢消息
十、常见面试陷阱
10.1 技术面陷阱
陷阱1:面试官问"你了解 XXX 吗?"
→ 如果不了解,直接说"不太了解"
→ 如果了解一点,说"了解一些,主要是…",不要过度承诺
陷阱2:面试官说"你觉得呢?"
→ 这通常意味着你的回答有问题,面试官给你纠正的机会
→ 重新思考,不要固执己见
陷阱3:手撕代码时一直沉默
→ 一定要边写边说思路
→ 即使卡住了也要说出你在想什么
陷阱4:项目细节记不清
→ 如果是好久之前的项目,面试前务必复习
→ 实在记不清,说"大概流程是…具体参数需要确认"
10.2 HR 面陷阱
陷阱1:被问"你还在面其他公司吗?"
→ 诚实回答,但可以说"贵公司是我的优先选择"
→ 不要说"只有你们一家"
陷阱2:被问"如果给你安排非 AI 方向的工作?"
→ 表达灵活性,但强调 AI 方向的热情
→ "我愿意先从基础工作做起,同时希望逐步往 AI 方向发展"
陷阱3:被问"能接受多久到岗?"
→ 应届生说"随时可以"
→ 在职说"一个月内"或按实际来
→ 不要说"不确定"
总结
AI 算法面试的核心能力模型:
┌──────────┐
│ 系统设计 │ ← 三面考察
└────┬─────┘
│
┌─────────┴──────────┐
│ 项目 + 场景设计 │ ← 二面考察
└─────────┬──────────┘
│
┌─────────┴──────────┐
│ 八股 + 手撕代码 │ ← 一面考察
└─────────┬──────────┘
│
┌─────────┴──────────┐
│ 算法 + 基础选择题 │ ← 笔试考察
└────────────────────┘
备考优先级:手撕代码 > ML/DL 八股 > 项目深度 > 系统设计 > 大模型前沿
时间规划建议(距面试 3 个月):
| 第1-4周 | LeetCode 刷 150 题 + ML/DL 基础复习 |
| 第5-8周 | 大模型专题(LLM/RAG/微调)+ 项目复盘 |
| 第9-10周 | 系统设计 + 面经刷题 + 模拟面试 |
| 第11-12周 | 查漏补缺 + 投递简历 + 面试实战 |
祝大家秋招/春招顺利,早日拿到心仪的 offer!
标签:AI面试 算法工程师 大模型面试 机器学习 深度学习 面试八股 秋招 2026校招 手撕代码 系统设计


