下面进行华为2026年6月17日AI岗机考题的复盘和关键知识点(重点)深度剖析,笔者7月9日刷完选择题和2道算法题。选择题考到回归分析、机器学习和深度学习基础概念、梯度检查点、激活函数、NPU迁移部署、增量更新、向量检索、模型量化、MLE估计等知识点。编程题是机器学习和传统的数据结构与算法的考点,一个是大模型PP并行训练场景(基础模拟,评级中等)的题目(评级中等),一个是信号频域特征聚类(评级中等)。
说明:文章内选择题证明和论述部分的绿色字体是AI生成内容,红色字体是人工增添或重要修改内容。
目录
选择题
用时30分钟
第十八题
向量检索、RAG检索增强式生成,正确答案ACD。

A:document文档的子模块是chunk,chunk可以是一个段落或者几个段落,一般有按照固定长度切分chunk还有使用语义进行切分两种模式,后者往往是更合适的切分方式,因为固定长度切分第一可能导致有效信息囊括不足(chunk分块偏小),第二可能导致混入过多其他信息(chunk不纯净),这直接导致模型在生成内容的时候答不对题,因为模型自己参考的教科书本身就是无关的。实现的时候直接读取段落间换行符或者标题间分隔符就可以。
保留overlap可以让模型适度的扩充本轮回答的素材库,但是overlap不能太低也不能太高,这个也是深度学习领域调参的经典设计:太低可能导致向量检索时按照相似度阈值匹配的语义相关的素材较少,回答比较干瘪;太高可能导致两个语义块内容相似度太高,参考材料冗余,有效信息较低,在输出的时候内容在信息上容易重复。
B:temperature设为0即为开启确定性采样,但并不能够确保检索到的文档或者语义块一定和用户问题相关,我理解成总体会更相关,但是还是需要"系安全带",通过rerank后处理或者语义分块预处理确保模型回答基于的素材库足够相关(纯净),同时会导致生成的内容在多样性方面下降。
C:因为检索的时候有温度随机采样设定,所以top5得到的匹配文档不一定是最匹配的,使用rerank进行精确的二次排序并且筛选更少更匹配的素材进入生成阶段。
D:强制加入语义chunk索引,可以减轻模型幻觉。
关于工业界选择Overlap比率,我了解到的情况是,一般选择15%作为调参起始点,然后使用结合命中率(Hit Rate)和生成内容多样性(Distinct-n)的网格搜索方法(Grid Search)在基线上调优,最终结果根据输入的向量素材库本身的语义chunk大小和内容分布高度相关。
- 如果Chunk Size很小(如128 tokens):15%的重叠只有约19个token,太少了,根本兜不住跨块的指代消解(如"它"、"该方法"),此时网格搜索会建议你把Overlap提到25%~30%。
- 如果Chunk Size很大(如1024 tokens):15%的重叠有153个token,足够把上一块的收尾总结全包进来,此时网格搜索可能会建议你降到8%~10%。
代码题1(中等)
模拟题目,用时10分钟,通过率100%
第2题-大模型训练流水线并行(PP)最优估计计算 - problem_ide - CodeFun2000

python
def code1():
l = input().split()
if len(l) != 4:
print("-1 -1")
else:
l = list(map(int, l))
TL, SL, mb, N = l
minimum_available_pp = 0
for i in range(1, N + 1):
if TL % i == 0 and TL // i <= SL:
minimum_available_pp = i
break
if minimum_available_pp == 0:
print("-1 -1")
else:
bubble_rate = (minimum_available_pp - 1) / (mb + minimum_available_pp - 1)
print(minimum_available_pp, "{:.4f}".format(bubble_rate), sep=" ")
代码题2(中等)
K-Means机器学习无监督聚类算法+基础数学运算
55分钟,通过率10%
1小时15分钟,通过率80%
1小时20分钟,通过率100%
第3题-基于频域特征的轻量级传感器信号聚类系统 - problem_ide - CodeFun2000

python
def code2():
import math
import copy
# 输入处理
N, L, K = map(int, input().split())
data = []
for i in range(N):
data.append(list(map(float, input().split())))
init_centers = list(map(int, input().split()))
# 傅里叶变换构建特征向量
feature = []
for i in range(N):
Xks = [[0, 0] for i in range(L // 2 - 1)]
for j in range(1, L // 2):
Xks[j - 1][0] = sum([math.cos(2 * math.pi * j * n / L) * data[i][n] for n in range(L)])
Xks[j - 1][1] = -sum([math.sin(2 * math.pi * j * n / L) * data[i][n] for n in range(L)])
amp = [(x[0] ** 2 + x[1] ** 2) for x in Xks]
# 确保振幅相同时,reverse设置下频率低索引小的排前面
inds = list(range(L // 2 - 1, 0, -1))
# inds=list(range(1,L//2))
inds.sort(key=lambda i: amp[i - 1], reverse=True)
feature.append(inds[:3])
# K-means聚类
# 一定注意要深拷贝,否则会同步修改feature数据
centers = [feature[ic][:] for ic in init_centers]
for e in range(100):
last_centers = copy.deepcopy(centers)
clusters = {i: [] for i in range(K)}
for n in range(N):
dists = []
min_id = 0
for c in centers:
dists.append(sum([(feature[n][k] - c[k]) ** 2 for k in range(3)]) ** 0.5)
if dists[-1] < dists[min_id]:
min_id = len(dists) - 1
clusters[min_id].append(n)
# 更新中心
for k, v in clusters.items():
if len(v) > 0:
for t in range(3):
centers[k][t] = round(sum([feature[ve][t] for ve in v]) / len(v))
"""
centers[k][t]=sum([feature[ve][t] for ve in v])/len(v)
bias=centers[k][t]-int(centers[k][t])
if bias<0.5:
centers[k][t]=int(centers[k][t])
elif bias>0.5:
centers[k][t]=int(centers[k][t])+1
else:
if int(centers[k][t])%2==1:
centers[k][t]=int(centers[k][t])+1
else:
centers[k][t]=int(centers[k][t])
"""
else:
# 保持不变
pass
if centers == last_centers:
break
# 输出处理
# centers.sort(key=lambda x:10000*x[0]+100*x[1]+x[2])
centers.sort()
for i in range(K):
print(" ".join([str(ce) for ce in centers[i]]))
注意点:(默认?)如果频率特征向量到多个聚类中心L2距离一样按照索引低的中心去归类(索引始终根据初始指定的顺序维护);按照振幅或者能量排序的时候,振幅相同,低频分量排前面,索引列表一开始就降序排列;centers初始化的时候一定要深拷贝处理feature的数据,不然后序更新中心,原始特征也同步更改,导致迭代和结果紊乱;输出排序处理直接sort即可。
关于优化:使用last_centers深拷贝centers进行循环跳出检测,缩短迭代步数。使用PyPy3语言,10个测试用例的程序运行时间可以缩短200-250ms左右。