在这里插入图片描述

🧔 这里是九年义务漏网鲨鱼,研究生在读,主要研究方向是人脸伪造检测,长期致力于研究多模态大模型技术;国家奖学金获得者,国家级大创项目一项,发明专利一篇,多篇论文在投,蓝桥杯国家级奖项、妈妈杯一等奖。
✍ 博客主要内容为大模型技术的学习以及相关面经,本人已得到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 tokensarXiv+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 这个系列,分了几代,各自重点是什么?”

答题思路可以照着上面的结构简要复述,但注意节奏:

  1. 先一句话总括:

    “Qwen 是一整条从 Qwen1 → Qwen2 → Qwen2.5 → Qwen3 的大模型家族,覆盖文本、代码、数学、多模态和语音等场景。”

  2. 然后按时间线给出“每一代 + 一个关键词”:

    • 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 / RoPEarXiv+1

  1. 注意力:Grouped Query Attention (GQA)

    • 标准 MHA:每个头一套 KV;

    • MQA:所有头共享一套 KV;

    • GQA:若干个头共享一组 KV(多组 KV,每组对应一堆 Q 头)。
      好处是:在表达能力接近 MHA 的前提下,大幅降低 KV cache 内存和推理成本,非常适合长上下文场景。

  2. MLP:SwiGLU 代替 ReLU/GELU

    • 使用带门控的 SwiGLU 激活,比传统 FFN 更适合大模型容量扩展;
  3. 归一化:RMSNorm 代替 LayerNorm

    • RMSNorm 只归一化方差,不减均值,计算更简单,对深层大模型更稳定;
  4. 位置编码: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

  1. 大词表 + byte-level BPE

    • 词表规模大约在 15 万级别;

    • 采用 byte-level BPE,可以自然覆盖中文、英文、多语种以及代码字符;

    • 对中文既有汉字级 token,也有高频词 token,压缩率和表达力之间取得平衡。

  2. 预留多模态与工具调用相关 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 + 数据”两个维度回答:

  1. Tokenizer 层面

    • byte-level BPE + 大词表,对中文、英文、多语种、代码都足够灵活;

    • 对多模态 / 工具 / FIM 预留 token,避免后续模块“东拼西补”。

  2. 数据层面

    • 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 改大就行”的低级回答。比较完整的说法:

  1. 位置编码层面

    • 使用 RoPE(旋转位置编码),并通过提高 base 频率 + 插值,让模型的相对位置信号在更远范围内仍然可用;arXiv+1
  2. 训练策略层面

    • 预训练后期专门引入长上下文数据;

    • Post-training 阶段在长指令上做 SFT / RL,增强模型在长对话/长文任务上的表现。ABEJA Tech Blog+1

  3. 工程实现层面

    • 借助 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

  1. Naive Dynamic Resolution(NDR)

    • 不再强制把图片 resize 到统一分辨率;

    • 允许任意分辨率图片映射成不同数量的视觉 token;

    • 文档扫描、大图表、多物体场景会分配更多 token,简单图片 token 数则更少。

  2. 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

技术报告里有两个非常关键的设计:

  1. Thinker–Talker 架构

    • Thinker:一个 LLM,负责多模态理解与文本生成;

    • Talker:一个双轨自回归模块,直接基于 Thinker 的隐状态生成语音 token,实现 streaming 语音输出。

  2. TMRoPE(Time-aligned Multimodal RoPE)

    • Time-aligned Multimodal RoPE,用来对齐视频帧和音频帧的时间戳;

    • 通过交错块(interleaved chunking),将音/视 token 按时间顺序混合,使得 lip-sync 等时间敏感任务更稳定。arXiv+1


这时,典型的面试追问就是:

🧠 面试问题 6:Qwen2.5-Omni 和传统「ASR → LLM → TTS」流水线有什么本质区别?

可以从三点说:

  1. 端到端 vs 三段式

    • 传统做法是 ASR + 文本 LLM + TTS 三个模块拼接;

    • Qwen2.5-Omni 是一个端到端多模态模型,Thinker & Talker 在同一个系统里联合训练。

  2. 时间对齐

    • 借助 TMRoPE 对齐视频和音频,在唇形同步、视频描述、语音 QA 等任务上表现更自然。arXiv+1
  3. 延迟与体验

    • 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:偏能力提升

主要针对的是数学、代码、复杂推理这种“有明确对错”的任务:

  1. 用强模型生成多个 candidate 回答;

  2. 用奖励模型(RM)或执行器(代码执行、数学检查)对 candidate 打分;

  3. 构造 preference pair(好/坏回答);

  4. 用 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 在架构上的主要差异是什么?

答题要点:

  1. 都是 decoder-only,自回归语言模型;

  2. Qwen2.5 典型组合是:GQA + SwiGLU + RMSNorm + RoPE + QKV bias

  3. tokenizer 与数据分布更偏多语种、中文和代码,并预留大量多模态 / 工具调用 special token;

  4. 千问从一开始就成体系地推出了 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)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐