2026年人工智能工程师(自然语言处理)实操考核试题及答案_第1页
2026年人工智能工程师(自然语言处理)实操考核试题及答案_第2页
2026年人工智能工程师(自然语言处理)实操考核试题及答案_第3页
2026年人工智能工程师(自然语言处理)实操考核试题及答案_第4页
2026年人工智能工程师(自然语言处理)实操考核试题及答案_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2026年人工智能工程师(自然语言处理)实操考核试题及答案一、基础脚本题(共3题,每题8分,共24分)1.子词一致性校验背景:多语言模型常因不同分词器导致同一语义片段被切分成不同子词序列,给下游对齐任务带来噪声。任务:给定两个句子对(src,tgt),分别用LLaMA-3与mBERT的SentencePiece与WordPiece分词器得到子词序列,要求编写≤30行Python代码,输出两段序列的最长公共子词序列(LCSS),并返回其在原句中的字符级起止偏移。输入示例:src=“ChatGPT在2026年仍然表现出色”tgt=“ChatGPTstillperformswellin2026”输出格式:{"lcss":["▁Chat","GPT","▁2026"],"src_offset":[(0,4),(4,7),(14,18)],"tgt_offset":[(0,4),(4,7),(22,26)]}答案与解析:```pythonfromtransformersimportLlamaTokenizer,BertTokenizerimportjsondeflcss_offsets(src:str,tgt:str):tks=LlamaTokenizer.from_pretrained("meta-llama/Llama-3b")tkb=BertTokenizer.from_pretrained("bert-base-multilingual-cased")s1=tks.tokenize(src)s2=tkb.tokenize(tgt)动态规划求LCSSm,n=len(s1),len(s2)dp=[[0](n+1)for_inrange(m+1)]foriinrange(1,m+1):forjinrange(1,n+1):ifs1[i-1]==s2[j-1]:dp[i][j]=dp[i-1][j-1]+1else:dp[i][j]=max(dp[i-1][j],dp[i][j-1])回溯i,j,lcss=m,n,[]whilei>0andj>0:ifs1[i-1]==s2[j-1]:lcss.append(s1[i-1])i-=1;j-=1elifdp[i-1][j]>=dp[i][j-1]:i-=1else:j-=1lcss.reverse()计算偏移defmap_offset(tokens,raw):ptr=0;offs=[]fortintokens:ift.startswith("▁"):t=t[1:]st=raw.find(t,ptr)offs.append((st,st+len(t)))ptr=st+len(t)returnoffssrc_offs=map_offset([tkfortkintks.tokenize(src)iftkinlcss],src)tgt_offs=map_offset([tkfortkintkb.tokenize(tgt)iftkinlcss],tgt)returnjson.dumps({"lcss":lcss,"src_offset":src_offs,"tgt_offset":tgt_offs},ensure_ascii=False)print(lcss_offsets("ChatGPT在2026年仍然表现出色","ChatGPTstillperformswellin2026"))```评分点:①正确调用两种分词器(2分)②动态规划逻辑无bug(3分)③偏移映射准确,含特殊空格符▁处理(3分)2.数据流自动重排背景:训练大模型时,数据管道常因样本长度差异导致GPU饥饿。任务:编写一个PyTorchDataLoader的`collate_fn`,实现“按相似长度近似批处理”策略:在不改变原始顺序语义的前提下,将同一全局epoch内的样本按长度分桶,桶内shuffle,桶间保持宏观顺序。要求内存占用增量<5%,且支持多epoch可复现。输入:dataset为List[Dict],含字段“input_ids”与“labels”,均为1-Dint64列表。输出:DataLoader迭代器,每批返回`input_ids`,`attention_mask`,`labels`。答案与解析:```pythonimportnumpyasnpfromtorch.utils.dataimportDataLoader,SamplerimporttorchclassApproxBatchSampler(Sampler):def__init__(self,ds,batch_size,bucket_size=1000,seed=42):self.ds,self.bs,self.bk,self.seed=ds,batch_size,bucket_size,seedself.lengths=[len(x['input_ids'])forxinds]self.epoch=0defset_epoch(self,epoch):self.epoch=epochdef__iter__(self):g=torch.Generator()g.manual_seed(self.seed+self.epoch)indices=np.arange(len(self.ds))按长度分桶buckets=[indices[i:i+self.bk]foriinrange(0,len(indices),self.bk)]桶内按长度排序forbinbuckets:b.sort(key=lambdai:self.lengths[i])桶间保持原序,桶内shuffleforbinbuckets:np.random.default_seed(self.seed+self.epoch)np.random.shuffle(b)shuffled=np.concatenate(buckets)按bs切分foriinrange(0,len(shuffled),self.bs):yieldfromshuffled[i:i+self.bs]defcollate(batch):max_len=max(len(x['input_ids'])forxinbatch)input_ids=torch.full((len(batch),max_len),0)mask=torch.zeros_like(input_ids)labels=torch.full_like(input_ids,-100)fori,binenumerate(batch):ilen=len(b['input_ids'])input_ids[i,:ilen]=torch.tensor(b['input_ids'])mask[i,:ilen]=1labels[i,:ilen]=torch.tensor(b['labels'])return{"input_ids":input_ids,"attention_mask":mask,"labels":labels}使用示例loader=DataLoader(ds,batch_sampler=ApproxBatchSampler(ds,32),collate_fn=collate)```评分点:①分桶逻辑正确(3分)②桶内shuffle且可复现(3分)③collate填充无冗余拷贝(2分)3.对抗触发器检测背景:提示注入攻击者常在输入末尾插入“!!!!!!”等重复异常token,诱导模型输出特定政治标语。任务:实现一个基于n-gram频率跳变的实时检测函数,输入为字符串,输出为bool,要求:时间复杂度O(n),空间O(1)(n为字符数)。误判率<0.1%,召回率>99%(在10万条正常语料与1千条攻击样本上测试)。答案与解析:```pythonimportredefis_adversarial(s:str,k=4,zscore_thresh=4.0):s=re.sub(r'\s+','',s)freq={}total=0滑动窗口统计k-gramforiinrange(len(s)-k+1):gram=s[i:i+k]freq[gram]=freq.get(gram,0)+1total+=1ifnottotal:returnFalse计算均值与方差mean=total/len(freq)var=sum((vmean)**2forvinfreq.values())/len(freq)std=var**0.5检测跳变forvinfreq.values():ifv>mean+zscore_threshstdandv>10:returnTruereturnFalse```评分点:①满足复杂度要求(3分)②提供测试脚本并给出指标(3分)③对unicode全角符号兼容(2分)二、模型训练题(共2题,每题15分,共30分)4.低资源实体识别背景:某东南亚小语种仅5千句平行语料,含人名、地名、机构三类实体。任务:选用XLM-R-large为骨干,设计参数高效微调方案,总可训练参数量≤15M。采用“双塔+CRF”结构:塔A为冻结的XLM-R,塔B为3层512宽的自适应瓶颈适配器(bottleneckadapter),CRF输出层。训练20epoch,earlystoppingpatience=3,指标达到micro-F1≥0.82。输出要求:①完整训练脚本(含数据加载、模型定义、训练循环、指标计算)。②绘制loss与F1曲线并保存为pdf。③给出错误分析报告:按实体类型统计混淆矩阵,并人工抽样20例错误,用原文+预测+gold三列展示。答案与解析:```python文件:q4_A01.pyimporttorch,torch.nnasnnfromtransformersimportXLMRobertaModel,XLMRobertaConfigfromtorchcrfimportCRFimportnumpyasnp,matplotlib.pyplotaspltfromdatasetsimportload_datasetfromsklearn.metricsimportf1_scoreimportjson,random,os,itertoolsclassAdapter(nn.Module):def__init__(self,hidden,down=64):super().__init__()self.down=nn.Linear(hidden,down)self.up=nn.Linear(down,hidden)self.act=nn.GELU()defforward(self,x):returnx+self.up(self.act(self.down(x)))classModel(nn.Module):def__init__(self,n_labels):super().__init__()self.backbone=XLMRobertaModel.from_pretrained("xlm-roberta-large")forpinself.backbone.parameters():p.requires_grad=Falsehidden=self.backbone.config.hidden_sizeself.adapters=nn.ModuleList([Adapter(hidden)for_inrange(3)])self.dropout=nn.Dropout(0.2)self.classifier=nn.Linear(hidden,n_labels)self.crf=CRF(n_labels,batch_first=True)defforward(self,input_ids,labels=None,mask=None):out=self.backbone(input_ids).last_hidden_stateforadapterinself.adapters:out=adapter(out)logits=self.classifier(self.dropout(out))iflabelsisnotNone:loss=-self.crf(logits,labels,mask=mask,reduction='mean')returnloss,logitselse:returnself.crf.decode(logits,mask=mask),logits数据defload_data(path):ds=load_dataset('json',data_files=path)label2id={'B-PER':0,'I-PER':1,'B-LOC':2,'I-LOC':3,'B-ORG':4,'I-ORG':5,'O':6}defencode(ex):tokens=ex['tokens']labels=[label2id[l]forlinex['ner_tags']]enc=tokenizer(tokens,is_split_into_words=True,truncation=True,max_length=128)对齐标签word_ids=enc.word_ids()prev=None;aligned=[]forwidinword_ids:ifwidisNone:aligned.append(-100)elifwid!=prev:aligned.append(labels[wid])else:aligned.append(labels[wid]iflabels[wid]%2==1else-100)prev=widenc['labels']=alignedreturnenctokenizer=AutoTokenizer.from_pretrained("xlm-roberta-large")ds=ds.map(encode)ds.set_format(type='torch',columns=['input_ids','attention_mask','labels'])returnds['train'],ds['validation'],label2idtrain_ds,val_ds,label2id=load_data("/home/exam/low_resource.json")model=Model(len(label2id))train_loader=DataLoader(train_ds,batch_size=16,shuffle=True,collate_fn=collate)val_loader=DataLoader(val_ds,batch_size=16,collate_fn=collate)optimizer=torch.optim.AdamW(model.parameters(),lr=5e-4)best,patience=0,0losses,f1s=[],[]forepochinrange(20):model.train()epoch_loss=0forbintrain_loader:loss,_=model(**b)loss.backward()optimizer.step();optimizer.zero_grad()epoch_loss+=loss.item()losses.append(epoch_loss/len(train_loader))evalmodel.eval()all_pred,all_true=[],[]withtorch.no_grad():forbinval_loader:pred=model(b['input_ids'],mask=b['attention_mask'])[0]true=b['labels'].cpu().numpy()forp,tinzip(pred,true):p=np.array(p)mask=t!=-100all_pred.extend(p[mask])all_true.extend(t[mask])f1=f1_score(all_true,all_pred,average='micro')f1s.append(f1)iff1>best:best,patience=f1,0else:patience+=1ifpatience>=3:breakplt.plot(losses,label='loss');plt.plot(f1s,label='F1')plt.legend();plt.savefig("curve.pdf")错误分析id2label={v:kfork,vinlabel2id.items()}conf=np.zeros((len(label2id),len(label2id)))forp,tinzip(all_pred,all_true):conf[t,p]+=1np.savetxt("conf.csv",conf,delimiter=',')抽样errors=[]forbinval_loader:pred=model(b['input_ids'],mask=b['attention_mask'])[0]tokens=tokenizer.convert_ids_to_tokens(b['input_ids'][0])gold=b['labels'][0].cpu().numpy()fori,(p,g)inenumerate(zip(pred[0],gold)):ifp!=gandg!=-100:errors.append({"tok":tokens[i],"pred":id2label[p],"gold":id2label[g]})random.shuffle(errors)json.dump(errors[:20],open("errors.json",'w'),ensure_ascii=False,indent=2)```评分点:①冻结骨干并插入适配器(4分)②训练曲线完整(3分)③F1≥0.82(5分)④错误分析清晰(3分)5.多任务指令蒸馏背景:将70B指令模型蒸馏至1.3B学生模型,任务混合:中文开放问答英文摘要代码补全(Python)约束:教师为黑盒API,仅可调用5万次。学生词表32k,与教师不同,需动态对齐。训练数据100万条,需用主动学习挑选5万教师调用。任务:1.设计不确定性+多样性混合采样策略。2.实现token级KL蒸馏,支持不同词表对齐。3.在8×A100节点上24小时完成训练,验证BLEU≥教师95%,Rouge-L≥教师96%。答案与解析:```python文件:q5_A01.pyimporttorch,math,numpyasnpfromtransformersimportAutoTokenizer,AutoModelForCausalLMfromtorch.utils.dataimportDataLoaderimporttorch.distributedasdistfromtqdmimporttqdmteacher_name="blackbox-api/70b-instruct"student_name="custom/1.3b"T=4#蒸馏温度tokenizer_S=AutoTokenizer.from_pretrained(student_name)tokenizer_T=AutoTokenizer.from_pretrained(teacher_name,use_fast=False)defalign_logits(logits_T,ids_S,ids_T):将教师logits映射到学生词表采用最大池词片对齐probs_T=torch.softmax(logits_T/T,dim=-1)#[len,V_T]V_S,V_T=tokenizer_S.vocab_size,tokenizer_T.vocab_sizemapping=torch.zeros(V_T,V_S).to(probs_T.device)fortok,idxintokenizer_T.get_vocab().items():pieces=tokenizer_S.tokenize(tok)ifnotpieces:continues_idx=[tokenizer_S.convert_tokens_to_ids(p)forpinpieces]mapping[idx,s_idx]=1/len(s_idx)probs_S=probs_T@mapping#[len,V_S]returnprobs_Sdefuncertainty_score(model,batch):withtorch.no_grad():logits=model(batch['input_ids']).logitsprob=torch.softmax(logits,dim=-1)entropy=-(probtorch.log(prob+1e-12)).sum(-1).mean()returnentropy.item()defdiversity_score(batch,pool_features):最小余弦相似度feat=batch['features']#[bs,d]sim=torch.mm(feat,pool_features.T)#[bs,N]max_sim=sim.max(dim=1)[0]div=1max_sim.mean().item()returndiv主动学习采样defselect_samples(pool,budget=50000):pool_features=torch.load("pool_features.pt")#预先用学生模型提取scores=[]forbinDataLoader(pool,batch_size=32):u=uncertainty_score(student_model,b)d=diversity_score(b,pool_features)scores.append(0.7u+0.3d)indices=np.argsort(scores)[-budget:]returnindices蒸馏训练defdistill():optimizer=torch.optim.AdamW(student_model.parameters(),lr=2e-5)loader=DataLoader(selected_set,batch_size=16,num_workers=8)student_model.train()forepochinrange(3):forbintqdm(loader):withtorch.no_grad():logits_T=teacher_api(b['prompt'])#黑盒返回logits_T=logits_T.to(student_model.device)probs_T=align_logits(logits_T,b['input_ids'],b['teacher_ids'])logits_S=student_model(b['input_ids']).logitslog_probs_S=torch.log_softmax(logits_S/T,dim=-1)kl=torch.nn.KLDivLoss(reduction='batchmean')(log_probs_S,probs_T)(T2)kl.backward()optimizer.step();optimizer.zero_grad()student_model.save_pretrained("distilled")if__name__=="__main__":dist.init_process_group(backend='nccl')student_model=AutoModelForCausalLM.from_pretrained(student_name).cuda()selected_idx=select_samples(pool,50000)selected_set=torch.utils.data.Subset(pool,selected_idx)distill()```评分点:①主动学习策略合理(4分)②词表对齐无OOM(4分)③指标达标(5分)④分布式训练无阻塞(2分)三、系统部署题(共1题,16分)6.动态批推理服务背景:公司线上问答服务峰值QPS1200,平均长度180tokens,最大2ktokens,P99延迟<800ms。任务:基于FasterTransformer+Triton,部署1.3B学生模型(题5产出)。实现continuousbatching,支持插入与提前停止。提供helmchart,一键部署至K8s集群(含GPU节点亲和性)。压测脚本:使用locust,模拟峰值流量10分钟,输出P99延迟、吞吐、GPU利用率截图。答案与解析:```bash文件:triton_model_repo/1.3b-instruct/config.pbtxtname:"1.3b-instruct"platform:"fastertransformer"max_batch_size:64model_transaction_policy{decoupled:true}parameters{key:"tensor_para_size"value:{string_value:"1"}}parameters{key:"pipeline_para_size"value:{string_value:"1"}}instance_group[{count:4kind:KIND_GPUgpus:[0,1,2,3]}]helm/value

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论