小米 AI Agent开发 一面

1. BERT 模型的结构

答:BERT 本质上是一个 Encoder-only 的 Transformer。输入由 Token Embedding、Segment Embedding、Position Embedding 三部分相加得到,然后经过多层 Transformer Encoder。以 BERT-Base 为例,模型参数通常是:层数 (L=12),隐藏维度 (H=768),注意力头数 (A=12),前馈层维度 (4H=3072)。BERT-Large 则是 (L=24, H=1024, A=16)。每层 Encoder 的结构是:Multi-Head Self-Attention -> Add & LayerNorm -> Feed Forward Network -> Add & LayerNorm。BERT 的训练目标主要有两个,一个是 MLM,也就是 Masked Language Model;另一个是 NSP,也就是 Next Sentence Prediction,后续很多变体会去掉 NSP。它和 GPT 最大的区别是,BERT 用双向上下文建模,更适合理解类任务;GPT 是 Decoder-only,更适合生成类任务。

2. Transformer 的结构

答:标准 Transformer 由 EncoderDecoder 组成,最早来自论文 Attention Is All You Need。Encoder 每层包括两部分:多头自注意力和前馈网络。Decoder 每层包括三部分:Masked Self-Attention、Cross-Attention、前馈网络。如果写成结构顺序,Encoder 是:X→MHA→Add&Norm→FFN→Add&Norm是:Y→Masked MHA→Add&Norm→Cross-Attention→Add&Norm→FFN→Add&Norm现在大模型大多用的是 Decoder-only 结构,因为它更适合自回归生成,训练目标统一,扩展到超大参数规模也更自然。

3. Self-Attention 的原理、公式,为什么要除以 (\sqrt{d_k}),MQA、GQA、MLA 分别是什么

答:Self-Attention 的核心是让序列中每个 token 都能和其他 token 建立关系。输入 (X) 先映射成:Q=XWQ,K=XWK,V=XWV 注意力分数是:

这里除以是因为当 (d_k) 很大时,QK的数值方差会变大,softmax 会进入饱和区,梯度变得很小,训练不稳定。缩放之后数值更平稳。Multi-Head Attention 则是把 (Q,K,V) 切到多个头上分别计算,再拼接:其中:

MQA 是 Multi-Query Attention,多个 Query Head 共享同一组 K 和 V,也就是 Q 还是多头,但 K、V 只有一组,优点是大幅降低 KV Cache 开销。GQA 是 Grouped-Query Attention,它是 MQA 和 MHA 的折中。多个 Q 头分组后共享 K、V,每组一套 K、V,比 MHA 更省显存,比 MQA 表达力更强。MLA 一般指 Multi-head Latent Attention,它的核心思路是先把 K、V 压到更低维的 latent 空间,再做恢复或映射,目的还是减少 KV Cache 和推理成本。它本质上是进一步优化注意力的存储和带宽问题。

4. 位置编码,传统位置编码和大模型常用位置编码,RoPE 的公式

答:位置编码的作用是给模型注入序列顺序信息,因为 Attention 本身对输入顺序不敏感。传统 Transformer 里最经典的是 Sinusoidal Position Encoding,直接加到输入 embedding 上:

这里 (pos) 是位置,(i) 是维度索引,(d) 是隐藏维度。BERT 用的是可学习的位置编码,也是加到输入 embedding 上。现在大模型里更常见的是 RoPE,也就是 Rotary Position Embedding。它不是直接把位置向量加到 embedding 上,而是对 Q 和 K 做旋转变换,把相对位置信息编码进注意力计算。对于二维向量对 ((x{2i},x{2i+1})),RoPE 写成:

其中 θip,i和位置 (p) 有关。RoPE 的优势是自然引入相对位置信息,长文本外推通常比绝对位置编码更稳定。

5. KV Cache 的介绍及功能

答:KV Cache 是大模型推理阶段常用的缓存机制。在自回归生成时,如果没有 KV Cache,那么每生成一个新 token,都要把历史所有 token 的 K、V 重新算一遍。引入 KV Cache 后,历史 token 的 Key 和 Value 会被缓存起来,后续只需要计算当前新 token 的 Q、K、V,并把新的 K、V 追加到缓存里。它的主要作用是减少重复计算,显著提升长文本生成速度。代价是显存会随上下文长度增长,因为每层都要保存历史 K、V。所以 KV Cache 的本质是 用显存换时间

6. 大模型常见归一化方法和公式

答:大模型里最常见的是 LayerNormRMSNorm。LayerNorm 的公式是:

它会减均值再除标准差。RMSNorm 不减均值,只按均方根缩放:

计算更简单,速度更快,所以很多大模型都更偏向使用 RMSNorm。此外在结构上还有 Post-NormPre-Norm 两种放置方式,现在大模型通常更喜欢 Pre-Norm,因为深层训练更稳定。

7. Transformer 的解码策略有哪些,作用对象是什么

答:解码策略作用在 Decoder 输出的 token 概率分布 上,本质是在每一步从词表分布里决定下一个 token 怎么选。最常见的是 Greedy Search,每一步直接选概率最大的 token,优点是简单快,缺点是容易陷入重复。Beam Search 会保留多个候选路径,适合机器翻译、摘要这类更强调全局最优的任务。Top-k Sampling 是每一步只在概率最高的 (k) 个 token 里采样。Top-p Sampling 是只在累计概率达到阈值 (p) 的最小 token 集合里采样。Temperature 则是调节分布平滑程度:

其中 T<1更保守,T>1 更发散。大模型聊天场景里,通常是 temperature 配合 top-p 使用得最多。

8. 大模型激活函数原理

答:激活函数的作用是给网络引入非线性映射能力。传统神经网络里常见的有 Sigmoid、Tanh、ReLU。大模型里最常见的是 GELUSwiGLU。GELU 的公式是:

其中 (\Phi(x)) 是标准高斯分布的累积分布函数,常用近似写法是:它比 ReLU 更平滑。SwiGLU 一般写成:很多新一代大模型喜欢用

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

AI-Agent面试实战专栏 文章被收录于专栏

本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以“原理+场景+实战”为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.

全部评论
这才是佬啊 向你学习
点赞 回复 分享
发布于 昨天 21:30 四川

相关推荐

昨天 13:35
门头沟学院 Java
攒攒人品!有面试过同岗的朋友欢迎评论区交流1.实习拷打2.项目拷打3.你们的&nbsp;Agent&nbsp;是单&nbsp;Agent&nbsp;还是多&nbsp;Agent?为什么这么设计?有没有考虑过另一种方案?4.Agent&nbsp;任务是怎么拆分的?拆分粒度是怎么决定的?5.上下文是怎么构建的?你们怎么避免上下文过长或者信息污染?6.如果上下文窗口不够,你优先保留哪些信息?为什么?7.你们做代码理解的时候,AST、调用关系这些信息是怎么用起来的?8.单测生成里,哪些代码其实不适合生成单测?你们是怎么识别并过滤的?9.覆盖率高但测试质量很差,这种情况你见过吗?你们是怎么解决的?10.mock在单测里什么时候是必须的?什么时候反而会带来问题?11.如果一个函数依赖数据库和RPC,你怎么让模型生成的单测还能稳定运行?12.你们怎么评估生成单测的质量?除了覆盖率,还有哪些指标?13.LLM的输入到底是什么?模型真正看到的是什么?14.self&nbsp;attention的核心作用是什么,为什么要拆成&nbsp;QKV?为什么attention&nbsp;可以建模长距离关系,15.为什么需要multi-head为什么&nbsp;attention可以看成动态加权16.同一个&nbsp;token的&nbsp;Q、K、V&nbsp;为什么不一样?17.attention复杂度很高,如果上下文特别长,你会怎么优化?18.模型产生幻觉的时候,一般是什么原因?工程上有什么办法降低19.Python有多线程吗?GIL&nbsp;是干什么的?什么时候多线程是有用的?20.讲一下C++从源码到可执行文件的流程。21.手撕:给定数组的区间中位数之和:给定一个长度为n的数nums,一个区间&nbsp;[l,&nbsp;r]&nbsp;的&nbsp;中位数&nbsp;为:如果区间长度是奇数:排序后中间的数,如果是偶数:排序后靠左的那个数,要求:计算所有子数组的中位数之和
查看19道真题和解析
点赞 评论 收藏
分享
今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,也有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务