【大模型面经】千问系列专题面经
摘要 Qwen(通义千问)是阿里推出的大模型家族,包含Qwen1到Qwen3系列。Qwen2.5是目前主流的版本,采用Decoder-Only架构,在注意力机制(GQA)、激活函数(SwiGLU)、归一化(RMSNorm)和位置编码(RoPE)等方面进行优化。其Tokenizer采用大词表+byte-level BPE设计,支持中文、多语种和代码任务。Qwen系列通过数据规模扩展(从7T到36T

🧔 这里是九年义务漏网鲨鱼,研究生在读,主要研究方向是人脸伪造检测,长期致力于研究多模态大模型技术;国家奖学金获得者,国家级大创项目一项,发明专利一篇,多篇论文在投,蓝桥杯国家级奖项、妈妈杯一等奖。
✍ 博客主要内容为大模型技术的学习以及相关面经,本人已得到B站、百度、唯品会等多段多模态大模型的实习offer,为了能够紧跟前沿知识,决定写一个“从零学习 RL”主题的专栏。这个专栏将记录我个人的主观学习过程,因此会存在错误,若有出错,欢迎大家在评论区帮助我指出。除此之外,博客内容也会分享一些我在本科期间的一些知识以及项目经验。
🌎 Github仓库地址:Baby Awesome Reinforcement Learning for LLMs and Agentic AI
📩 有兴趣合作的研究者可以联系我:yirongzzz@163.com
文章目录
一、Qwen 是什么?为什么会有一整条系列?
在聊架构细节之前,我们先把“Qwen 系列”这件事讲清楚,否则在面试里一旦对方问:“你说的这是 Qwen2 还是 Qwen2.5?”很容易乱。
1.1 Qwen 家族的基本认识
Qwen(通义千问)本质上是一条完整的大模型家族,而不是单一一个 LLM。它从最早的 Qwen1,到 Qwen2 / Qwen2.5,再到 2025 年的 Qwen3,基本遵循这样一条演进路线:arXiv+2arXiv+2
-
Qwen1.x:第一代中文/多语种 LLM,标准 decoder-only,主打中文友好、多语种和代码能力;
-
Qwen2:在 Qwen1 的基础上升级了架构和数据,强化长上下文(32K)和多语种,同时推出了 Qwen2-VL(视觉)和 Qwen2-Audio(语音)多模态分支;arXiv+1
-
Qwen2.5:目前最常被业界对标的一代:
-
预训练数据从 7T → 18T tokens;arXiv+1
-
大规模指令 SFT + Offline RL + Online RL;
-
家族非常丰富:Base / Instruct / Math / Coder / VL / Omni 等;
-
-
Qwen3 / Qwen3-Next:2025 年的最新一代:
-
总共约 36T tokens 的多阶段预训练;arXiv+1
-
Dense + 超大 MoE(如 235B 参数,8 expert/每 token);
-
长上下文能力提升到 128K,强调 reasoning 和高效推理。alphaXiv+1
-
直觉上,你可以把 Qwen 想成:「阿里系的 LLaMA 家族 + 全家桶多模态扩展」。
🧠 面试问题 1:面试官可能先问——“你先大概说一下 Qwen 这个系列,分了几代,各自重点是什么?”
答题思路可以照着上面的结构简要复述,但注意节奏:
-
先一句话总括:
“Qwen 是一整条从 Qwen1 → Qwen2 → Qwen2.5 → Qwen3 的大模型家族,覆盖文本、代码、数学、多模态和语音等场景。”
-
然后按时间线给出“每一代 + 一个关键词”:
-
Qwen1:首代中文/多语种 LLM;
-
Qwen2:长上下文 + 多模态起步(VL / Audio);
-
Qwen2.5:18T 预训练 + 长上下文 + SFT & RL 全面升级;
-
Qwen3:36T 预训练 + MoE + 128K 上下文 + reasoning 强化。
-
这一问主要看你是不是真的 follow 过千问的技术报告,而不是只在 HuggingFace 上用过一次。
二、Qwen2.5 的基本架构:仍然是 Decoder-Only,但细节改了很多
2.1 宏观上:标准的 Decoder-Only 自回归 LLM
从大框架看,Qwen2.5 其实和 GPT / LLaMA 很像:arXiv+1
-
使用 Decoder-Only 的 Transformer 堆叠;
-
训练目标是标准的自回归 Next Token Prediction;
-
每一层就是一个「Self-Attention + MLP + 残差 + RMSNorm」的 Block;
-
推理时通过 causal mask 保证当前 token 只能看到历史 token。
所以如果只从「一张大图」的角度看,Qwen2.5 和 GPT-3/4、LLaMA2/3 几乎属于同一个家族。
这时,面试官通常就会追问第一个细节问题了:
🧠 面试问题 2:Qwen2.5 的单层 Block 和标准 Transformer Decoder 有什么不同?
这里就进入架构细节对比 GPT/LLaMA的部分,建议从 4 个 keyword 来回答:GQA / SwiGLU / RMSNorm / RoPE。arXiv+1
-
注意力:Grouped Query Attention (GQA)
-
标准 MHA:每个头一套 KV;
-
MQA:所有头共享一套 KV;
-
GQA:若干个头共享一组 KV(多组 KV,每组对应一堆 Q 头)。
好处是:在表达能力接近 MHA 的前提下,大幅降低 KV cache 内存和推理成本,非常适合长上下文场景。
-
-
MLP:SwiGLU 代替 ReLU/GELU
- 使用带门控的 SwiGLU 激活,比传统 FFN 更适合大模型容量扩展;
-
归一化:RMSNorm 代替 LayerNorm
- RMSNorm 只归一化方差,不减均值,计算更简单,对深层大模型更稳定;
-
位置编码:RoPE(旋转位置编码)
-
相对位置编码,支持长上下文外推;
-
Qwen2.5 通过调节 RoPE base 频率和插值策略,支持 128K 级上下文。alphaXiv+1
-
这一问的核心就是:你能不能用**“四连击”**一下子把 Qwen2.5 Block 的特点说完整。
三、Tokenizer:为什么 Qwen 的中文、多语种和代码都很强?
和你在 Transformer 篇“先讲位置编码,然后引出不同位置编码问法”类似,这里我们先把 Qwen 的 tokenizer 设计清楚讲一遍,再进入面试问法。
3.1 Qwen2.5 的 Tokenizer 设计
Qwen2.5 在技术报告中对 Tokenizer 专门有一个小节,关键有两点:arXiv+1
-
大词表 + byte-level BPE
-
词表规模大约在 15 万级别;
-
采用 byte-level BPE,可以自然覆盖中文、英文、多语种以及代码字符;
-
对中文既有汉字级 token,也有高频词 token,压缩率和表达力之间取得平衡。
-
-
预留多模态与工具调用相关 special tokens
-
各种
<vision_start> / <vision_end>、bbox 相关 token; -
工具调用用的
<tool_call>等特殊符号; -
代码 FIM(Fill-in-the-Middle)用的 prefix/middle/suffix token。Hugging Face+1
-
这样做的好处是:一套词表可以统一覆盖 Qwen2.5-LLM、Qwen2-VL、Qwen2.5-Omni、Coder、Math 等整条家族。
这时,面试官很容易顺着问出第二个位置的问题:
🧠 面试问题 3:为什么 Qwen 在中文、多语种、代码上表现都挺好?只是因为中文数据多吗?
这里就可以从“tokenizer + 数据”两个维度回答:
-
Tokenizer 层面
-
byte-level BPE + 大词表,对中文、英文、多语种、代码都足够灵活;
-
对多模态 / 工具 / FIM 预留 token,避免后续模块“东拼西补”。
-
-
数据层面
-
Qwen2.5 的预训练数据约 18T tokens,其中大量是中文、多语种 Web、代码仓库、技术文档、学术文章等;arXiv+2ABEJA Tech Blog+2
-
通过数据清洗+重采样提升技术类、学术类内容占比,对电商、噪声网页做 down-sample。
-
一句话总结给面试官:
“Qwen 的多语种和代码能力不是‘白嫖’来的,是 tokenizer + 数据分布双管齐下的结果。”
四、预训练 & 长上下文:18T 数据是怎么喂进去的?
类似你在 Transformer 篇“从绝对位置编码 → 相对/旋转位置编码”的节奏,这里我们从**“基础预训练” → “长上下文扩展”**,再顺势引出面试问法。
4.1 预训练数据与阶段
Qwen2.5 把预训练数据从上一代的约 7T 扩展到了 18T tokens,而且不是简单“All-in 混就完事”:arXiv+2ABEJA Tech Blog+2
-
多阶段预训练:
-
Stage1:通用语料打基础(多语种、Web 文本、百科等);
-
Stage2:提升知识密度(技术文档、学术、代码、数学等);
-
-
数据清洗与重采样:
-
用自家模型对文本打分,过滤模板化、垃圾内容;
-
对技术/学术/代码类高信息数据 up-sample;
-
-
合成数据(self-bootstrapping):
- 用上一代强模型生成 CoT 推理题、复杂代码任务、数学题,再用奖励模型过滤。
4.2 长上下文训练(Long-Context Pre-training & Fine-tuning)
Qwen2.5 的长上下文支持不是「直接把 context length 改成 128K」就完事,而是走的**“短 → 中 → 长” 分阶段策略**:ABEJA Tech Blog+2alphaXiv+2
-
预训练阶段:
-
先在 4K / 8K 范围训练大部分步骤;
-
然后引入更长上下文(例如 32K)并配合长文数据;
-
-
Post-training 阶段:
-
在 SFT / RL 阶段引入长指令、长文档综合任务;
-
对 Turbo / 长上下文版本额外做 Long-context Fine-tuning(如 32K + 262K 混合训练)。
-
这时,面试官通常会抛出一个“看你是否真的理解长上下文”的问题:
🧠 面试问题 4:Qwen2.5 为什么能支持到 128K 上下文?是不是把 RoPE 的长度改一改就行了?
这里一定要避免“把 config 改大就行”的低级回答。比较完整的说法:
-
位置编码层面:
- 使用 RoPE(旋转位置编码),并通过提高 base 频率 + 插值,让模型的相对位置信号在更远范围内仍然可用;arXiv+1
-
训练策略层面:
-
预训练后期专门引入长上下文数据;
-
Post-training 阶段在长指令上做 SFT / RL,增强模型在长对话/长文任务上的表现。ABEJA Tech Blog+1
-
-
工程实现层面:
- 借助 GQA、KV cache 优化等手段避免长上下文时显存爆炸。arXiv+1
可以用一句“总结 punchline”:
“长上下文不是 RoPE 一个参数的问题,是『RoPE + 训练数据 + 工程优化』三件事共同的结果。”
五、多模态:Qwen2-VL & Qwen2.5-Omni 是怎么接图像/视频/音频的?
这部分就类似你在 Transformer 篇聊“不同位置编码”那一节——我们先讲清楚两个核心概念,再反推面经问法:
-
Qwen2-VL:Naive Dynamic Resolution + M-RoPE
-
Qwen2.5-Omni:Thinker–Talker + TMRoPE
5.1 Qwen2-VL:Naive Dynamic Resolution + M-RoPE
Qwen2-VL 是通义千问在视觉方向上的核心 LVLM。论文里有两个很典型的技术点:arXiv+2Qwen+2
-
Naive Dynamic Resolution(NDR)
-
不再强制把图片 resize 到统一分辨率;
-
允许任意分辨率图片映射成不同数量的视觉 token;
-
文档扫描、大图表、多物体场景会分配更多 token,简单图片 token 数则更少。
-
-
Multimodal RoPE(M-RoPE)
-
RoPE 的多模态扩展,把文本的 1D 位置、图片的 2D 位置、视频的 3D (time+2D) 位置统一到一个框架中;
-
使模型能一致地处理 text/image/video 三种模态的时空结构。arXiv+2CADDi Tech Blog+2
-
这时,面试官常见问题就来了:
🧠 面试问题 5:Qwen2-VL 相比传统 LVLM 最大的升级点是什么?
标准答法:
-
核心是两个词:NDR + M-RoPE;
-
NDR 让模型可以“按内容分配 token”,避免一刀切的固定分辨率;
-
M-RoPE 则把文本、图像、视频统一到一个相对位置编码体系,从而在长视频、多图片场景下仍然能稳定工作。
5.2 Qwen2.5-Omni:Thinker–Talker + TMRoPE
Qwen2.5-Omni 是一款「看 + 听 + 说 + 写」一体化的端到端多模态模型:输入可以是文本、图像、音频、视频,输出可以是文本 + 实时语音。AlibabaCloud+3arXiv+3Hugging Face+3
技术报告里有两个非常关键的设计:
-
Thinker–Talker 架构
-
Thinker:一个 LLM,负责多模态理解与文本生成;
-
Talker:一个双轨自回归模块,直接基于 Thinker 的隐状态生成语音 token,实现 streaming 语音输出。
-
-
TMRoPE(Time-aligned Multimodal RoPE)
-
Time-aligned Multimodal RoPE,用来对齐视频帧和音频帧的时间戳;
-
通过交错块(interleaved chunking),将音/视 token 按时间顺序混合,使得 lip-sync 等时间敏感任务更稳定。arXiv+1
-
这时,典型的面试追问就是:
🧠 面试问题 6:Qwen2.5-Omni 和传统「ASR → LLM → TTS」流水线有什么本质区别?
可以从三点说:
-
端到端 vs 三段式
-
传统做法是 ASR + 文本 LLM + TTS 三个模块拼接;
-
Qwen2.5-Omni 是一个端到端多模态模型,Thinker & Talker 在同一个系统里联合训练。
-
-
时间对齐
- 借助 TMRoPE 对齐视频和音频,在唇形同步、视频描述、语音 QA 等任务上表现更自然。arXiv+1
-
延迟与体验
- streaming Talker + sliding-window DiT 显著降低了语音生成延迟,非常适合语音助手、实时对话等场景。arXiv+2AlibabaCloud+2
六、Post-training:SFT + Offline RL + Online RL 的多阶段管线
对应你在别的文章里会讲 PPO / DPO 一样,这一节是讲清楚“千问是怎么做后训练的”。
6.1 SFT:大规模指令微调
Qwen2.5 在 SFT 阶段使用了 超过 100 万条多任务指令数据,覆盖:对话、长文总结、工具使用、代码生成、数学推理、多语言 QA 等。ABEJA Tech Blog+2arXiv+2
核心思路是:用强模型生成高质量指令-回答数据,再结合人工/自动过滤,形成高质量 SFT 语料。
6.2 Offline RL:偏能力提升
主要针对的是数学、代码、复杂推理这种“有明确对错”的任务:
-
用强模型生成多个 candidate 回答;
-
用奖励模型(RM)或执行器(代码执行、数学检查)对 candidate 打分;
-
构造 preference pair(好/坏回答);
-
用 DPO / PPO-like 方法对模型进行偏好优化(离线 RL)。ABEJA Tech Blog+1
6.3 Online RL:偏人类偏好与安全
在线 RL 更关注主观评价和安全约束:
-
真实性、有用性、简洁度;
-
安全性、价值观、避免有害内容等。ABEJA Tech Blog+1
通过不断收集线上交互数据 + 人类/自动评审反馈,更新奖励模型,并用在线 RL 对模型进行迭代调整。
这时,自然而然会出现一个典型 RLHF 问法:
🧠 面试问题 7:为什么 Qwen2.5 既要做 Offline RL,又要做 Online RL?只做一个不行吗?
可以用一句话作为核心:
Offline RL 拉“能力上限”,Online RL 调“人类偏好与安全”。
稍微展开:
-
Offline RL 在离线数据上优化“有标准答案”的任务(数学、代码、复杂推理),成本可控、评价客观;
-
Online RL 在真实交互反馈上优化用户主观体验与安全性,是不断迭代的过程;
-
两者叠加,才能保证模型既强(会做题),又好用(不乱说、不翻车)。
七、Qwen 高频面试问法梳理
下面这几个问题基本是「千问相关」最有可能被问到的组合,你可以直接当 checklist 背。
🧠 Q1:Qwen、LLaMA、GPT 在架构上的主要差异是什么?
答题要点:
-
都是 decoder-only,自回归语言模型;
-
Qwen2.5 典型组合是:GQA + SwiGLU + RMSNorm + RoPE + QKV bias;
-
tokenizer 与数据分布更偏多语种、中文和代码,并预留大量多模态 / 工具调用 special token;
-
千问从一开始就成体系地推出了 Coder / Math / VL / Omni 等子系列,是一个完整家族而不是单一 LLM。
🧠 Q2:为什么 Qwen2.5 能支持 100K+ 上下文?只是把 max length 改大了吗?
-
没有那么简单:
-
在 RoPE 频率 上做了扩展与插值;
-
使用 分阶段长上下文训练,后期专门用长文数据做适配;
-
-
工程侧配合 GQA、KV cache 优化,减轻算力和显存压力。
🧠 Q3:Qwen2-VL 的 Naive Dynamic Resolution 有什么用?
-
允许模型根据图像/视频复杂度分配不同数量的视觉 token;
-
高分辨率扫描、文档、图表场景可以保留更多细节,而简单图片不会被浪费 token;
-
与 M-RoPE 配合,提升了文档解析、表格理解、多物体场景等任务的效果和效率。arXiv+2note(ノート)+2
🧠 Q4:为什么 Qwen2.5 的后训练要分「Offline RL」和「Online RL」阶段?
-
Offline RL:偏能力,把数学、代码、复杂推理这类有标准答案的能力拉到极限;
-
Online RL:偏人类偏好与安全,通过在线交互 + RM + PPO-like 优化模型行为;
-
两者搭配,可以兼顾「能力上限」和「用户体验 / 合规性」。
八、实战代码
Qwen2.5-7B-Instruct:本地 Chat Demo(HuggingFace)
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL_NAME = "Qwen/Qwen2.5-7B-Instruct"
# 1. 加载 tokenizer & 模型
tokenizer = AutoTokenizer.from_pretrained(
MODEL_NAME,
trust_remote_code=True # Qwen 系列需要这个
)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype=torch.bfloat16,
device_map="auto",
trust_remote_code=True,
)
model.eval()
def chat(messages, max_new_tokens=512):
"""
messages: [{"role": "user"/"assistant"/"system", "content": "..."}]
返回生成字符串
"""
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
do_sample=True,
top_p=0.9,
temperature=0.7,
)
response = tokenizer.decode(
outputs[0][inputs["input_ids"].shape[-1]:],
skip_special_tokens=True
)
return response.strip()
if __name__ == "__main__":
history = [
{"role": "system", "content": "你是一个擅长解释大模型原理的面试辅导老师。"},
]
while True:
query = input("👤 你:").strip()
if not query or query.lower() in ["exit", "quit"]:
break
history.append({"role": "user", "content": query})
answer = chat(history)
history.append({"role": "assistant", "content": answer})
print("\n🤖 千问:", answer, "\n")
Qwen2.5-Omni
from transformers import AutoModelForCausalLM, AutoTokenizer
from PIL import Image
import torch
MODEL_NAME = "Qwen/Qwen2.5-Omni-7B"
tokenizer = AutoTokenizer.from_pretrained(
MODEL_NAME,
trust_remote_code=True
)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype=torch.bfloat16,
device_map="auto",
trust_remote_code=True,
)
model.eval()
def describe_image(image_path, question="这张图里发生了什么?"):
image = Image.open(image_path).convert("RGB")
messages = [
{"role": "system", "content": "你是一个严谨的多模态理解助手。"},
{"role": "user", "content": [
{"type": "text", "text": question},
{"type": "image", "image": image},
]},
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=256,
do_sample=True,
top_p=0.9,
temperature=0.7,
)
response = tokenizer.decode(
outputs[0][inputs["input_ids"].shape[-1]:],
skip_special_tokens=True
)
return response.strip()
if __name__ == "__main__":
ans = describe_image("demo.jpg", "请帮我做一个面试题风格的图像理解说明。")
print(ans)
更多推荐


所有评论(0)