1. 从 Qwen 1 到 Qwen 3架构到底改了什么Qwen 3 是通义千问家族新一代开放权重模型包含稠密与 MoE 两条线总参覆盖 0.6B 到 235B旗舰 Qwen3-235B-A22B 每 token 激活约 22B。它仍然是 Decoder-only 的因果语言模型骨架延续 Pre-Norm RMSNorm RoPE SwiGLU GQA 这套现代主流配方。真正值得逐模块对照的是它相对 Qwen 1、Qwen 2 在注意力、归一化、位置编码、FFN 宽度和 MoE 路由上的具体改动。这篇文章面向想快速理解代际差异、并把它落到本地推理的开发者。我会按数据流顺序拆开每个模块给出 Qwen 1 / Qwen 2 / Qwen 3 的差异对照然后在后半段给出可复制的config.toml与settings.json骨架并演示通过 TaoToken 统一 Key/API 通道完成一次模型调用验证。你不需要先读完整个系列单看这一篇也能把骨干结构理清。先给一个整体判断Qwen 3 相对 Qwen 2 的硬变化主要有四处——去掉 QKV 线性层的 bias改成在注意力里对 Q、K 做 QK-Norm 稳住尺度词表从 Qwen2 报告的 151,646 扩到 151,669MoE 改为 128 个路由专家、每 token 激活 8 个、不设共享专家并加 global-batch 负载均衡长上下文走三阶段预训练加 ABF、YARN、DCA。思考与非思考模式是后训练和聊天模板塑造的行为不是多出来的神经网络层。2. 逐模块拆解注意力、FFN、归一化与位置编码2.1 整体数据流与单 Block 结构Qwen 3 没有 Encoder也没有交叉注意力。每一层只有带因果掩码的自注意力加前馈网络训练目标是只看当前位置之前的 token 预测下一个。整体数据流可以记成纯文本 → TokenizerBBPE→ token ID 序列 → Embedding 查表得到X ∈ R^(L × d_model)→ 堆叠 N 个 Transformer Block → 最后一层隐藏状态取最后位置 → LM Head → 词表 logits → Softmax。单个 Block 的顺序是RMSNorm → 因果 GQA 自注意力含 RoPE、QK-Norm→ 残差 → RMSNorm → SwiGLU FFN → 残差。MoE 型号里自注意力整段与稠密相同只把 FFN 段换成门控加多专家。2.2 注意力从 MHA 到 GQA再到无 bias QK-NormQwen 1 报告基线以 MHA 为主Q、K、V 三个线性层都带 bias。Qwen 2 稠密全系改为 GQA但 QKV bias 仍在。Qwen 3 稠密全系仍是 GQA但报告写明去掉 QKV bias改用 QK-Norm。GQA 的直觉是MHA 每个 Query 头各自对应一套 K、VKV Cache 随头数线性涨MQA 全部头共享一套GQA 让多个 Q 头分组共用较少的 K、V 头。记h_q为 Query 头数h_kv为 KV 组数g h_q / h_kv则第 t 个 Q 头对应的 KV 组下标为u floor((t-1)/g) 1。以 Qwen3-8B 常见的 32 Q 头 / 8 KV 头为例头 1–4 共用第一组 K、V头 5–8 共用第二组依此类推。去掉 bias 后线性投影只保留Q X W_Q、K X W_K、V X W_V。随后对 Q、K 的每一行在d_k维内做 RoPE形状不变再在算点积之前做 QK-Norm常用 RMSNorm 作用在每个 head 的d_k维上得到S Q_norm K_norm^T / sqrt(d_k)。这个顺序很关键线性 → RoPE → q_norm / k_norm → 点积与「先 Norm 再 RoPE」在数值上不等价移植代码时要对齐。2.3 归一化RMSNorm 与 Pre-Norm 三代一致对单行向量xRMSNorm 先算均方根尺度RMS(x) sqrt(eps mean(x_j^2))再x / RMS(x) * gamma。它不减均值、无平移 beta比 LayerNorm 更省算。Pre-Norm 指先归一化再进子层再与残差流相加深层训练更稳。Qwen 1 / 2 / 3 在这一点上是一致的每层注意力前和 FFN 前各有一处 RMSNorm。2.4 位置编码RoPE 与长上下文演进三代共同点是不在 Embedding 上加绝对位置向量而是在每一层、算QK^T之前对 Q、K 施加 RoPE让注意力分数体现相对位置。差异在长上下文Qwen 1 预训练上下文相对短多靠推理期 NTK 等技巧Qwen 2 训练末段拉到 32KRoPE 基频从10^4调到10^6配合 YARN、DCAQwen 3 走三阶段预训练长阶段 32K同样用 ABF 把基频抬到10^6配合 YARN DCA报告称推理上可获得相对训练窗约 4 倍的序列容量。2.5 FFNSwiGLU 同型宽度按代际变SwiGLU 形式为(swish(X W_1) ⊙ (X W_3)) W_2其中W_1, W_3把d_model映到d_ffW_2映回。Qwen 1 报告常写d_ff 8/3 * d_modelQwen 2 / Qwen 3 不再用单一比例概括各尺寸以配置表为准。例如公开 Qwen3-8B 的intermediate_size为 12288约3 * d_modeld_model 4096。2.6 MoEQwen 3 相对 Qwen 2 的路由差异MoE 只替换每个 Block 里的 FFN注意力子层与稠密同型。门控输出 logits 经 softmax 得ptop-k 选专家路由支路为y sum(p_i * R_i(x))。Qwen 2 典型叙述是 64 路由专家、top-8、有共享专家Qwen 3 改为 128 路由专家、top-8、无共享专家并加 global-batch 负载均衡。Qwen3-30B-A3B 与 Qwen3-235B-A22B 都是 128 / 8 配置。2.7 三代架构对照速查维度Qwen 1Qwen 2Qwen 3骨干Decoder-onlyPre-NormRMSNormRoPESwiGLU同左同左稠密注意力报告基线 MHA全系 GQA全系 GQAQKV bias有有无Q/K 稳定化bias RoPE同左QK-NormRoPE 后、点积前词表报告~152K151,646151,669长上下文推理技巧为主训练 32K 10^6 YARN DCA三阶段 长阶段 32K ABF YARN DCAMoE—共享专家 路由64/8 等128/8无共享专家global-batch 均衡3. TaoToken 前置统一 Key 与 API 通道要把上面的架构理解落到一次真实调用你需要一个能统一管理 Key 和 API 通道的入口。TaoToken 提供模型对话、Coding Plan、控制台、API Keys 和接入文档几个入口适合在本地推理脚本里统一配置。官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 基址https://taotoken.net/api常用 deep link均带 utm_source 与 utm_contentcampaign 为 rewrite模型对话https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewriteCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteClaudeCodeAnthropichttps://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_codeutm_campaignrewrite注意API 基址不加 UTM 参数直接使用https://taotoken.net/api即可。Key 请放在环境变量里不要硬编码进脚本。4. 可复制配置config.toml 与 settings.json 骨架下面给出两个骨架文件。config.toml用于本地推理脚本读取模型与通道参数settings.json用于客户端或工具链读取。字段名按常见约定你可以按自己项目调整。# config.toml [model] name qwen3-8b family qwen3 dtype bfloat16 max_seq_len 32768 rope_base 1000000.0 use_qk_norm true qkv_bias false num_layers 36 hidden_size 4096 intermediate_size 12288 num_attention_heads 32 num_key_value_heads 8 [provider] base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY timeout_sec 60 max_retries 3 [generation] temperature 0.7 top_p 0.8 top_k 20 repetition_penalty 1.05{ provider: { base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, default_model: qwen3-8b }, model: { family: qwen3, rope_base: 1000000.0, use_qk_norm: true, qkv_bias: false, num_key_value_heads: 8 }, runtime: { dtype: bfloat16, max_seq_len: 32768, flash_attention: true } }提示rope_base、use_qk_norm、qkv_bias这三个字段直接对应第 2 节的架构差异。如果你在对比 Qwen 2 与 Qwen 3 的行为先把qkv_bias设为true跑一次再设为false并打开use_qk_norm观察同一 prompt 下 logits 分布的变化。5. 验证请求通过 TaoToken 完成一次模型调用配置就绪后用一段最小 Python 脚本验证通道是否打通。先设置环境变量export TAOTOKEN_API_KEY你的Key然后运行import os import json import urllib.request base_url https://taotoken.net/api api_key os.environ[TAOTOKEN_API_KEY] payload { model: qwen3-8b, messages: [ {role: user, content: 用一句话说明 Qwen 3 的 QK-Norm 作用在哪个位置。} ], temperature: 0.7, max_tokens: 128 } req urllib.request.Request( urlf{base_url}/v1/chat/completions, datajson.dumps(payload).encode(utf-8), headers{ Content-Type: application/json, Authorization: fBearer {api_key} }, methodPOST ) with urllib.request.urlopen(req, timeout60) as resp: data json.loads(resp.read().decode(utf-8)) print(data[choices][0][message][content])成功时你会看到一段关于 QK-Norm 位于 RoPE 之后、点积之前的回答。如果返回 401检查 Key 是否放进了环境变量如果返回 404检查base_url是否误加了路径后缀如果超时把timeout调到 120 秒再试。6. 本篇常见错排查报错一KeyError: TAOTOKEN_API_KEY。环境变量没导出或者你在 IDE 里运行但没继承 shell 环境。在脚本开头加os.environ.setdefault兜底或改用.env文件加载。报错二401 Unauthorized。Key 拼写错误、带了多余空格或者用了已失效的 Key。到 API Keys 页面重新生成一个粘贴时注意不要带换行。报错三404 Not Found。最常见的是把base_url写成了https://taotoken.net/api/v1又在代码里拼了一次/v1/chat/completions。统一用https://taotoken.net/api作为基址路径在请求时拼。报错四model not found。模型名与通道支持的名称不一致。先到模型对话页面确认可用模型名再回填到config.toml的name字段。报错五长上下文截断。max_seq_len设成了 32768但实际请求超过了模型默认上下文。Qwen 3 报告称推理上可获得约 4 倍训练窗容量但产品默认上下文仍以各型号说明为准先按 32K 保守设置。报错六QK-Norm 顺序写反。如果你在本地复现 Qwen 3 注意力把q_norm放在了 RoPE 之前数值会和官方实现不一致。正确顺序是线性 → RoPE → q_norm / k_norm → 点积。7. 下一步按场景选入口如果你主要在做接入和排障建议先看 API Keys 和接入文档把通道和 Key 管理固定下来API Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite如果你只是想快速验证某个模型的行为直接走模型对话入口模型对话https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite如果你要长期做编码或 Agent 类任务Coding Plan 更适合把调用配额和通道固定下来Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite我试过把config.toml里的qkv_bias和use_qk_norm做成开关在同一台机器上对比 Qwen 2 与 Qwen 3 的注意力输出分布能明显看到去掉 bias 后 logits 尺度更依赖 QK-Norm 来稳住。你可以先按第 5 节的脚本跑通一次调用再回到第 2 节的模块对照把每个字段和架构改动一一对应起来。