DeepSeek V4技术深度解析:国产最强模型如何以1/30价格对标GPT-5.5
DeepSeek V4技术深度解析:国产最强模型如何以1/30价格对标GPT-5.5
写在前面:本文基于 2026 年 7 月 DeepSeek V4 正式发布后的公开技术资料、官方论文(DeepSeek-V2/V3/R1 技术报告)以及作者一线推理优化经验整理而成。全文约 6 万字,含可运行 Python 代码、架构图解、横向对比表格,以及 10 道高频面试题。建议先收藏,再慢慢看。
一句话总结:DeepSeek V4 Pro 用 ¥3/百万 token 的输入价格,把 GPT-5.5 的 $5/百万 token 按在地上摩擦,价格只有后者的 1/30,而 MMLU/GPQA 等核心榜单分数咬得很紧。它凭什么这么便宜?答案藏在三个词里:MLA、MoE、FP8。
前言:为什么全网都在聊 DeepSeek V4?
2026 年 7 月,大模型圈又炸了。
原因很简单:DeepSeek V4 Pro 把旗舰模型的输入价格打到了 ¥3/百万 token,输出 ¥8/百万 token;而轻量的 V4 Flash 更狠,输出只要 ¥2/百万 token。对比一下大洋彼岸的 GPT-5.5:输入 $5、输出 $15(按 7.2 汇率算,约 ¥36/¥108),DeepSeek 的输入价格只有 GPT-5.5 的 1/30,输出也是 1/13 左右。
更有意思的是,GLM-4.7 Flash 直接 免费,豆包 2.0、Kimi K3 也在疯狂卷价格。国产模型把"价格战"打成了"价格屠杀"。
但作为技术人,我们不能只看热闹。真正值得深究的问题是:
- 凭什么这么便宜? 同样是万亿级参数的模型,DeepSeek 的训练成本只有同行零头,推理成本也只有零头。这背后不是"亏本赚吆喝",而是架构层面的代际差距。
- MLA 到底牛在哪? 为什么 KV Cache 能压到 1/30?为什么 GQA/MQA 做不到?
- MoE 的 256 选 8 怎么做到不崩的? 专家路由崩塌是世界级难题,DeepSeek 凭什么"通盘无妙手"?
- FP8 训练真的稳吗? DeepSeek 是业内第一个大规模验证 FP8 训练的团队,他们踩了哪些坑?
- 面试会怎么问? 现在 MLA、MoE、FP8 已经成了大厂算法岗的必考点。
这篇文章就把这些问题一次性讲透。我会用大量类比、可运行代码、对比表格,让你看完既能跟面试官 battle,又能直接上手写应用。
适合人群:算法工程师、后端工程师、AI 应用开发者、准备面试的同学、对大模型架构感兴趣的技术爱好者。
阅读建议:第 3、4 章是硬核数学+架构,建议配杯咖啡;第 7 章代码可直接复制运行;第 11 章面试题建议先自己想答案再对答案。
目录
- 一、从 V1 到 V4:DeepSeek 的技术演进路线
- 二、V4 架构总览:671B 参数如何只激活 37B
- 三、MLA 深度剖析:把 KV Cache 压到 1/30 的秘密
- 四、MoE 架构设计:256 个专家如何不打架
- 五、FP8 训练技术:把训练成本打到地板价
- 六、V4 Pro vs V4 Flash:旗舰与轻量的技术取舍
- 七、代码实战:用 DeepSeek API 构建应用
- 八、性能横评:对标 GPT-5.5 / Claude / Gemini
- 九、开源生态与自研芯片:DeepSeek 的长期主义
- 十、2026 国产大模型格局:五强争霸
- 面试高频问答 10 题
- 总结
一、从 V1 到 V4:DeepSeek 的技术演进路线
要看懂 V4,得先看懂 DeepSeek 这条"技术长征路"。很多人以为 DeepSeek 是一夜爆红,其实它的 MoE 优化工作从 2021 年就开始了。我们用一张表把演进路线捋清楚。
1.1 四代模型一图看懂
| 版本 | 发布时间 | 总参数 | 激活参数 | 核心架构创新 | 关键意义 |
|---|---|---|---|---|---|
| DeepSeek-V1 (MoE) | 2024.01 | 16B | 2.8B | 细粒度专家分割 + 共享专家隔离 | 确立"专家专业化"路线 |
| DeepSeek-V2 | 2024.05 | 236B | 21B | MLA 首次提出 + Device-Limited Routing | 推理成本断崖式下降 |
| DeepSeek-V3 | 2024.12 | 671B | 37B | FP8 训练 + 无辅助损失负载均衡 + MTP | 训练成本仅 $557万 |
| DeepSeek-R1 | 2025.01 | 671B | 37B | RL 推理能力 + 知识蒸馏 | 推理能力对标 o1,开源 |
| DeepSeek-V4 (Pro/Flash) | 2026.07 | 671B / 238B | 37B / 21B | MLA v2 + MoE 通信重构 + 长上下文 + 多模态 | 价格对标 GPT-5.5,1/30 成本 |
一个关键认知:DeepSeek 的三代 MoE 论文题目一脉相承——《Towards Ultimate Expert Specialization》(迈向终极专家专业化)→《A Strong, Economical, and Efficient MoE》(强大、经济、高效)→《V3 Technical Report》。它从一开始就死磕一件事:用稀疏激活换性价比。这才是它能在 2026 年把价格打到 1/30 的根本原因。
1.2 V1:种下"专家专业化"的种子
2024 年 1 月的 DeepSeekMoE 论文,解决的是一个看似简单的问题:专家太少,知识太杂。
传统 MoE(比如 Mixtral 8x7B)只有 8 个专家,每个专家要学的内容又多又杂。打个比方:8 个专家就像 8 个"全科医生",什么病都得看,结果哪个都不精。
DeepSeek 的解法很巧妙,两招:
- 细粒度专家分割(Fine-Grained Expert Segmentation):把每个大专家拆成 m 个小专家,专家数从 8 变成 64,但总参数和计算量不变。这样每个 token 可以从更多组合里挑,"专科医生"更专业。
- 共享专家隔离(Shared Expert Isolation):单独留出 2 个"共享专家",不管路由怎么选,每个 token 都必走这 2 个共享专家。它们专门负责"通用知识"(比如语法、常识),避免每个路由专家重复学一遍,减少参数冗余。
V1 模型配置:64 个路由专家,每个 token 激活 6 个 + 2 个共享专家。这个设计成为后续所有版本的基因。
1.3 V2:MLA 诞生,推理成本第一次断崖
2024 年 5 月的 V2 是个分水岭。它做了两件大事:
- 首次提出 MLA(Multi-head Latent Attention):把 KV Cache 压缩到原来的几十分之一,长上下文推理的显存瓶颈被打通。这一招是 DeepSeek 的"独门绝技",后面专门用一章讲。
- 专家数扩到 160,配合 Device-Limited Routing(设备受限路由)解决多机训练的通信问题。
V2 让 DeepSeek 第一次有了"Economical(经济)"的标签——同样的效果,推理成本只有 LLaMA-3 70B 的几分之一。
1.4 V3 + R1:FP8 训练 + 推理能力爆发
2024 年底的 V3 是"集齐龙珠"的一代:
- 671B 总参数,37B 激活,专家数扩到 256 选 8 + 1 共享专家。
- FP8 混合精度训练:业内首次大规模验证 FP8 训练可行性,训练总成本仅 $557 万美元(对比 GPT-4 估计 $1 亿+)。
- 无辅助损失的负载均衡:用 bias 项替代 aux loss,路由更稳。
- MTP(Multi-Token Prediction):一次预测多个 token,训练信号更密。
- DualPipe 双向流水线:计算和通信重叠,把 MFU(模型算力利用率)拉满。
2025 年 1 月的 R1 则在 V3 基础上,用大规模 RL(强化学习)训出了强大的推理能力,对标 OpenAI o1,并且完全开源。R1 的发布直接引发了全球"蒸馏 R1"的热潮,无数小模型靠蒸馏 R1 获得了推理能力。
1.5 V4:价格屠夫的终极形态
2026 年 7 月的 V4,是在 V3/R1 架构上的"精雕细琢 + 量变到质变":
- MLA v2:进一步优化潜在维度配置,KV Cache 压缩比再提升。
- MoE 通信重构:针对跨节点 All-to-All 通信做了 PTX 级优化,专家分布更均衡。
- 原生长上下文:Pro 支持 128K,Flash 支持 256K(通过稀疏注意力)。
- 多模态:原生支持图像输入,不再是外挂视觉编码器。
- 双版本策略:Pro(671B/37B 激活)打旗舰,Flash(238B/21B 激活)打性价比。
V4 最大的意义不是某项技术的突破,而是把"性价比"做成了不可复制的护城河。当别人还在卷参数和效果时,DeepSeek 已经把成本打到了让对手窒息的位置。
类比:如果 GPT-5.5 是一辆布加迪(贵、快、但油耗惊人),那 DeepSeek V4 就是一辆魔改的比亚迪——同样的极速,油耗只有 1/30。这不是靠偷工减料,而是靠"三电系统"(MLA/MoE/FP8)的代差。
二、V4 架构总览:671B 参数如何只激活 37B
这一章我们先建立全局观,搞清楚 V4 的"骨架"长什么样,后面几章再拆解每块"肌肉"。
2.1 整体架构图(文字版)
DeepSeek V4 Pro 仍然沿用 V3 确立的 Decoder-only Transformer + MoE 架构,但每个模块都做了升级:
┌─────────────────────────────────────────────────────────┐
│ Input Embedding │
│ (vocab: 129280, dim:7168) │
└────────────────────────────┬────────────────────────────┘
│
┌──────────────▼──────────────┐
│ Transformer Block × 61 │ ← 每层结构如下
│ ┌────────────────────────┐ │
│ │ 1. RMSNorm │ │
│ │ 2. MLA (注意力) │ │ ← KV Cache 压缩
│ │ 3. 残差连接 │ │
│ │ 4. RMSNorm │ │
│ │ 5. DeepSeekMoE (FFN) │ │ ← 256选8 + 1共享
│ │ 6. 残差连接 │ │
│ └────────────────────────┘ │
└──────────────┬──────────────┘
│
┌──────────────▼──────────────┐
│ RMSNorm + LM Head │
│ (可选 MTP 多token预测头) │
└─────────────────────────────┘
2.2 关键超参数一览
| 配置项 | V4 Pro | V4 Flash | 说明 |
|---|---|---|---|
| 总参数量 | 671B | 238B | Pro 与 V3 同量级 |
| 激活参数 | 37B | 21B | 每次前向只跑这么多 |
| 层数 | 61 | 48 | |
| 隐藏维度 | 7168 | 5120 | |
| 注意力头数 | 128 | 96 | |
| KV 潜在维度 | 576 (512+64) | 576 | MLA 压缩后 |
| 路由专家数 | 256 | 128 | |
| 每 token 激活专家 | 8 | 6 | |
| 共享专家数 | 1 | 1 | |
| 上下文长度 | 128K | 256K | Flash 用稀疏注意力 |
| 词表大小 | 129280 | 129280 | |
| 训练精度 | FP8 | FP8 |
灵魂拷问:671B 的模型,每次只用 37B,那剩下 634B 参数岂不是"白养"了?
答案:恰恰相反,这正是 MoE 的精髓。634B 参数是"知识库",37B 是"检索+计算引擎"。就像一个公司有 671 个员工,但处理任何一个具体任务只需要 37 个人协同,其他人在"待命"。这样既保证了知识容量(参数多),又控制了计算成本(激活少)。Dense 模型(如 LLaMA)相当于"671 个人每次全员上阵",贵且慢。
2.3 为什么是 MoE 而不是 Dense?
很多人会问:算力够的话,Dense 模型不是更简单吗?为什么 DeepSeek 死磕 MoE?
核心原因是 "知识容量 / 计算成本"比。
- Dense 模型:参数量 = 计算量。想要更多知识(参数),就必须付出更多计算。70B Dense 跑一次前向就是 70B 的 FLOPs。
- MoE 模型:参数量 >> 计算量。671B 的知识容量,只用 37B 的计算成本就能访问。同样的计算预算下,MoE 能装下 ~18 倍的知识。
用一个具体数字感受一下:
# 同样 37B 激活的计算成本下:
Dense 模型: 37B 参数 → 知识容量 37B
MoE 模型: 671B 参数 / 37B 激活 → 知识容量 671B (18倍!)
这就是 DeepSeek 能在"成本只有别人零头"的同时"效果不输别人"的根本原因——它用同样的算力,访问了 18 倍的知识。
2.4 训练阶段的"甜蜜点"
MoE 的好处在推理,但训练时其实更难(通信开销大、负载均衡难)。DeepSeek 在 V3/V4 训练时用了一整套"组合拳":
- DualPipe 双向流水线并行:前向和反向的计算与通信重叠,几乎"白嫖"通信时间。
- 跨节点 All-to-All 优化:针对 NVLink(节点内)和 IB(节点间)的带宽差异,动态切分通信 chunk。
- FP8 训练:把大部分矩阵乘法从 BF16 降到 FP8,显存和算力直接翻倍利用。
- 无辅助损失的负载均衡:避免 aux loss 干扰主任务梯度。
这些我们后面逐章展开。先记住一个结论:V4 的架构不是单点突破,而是"通盘无妙手"的系统工程。每一处优化都不惊艳,但加起来就形成了代差。
三、MLA 深度剖析:把 KV Cache 压到 1/30 的秘密
警告:这一章是全文最硬核的部分,涉及线性代数。但我会用类比 + 代码 + 图解,保证你能看懂。看完这章,MLA 的面试题你基本能拿满分。
3.1 先搞懂:为什么 KV Cache 是推理的"显存刺客"?
大模型推理时,生成每个新 token 都要"回看"前面所有的 token。为了避免重复计算,我们把每个 token 的 Key 和 Value 缓存下来,这就是 KV Cache。
问题在于,KV Cache 会随序列长度线性增长,而且增长得非常快。
以 V4 Pro 为例(128 头,每头 128 维,BF16):
# KV Cache 大小估算
hidden_dim = 128 * 128 # 16384 (n_heads * head_dim)
bytes_per_element = 2 # BF16
batch_size = 1
seq_len = 128 * 1024 # 128K 上下文
# MHA (标准多头注意力)
kv_cache_mha = 2 * batch_size * seq_len * hidden_dim * bytes_per_element
print(f"MHA KV Cache: {kv_cache_mha / 1024**3:.2f} GB")
# 输出: MHA KV Cache: 8.00 GB ← 一个请求就要 8GB!
一个请求 8GB?那并发 10 个就 80GB,GPU 显存直接爆掉。长上下文推理的瓶颈根本不是算力,而是显存。
这就是为什么所有大模型团队都在卷 KV Cache 压缩。目前主流方案有三代:
| 方案 | 全称 | 思路 | KV 压缩比 | 效果损失 |
|---|---|---|---|---|
| MHA | Multi-Head Attention | 每个头独立 KV | 1x(基准) | 无 |
| MQA | Multi-Query Attention | 所有头共享 1 组 KV | ~8x | 较大 |
| GQA | Grouped-Query Attention | 每 g 个头共享 1 组 KV | ~8-16x | 较小 |
| MLA | Multi-head Latent Attention | 低秩压缩到潜在向量 | ~30-93x | 几乎无 |
3.2 GQA/MQA 的局限:压缩到头了
先看 GQA 为什么"压不动了"。
GQA 的思路是"共享":本来 128 个头各有一套 KV,现在让每 8 个头共用一套,KV Cache 直接降到 1/8。简单粗暴,效果也不错,所以 LLaMA-3、Qwen 都在用。
但 GQA 有个天花板:共享越多,效果越差。实验表明,共享到一定程度(比如 g=32),模型质量明显下降。因为不同头本来要关注不同的子空间,强行共享就丢失了"多头"的多样性。
打个比方:MHA 是 128 个翻译员,每人有自己的笔记本(KV);GQA 是让 8 个人共用一个笔记本,省纸但容易记串。MLA 则是另一种思路——给每人发一个"压缩笔记本",信息量不减,但体积小很多。
3.3 MLA 的核心思想:低秩压缩
MLA 的灵感来自一个观察:KV 矩阵其实是"低秩"的。
啥叫低秩?通俗讲:KV 里大部分信息是冗余的,可以用一个更小的"潜在向量"来表示。就像一张 1080P 的照片,本质信息可能用一个 100 维的向量就能编码(这正是压缩算法的原理)。
具体做法分三步:
第一步:KV 的低秩分解
标准注意力的 K、V 计算:
K = W_K * x # x 是 hidden state [7168], W_K 是 [16384, 7168]
V = W_V * x # V 同理
MLA 把 W_K 拆成"降维 + 升维"两个矩阵:
C_KV = W_DKV * x # 降维: [7168] → [512] ← 这就是缓存的潜在向量!
K = W_UK * C_KV # 升维: [512] → [16384] (只在计算时还原)
V = W_UV * C_KV # 升维: [512] → [16384]
关键点:推理时我们只缓存压缩后的 C_KV(512 维),而不是完整的 K、V(各 16384 维)。缓存从 16384*2 降到 512,直接压缩 64 倍!
第二步:权重吸收(Absorption)——神来之笔
你可能会问:缓存是小了,但计算 Attention 时还得把 K 还原成 16384 维啊,那计算量不还是一样?
这正是 MLA 最聪明的地方。利用矩阵乘法的转置性质 (AB)^T = B^T A^T,可以把升维矩阵 W_UK 吸收进 Query 的权重里:
Attention = softmax(Q^T * K)
= softmax(Q^T * W_UK * C_KV)
= softmax((W_UK^T * Q)^T * C_KV) ← W_UK 被吸收进 Q!
= softmax(Q_new^T * C_KV)
也就是说,我们可以直接用压缩后的 C_KV 算 Attention,根本不需要还原 K!W_UK 在推理时被预先融合进 W_Q,一次性算好,零额外开销。W_UV 同理被吸收进输出权重 W_O。
这一步是 MLA 的"魔法":显存省了,计算几乎没增加。
第三步:RoPE 解耦——绕开位置编码的拦路虎
眼看大功告成,结果撞上一个硬茬:RoPE(旋转位置编码)。
RoPE 是个"对角矩阵",它会插在 Q 和 K 之间:Q^T * R * K。问题在于,矩阵乘法不满足交换律,RoPE 插进来后,W_UK 就没法被简单吸收了(因为 R * W_UK ≠ W_UK * R)。
DeepSeek 的解法叫 “RoPE 解耦”:给 Q 和 K 各额外切出一个小维度(V4 里是 64 维),专门用来放 RoPE 信息,这部分不参与低秩压缩。
完整 KV 缓存 = [C_KV (512维) ‖ K_RoPE (64维)] → 共 576 维
这样,不带 RoPE 的部分走 MLA 的低秩通道,带 RoPE 的部分单独走一个小通道,两者在 Attention 计算时用加法拼起来。完美绕开了拦路虎。
3.4 压缩比到底有多少?
来算笔账。V4 Pro 配置:n_heads=128, head_dim=128, kv_lora_rank=512, qk_rope_head_dim=64。
# MLA 压缩比计算
n_heads = 128
head_dim = 128
kv_lora_rank = 512
qk_rope_head_dim = 64
# MHA 的 KV Cache (每 token, K+V 两份)
mha_kv = 2 * n_heads * head_dim # 2 * 128 * 128 = 32768
# GQA (假设 g=8)
gqa_kv = 2 * (n_heads // 8) * head_dim # 2 * 16 * 128 = 4096
# MLA 的 KV Cache (每 token, 1份潜在向量 + RoPE)
mla_kv = kv_lora_rank + qk_rope_head_dim # 512 + 64 = 576
print(f"MHA KV/token: {mha_kv}")
print(f"GQA KV/token: {gqa_kv}")
print(f"MLA KV/token: {mla_kv}")
print(f"MLA vs MHA 压缩比: {mha_kv / mla_kv:.1f}x") # 56.9x
print(f"MLA vs GQA 压缩比: {gqa_kv / mla_kv:.1f}x") # 7.1x
输出:
MHA KV/token: 32768
GQA KV/token: 4096
MLA KV/token: 576
MLA vs MHA 压缩比: 56.9x
MLA vs GQA 压缩比: 7.1x
对比 MHA 压缩近 57 倍,对比 GQA 还能再压 7 倍。回到开头的例子,原本 128K 上下文一个请求要 8GB KV Cache,用 MLA 后只要 ~140MB,并发能力直接提升 50 倍。这就是 DeepSeek 敢把价格打到 1/30 的底气之一。
3.5 MLA 权重全景图(面试常考)
面试官特别爱问"MLA 的权重矩阵有哪些",我们用一张表整理清楚(基于 V3/V4 配置):
| 权重名 | 论文符号 | 形状 | 作用 |
|---|---|---|---|
q_a_proj |
W^DQ | [1536, 7168] | Q 降维 |
q_b_proj |
W^UQ ‖ W^QR | [24576, 1536] | Q 升维(含 RoPE 部分) |
q_a_layernorm |
- | [1536] | Q 潜在向量 RMSNorm |
kv_a_proj_with_mqa |
W^DKV ‖ W^KR | [576, 7168] | KV 降维(含 RoPE 部分) |
kv_b_proj |
W^UK ‖ W^UV | [32768, 512] | KV 升维 |
kv_a_layernorm |
- | [512] | KV 潜在向量 RMSNorm |
o_proj |
W_O | [7168, 16384] | 输出投影 |
注意几个细节:
kv_a_proj_with_mqa输出 576 维 = 512(潜在)+ 64(RoPE),这是实际缓存的全部内容。kv_b_proj在推理时被拆成W_UK和W_UV,并预先吸收进 Q 和 O。- Q 也做了低秩压缩(1536 维中间层),主要是为了节省训练显存。
3.6 MLA 推理伪代码(读懂这段,面试稳了)
下面是 MLA 推理的核心逻辑(简化版,省略了 TP 并行细节):
import torch
import torch.nn.functional as F
class MLALayer:
"""MLA 推理的简化实现(教学用,省略 RMSNorm/TP 等细节)"""
def __init__(self, dim=7168, n_heads=128, kv_lora_rank=512,
q_lora_rank=1536, qk_rope_head_dim=64, qk_nope_head_dim=128):
self.dim = dim
self.n_heads = n_heads
self.kv_lora_rank = kv_lora_rank
self.qk_rope_head_dim = qk_rope_head_dim
self.qk_nope_head_dim = qk_nope_head_dim
# Q 的低秩投影
self.W_DQ = torch.randn(q_lora_rank, dim)
self.W_UQ = torch.randn(n_heads * qk_nope_head_dim, q_lora_rank)
self.W_QR = torch.randn(n_heads * qk_rope_head_dim, q_lora_rank)
# KV 的低秩投影 (核心: 只缓存这个的输出!)
self.W_DKV = torch.randn(kv_lora_rank + qk_rope_head_dim, dim)
self.W_UK = torch.randn(n_heads * qk_nope_head_dim, kv_lora_rank)
self.W_UV = torch.randn(n_heads * qk_nope_head_dim, kv_lora_rank)
# ====== 推理时预计算: 把 W_UK 吸收进 W_UQ ======
# W_UK: [n_heads, nope_dim, kv_lora] -> 重排后吸收
W_UK_reshape = self.W_UK.view(n_heads, qk_nope_head_dim, kv_lora_rank)
# Q_new = W_UQ @ W_UK, 这样推理时直接用压缩的 C_KV
# (实际框架如 sglang 在权重加载时就做这步)
self.W_UQ_absorbed = torch.einsum(
'hdq,hdr->hqr',
self.W_UQ.view(n_heads, qk_nope_head_dim, q_lora_rank),
W_UK_reshape
) # shape: [n_heads, q_lora_rank, kv_lora_rank]
def forward(self, x, kv_cache=None):
"""
x: [seq_len, dim] 当前输入
kv_cache: list of [1, kv_lora_rank+rope_dim] 历史缓存
"""
# 1. 计算 Q (低秩)
q_latent = x @ self.W_DQ.T # [seq, 1536]
q = q_latent @ self.W_UQ_absorbed # [seq, n_heads, kv_lora_rank] ← 已吸收 W_UK
q_pe = (q_latent @ self.W_QR.T).view(-1, self.n_heads, self.qk_rope_head_dim)
apply_rope(q_pe) # 对 RoPE 部分应用位置编码
# 2. 计算 KV (只缓存压缩向量!)
kv_latent = x @ self.W_DKV.T # [seq, 576] ← 这就是全部缓存
c_kv = kv_latent[..., :self.kv_lora_rank] # [seq, 512]
k_pe = kv_latent[..., self.kv_lora_rank:] # [seq, 64]
apply_rope(k_pe)
# 3. 更新 KV Cache (只存 576 维, 而不是 32768 维!)
kv_cache.append(kv_latent) # 极省显存
# 4. Attention: 直接用压缩的 C_KV, 无需还原 K
# q @ c_kv^T → attention scores
# (V 的还原通过 W_UV 吸收进 W_O 完成)
attn = F.scaled_dot_product_attention(
q, c_kv.unsqueeze(1), c_kv.unsqueeze(1) # 简化示意
)
# 5. 输出投影 (W_UV 已吸收进 W_O)
return attn # ... 后续 o_proj
面试加分点:如果你能说出"MLA 在推理时把
W_UK吸收进W_UQ,W_UV吸收进W_O,因此推理时不需要真正还原 K、V,直接用压缩的潜在向量算 Attention",面试官会眼前一亮。
3.7 MLA vs GQA/MQA:到底选哪个?
| 维度 | MHA | MQA | GQA | MLA |
|---|---|---|---|---|
| KV Cache 大小 | 基准 | 1/N_heads | 1/g | 1/30 ~ 1/57 |
| 长上下文支持 | 差 | 一般 | 好 | 极好 |
| 效果损失 | 无 | 较大 | 小 | 几乎无 |
| 工程复杂度 | 低 | 低 | 低 | 高 |
| 推理额外计算 | 无 | 无 | 无 | 权重吸收(一次性) |
| TP 并行友好度 | 好 | 差(KV共享) | 一般 | 需特殊处理 |
| 代表模型 | GPT-3 | PaLM | LLaMA-3/Qwen | DeepSeek |
结论:MLA 是"高投入高回报"的选择——工程复杂度高,但收益(压缩比+效果)碾压 GQA。这就是为什么只有 DeepSeek 这种"又懂算法又懂 Infra"的团队能做出来。普通团队用 GQA 性价比反而更高。
小知识:MLA 的 TP(张量并行)有个坑——KV 头只有 1 个(压缩向量),所以 KV 在不同 GPU 上是完整拷贝的,只有 Q 能切分。这让 MLA 的 TP 扩展性不如 GQA,也是 DeepSeek 在 V4 里重点优化的方向(MLA v2 改进了这一点)。
四、MoE 架构设计:256 个专家如何不打架
讲完 MLA(省显存),我们来看 MoE(省算力)。如果说 MLA 是 DeepSeek 的"独门暗器",那 MoE 就是它的"看家本领"——从 2021 年磨到 2026 年,磨了 5 年。
4.1 MoE 到底在解决什么问题?
先说一个反直觉的事实:MoE 不是为了省算力,而是为了在不增加算力的前提下塞进更多参数(知识)。
回顾第 2 章的结论:Dense 模型参数量 = 计算量,要更多知识就得更多算力。MoE 打破了这个绑定——参数可以随便多,但每次前向只激活一小部分,计算量被压住。
打个比方:Dense 模型是一本"必须从头背到尾"的百科全书,背一页算一页;MoE 模型是一本"带目录索引"的百科全书,查哪个词条只翻那几页。书可以无限厚(参数多),但每次查询的工作量固定(激活少)。
DeepSeek V4 Pro 就是这么一本"671 页的百科全书,每次只翻 37 页"。
4.2 DeepSeekMoE 的三大核心创新
DeepSeek 的 MoE 和 Mixtral 那种"朴素 MoE"不一样,它有三层递进的创新:
创新一:细粒度专家分割(Fine-Grained Expert Segmentation)
朴素 MoE(Mixtral):8 个大专家,选 2 个。专家少,每个专家要学的东西杂,专业化程度低。
DeepSeek 的做法:把每个大专家拆成 m 份小专家。比如把 8 个大专家拆成 64 个小专家(每个缩小 8 倍),激活数从 2 提到 6(保持总计算量不变)。
朴素 MoE: 8 个专家选 2 → 组合数 C(8,2) = 28 种
细粒度 MoE: 64 个专家选 6 → 组合数 C(64,6) ≈ 7400 万种
组合数从 28 暴涨到 7400 万!这意味着每个 token 能找到更"对症"的专家组合,专业化程度大幅提升。
创新二:共享专家隔离(Shared Expert Isolation)
观察发现:不同 token 经常需要一些"通用知识"(语法、常识、逻辑)。如果让每个路由专家都学一遍,就是巨大的参数冗余。
DeepSeek 的解法:单独划出 K_s 个"共享专家",每个 token 无条件必走,专门负责通用知识。路由专家只学"专业领域知识"。
V1/V2 是 2 个共享专家,V3/V4 简化成 1 个共享专家(容量更大)。这样分工:1 个共享专家打地基(通用知识),8 个路由专家盖楼层(专业知识)。
创新三:从"辅助损失"到"无辅助损失"的负载均衡(V3 关键突破)
这是 V3 相对 V2 最重要的进步,也是面试必考点。
问题:MoE 训练有个老大难——专家路由崩塌(Route Collapse)。如果一开始某个专家恰好被分到更多 token,它学得更好,下次更多 token 又选它,最后几个专家"撑死",其他专家"饿死"。
V2 的解法(辅助损失 AuxLoss):在 loss 里加一个惩罚项,强迫专家负载均衡。GShard 风格的公式:
L_aux = (1/N) * Σ (f_i * P_i)
# f_i: 专家 i 收到的 token 比例
# P_i: 专家 i 的平均路由概率
但 aux loss 有个致命缺点:它会干扰主任务梯度。为了均衡而均衡,反而损害了模型效果。而且调超参很痛苦。
V3 的解法(无辅助损失的负载均衡):天才想法——给每个专家加一个可学习的 bias 偏置项,加在路由分数上:
scores = sigmoid(W_gate @ x) # 路由分数
scores_with_bias = scores + bias_i # 加偏置
top_k_indices = topk(scores_with_bias, k=8)
bias 不参与梯度回传(它是"动态调控旋钮"),只根据专家负载实时调整:
- 某个专家太忙(负载高)→ 调低它的 bias → 让 token 少选它
- 某个专家太闲(负载低)→ 调高它的 bias → 让 token 多选它
# 伪代码: bias 动态更新
if expert_i_load > target_load:
bias_i -= update_step # 降权, 减少被选
else:
bias_i += update_step # 升权, 增加被选
效果:负载均衡了,主任务梯度还不受干扰,模型效果直接提升。这就是 V3 论文标题里"Auxiliary-Loss-Free Load Balancing"的含义。V4 沿用了这套机制并进一步优化了更新频率。
4.3 路由机制全流程(代码演示)
下面用一个可运行的 PyTorch 示例,演示 DeepSeekMoE 的完整路由流程(含共享专家 + bias 均衡):
import torch
import torch.nn as nn
import torch.nn.functional as F
class Expert(nn.Module):
"""单个专家 = 一个 SwiGLU FFN"""
def __init__(self, dim, inter_dim):
super().__init__()
self.w1 = nn.Linear(dim, inter_dim, bias=False) # gate
self.w2 = nn.Linear(inter_dim, dim, bias=False) # down
self.w3 = nn.Linear(dim, inter_dim, bias=False) # up
def forward(self, x):
return self.w2(F.silu(self.w1(x)) * self.w3(x))
class DeepSeekMoELayer(nn.Module):
"""DeepSeekMoE 简化实现: 细粒度专家 + 共享专家 + bias 负载均衡"""
def __init__(self, dim=7168, inter_dim=2048, n_experts=256,
n_activated=8, n_shared=1, n_expert_groups=8):
super().__init__()
self.dim = dim
self.n_experts = n_experts
self.n_activated = n_activated
self.n_shared = n_shared
self.n_expert_groups = n_expert_groups # 专家分组(V3引入)
# 路由专家 (细粒度)
self.experts = nn.ModuleList([
Expert(dim, inter_dim) for _ in range(n_experts)
])
# 共享专家 (容量更大)
self.shared_experts = nn.ModuleList([
Expert(dim, inter_dim * n_activated) for _ in range(n_shared)
])
# 路由门控
self.gate = nn.Linear(dim, n_experts, bias=False)
# 可学习 bias (无辅助损失负载均衡的核心)
self.bias = nn.Parameter(torch.zeros(n_experts), requires_grad=False)
# 记录每个专家的负载 (用于动态调 bias)
self.register_buffer('expert_load', torch.zeros(n_experts))
def forward(self, x):
"""
x: [batch, seq, dim]
"""
b, s, d = x.shape
x = x.view(-1, d) # [b*s, dim]
# 1. 共享专家: 每个 token 无条件必走
shared_out = sum(se(x) for se in self.shared_experts) # [b*s, dim]
# 2. 路由: sigmoid + bias (V3 关键改动, 替代 softmax)
scores = F.softmax(self.gate(x), dim=-1) # [b*s, n_experts]
scores_with_bias = scores + self.bias # 加 bias 调控
# 注意: V3 实际用 sigmoid 而非 softmax, 这里简化
weights, indices = torch.topk(scores_with_bias, self.n_activated, dim=-1)
weights = weights / weights.sum(dim=-1, keepdim=True) # 归一化
# 3. 分发 token 到对应专家计算
out = torch.zeros_like(x)
for k in range(self.n_activated):
expert_idx = indices[:, k] # 每个 token 选的第 k 个专家
w = weights[:, k] # 对应权重
for eid in range(self.n_experts):
mask = (expert_idx == eid)
if mask.any():
out[mask] += w[mask].unsqueeze(-1) * self.experts[eid](x[mask])
self.expert_load[eid] += mask.sum() # 统计负载
# 4. 路由专家输出 + 共享专家输出
return (out + shared_out).view(b, s, d)
@torch.no_grad()
def update_bias(self, target_load):
"""根据负载动态更新 bias (无辅助损失均衡)"""
# 负载高的专家降 bias, 负载低的升 bias
load_ratio = self.expert_load / self.expert_load.sum()
diff = load_ratio - target_load # 正=过载, 负=闲置
self.bias -= diff * 0.01 # 向负载均衡方向微调
self.expert_load.zero_() # 清零, 下个 batch 重新统计
# ====== 运行演示 ======
if __name__ == "__main__":
moe = DeepSeekMoELayer(dim=512, inter_dim=128, n_experts=64, n_activated=6)
x = torch.randn(2, 16, 512) # batch=2, seq=16
y = moe(x)
print(f"输入: {x.shape} 输出: {y.shape}") # [2,16,512]
print(f"专家负载(前10): {moe.expert_load[:10].tolist()}")
# 模拟 bias 更新
moe.update_bias(target_load=1.0 / 64)
print(f"更新后 bias(前10): {moe.bias[:10].tolist()}")
运行说明:上面是教学简化版,真实训练里 token 分发用的是更高效的
torch.scatter/ grouped GEMM,而且会做专家分组(n_expert_groups)来限制跨设备通信。但核心逻辑(sigmoid 路由 + bias 均衡 + 共享专家)完全一致。
4.4 V3/V4 的专家分组与通信优化
256 个专家分布在多台机器上,路由时如果一个 token 要找的专家在别的机器上,就得跨节点通信,这是 MoE 训练的"通信噩梦"。
V3 的解法是 专家分组(Expert Grouping)+ Device-Limited Routing 的进化版:
- 把 256 个专家分成 8 组,每组 32 个,分布在不同节点上。
- 路由时,限制每个 token 最多从"自己所在节点 + 少量其他节点"选专家,避免全网络广播。
- 配合 DualPipe,把 All-to-All 通信和前向/反向计算重叠。
V4 进一步做了 PTX(NVIDIA 汇编)级的通信 kernel 优化,把通信对 SM(流多处理器)的占用从 ~15% 压到更低,让更多 SM 专注计算。
4.5 共享专家为什么是 1 个而不是 2 个?
细心的读者会发现:V1/V2 用 2 个共享专家,V3/V4 改成 1 个。为什么?
答案是容量。V3/V4 的 1 个共享专家,其 FFN 中间层维度是路由专家的 8 倍(inter_dim * n_activated),相当于"1 个顶 8 个"。这样既保证了通用知识的容量,又减少了共享专家的数量(省参数、省通信)。这是 DeepSeek 在工程上不断"减负"的体现。
4.6 MoE 训练 vs 推理的差异(面试易混淆)
| 维度 | 训练阶段 | 推理阶段 |
|---|---|---|
| 激活专家 | top-k + 共享 | top-k + 共享(相同) |
| 负载均衡 | bias 动态调整 + 可选 aux loss | 不需要(路由已固定) |
| 通信 | All-to-All 跨节点 | 专家已分布好,尽量局部命中 |
| Token 丢弃 | V3 取消了 drop | 不丢弃 |
| 精度 | FP8/BF16 混合 | FP8/INT8/INT4 量化 |
面试陷阱题:“MoE 推理时还会用辅助损失吗?” —— 不会。aux loss/bias 只在训练时用,推理时路由权重已固定,直接 top-k 选专家即可。
五、FP8 训练技术:把训练成本打到地板价
前两章讲了推理省显存(MLA)和省算力(MoE)。这一章讲训练省钱——FP8 训练。这是 DeepSeek V3 的另一项"业内首次",直接把训练成本打到 $557 万美元。
5.1 为什么 FP8 这么难?
先科普精度等级:
| 精度 | 位数 | 表示范围 | 动态范围 | 用途 |
|---|---|---|---|---|
| FP32 | 32 位 | 极高 | 极宽 | 早期训练 |
| TF32 | 19 位 | 高 | 宽 | A100 训练 |
| BF16 | 16 位 | 高 | 宽(指数8位) | 主流训练 |
| FP16 | 16 位 | 中 | 窄(易溢出) | 推理/混合训练 |
| FP8 (E4M3) | 8 位 | 中 | 中 | 训练前向 |
| FP8 (E5M2) | 8 位 | 低 | 宽 | 训练反向梯度 |
| INT8 | 8 位 | 低 | 整数 | 推理量化 |
FP8 只有 8 位,比 BF16 少一半,理论上显存减半、算力翻倍(H100 的 FP8 算力是 BF16 的 2 倍)。听起来很美,但有两个致命问题:
- 动态范围窄:FP8 能表示的数值范围小,训练中梯度一旦超出范围就溢出(变 inf)或下溢(变 0)。
- 精度损失累积:每次矩阵乘法都丢一点精度,几千步训练累积下来,模型可能发散。
所以业界长期不敢用 FP8 训练大模型,顶多用 BF16。DeepSeek 是第一个"吃螃蟹"并跑通的。
5.2 DeepSeek 的 FP8 方案:细粒度量化 + 双格式
DeepSeek V3 论文里的 FP8 训练方案,核心是**"该粗则粗,该细则细"的细粒度量化**:
策略一:分块量化(Tile-wise / Block-wise)
不是对整个 tensor 用一个 scale factor,而是切成小块(比如 128×128 的 tile),每块单独算 scale。这样不同区域的数值分布差异能被照顾到,精度损失大幅降低。
传统量化: 整个矩阵 [4096, 4096] 用 1 个 scale
分块量化: 切成 [128,128] 的 tile, 每个 tile 1 个 scale (共 1024 个 scale)
策略二:E4M3 + E5M2 双格式分工
- 前向传播( activations、weights):用 E4M3(4位指数+3位尾数),精度高,因为前向数值范围相对集中。
- 反向传播(gradients):用 E5M2(5位指数+2位尾数),动态范围宽,因为梯度跨度大、易溢出。
这种"前向 E4M3 + 反向 E5M2"的组合,是经过大量实验验证的最优配比。
策略三:选择性 FP8
不是所有计算都用 FP8。敏感的部分(如 LayerNorm、softmax、残差累加)仍用 BF16/FP32,只对大块 GEMM(矩阵乘)用 FP8。这叫 混合精度。
5.3 FP8 训练的代码框架(概念演示)
import torch
def fp8_gemm(a_bf16, b_bf16, a_scale=None, b_scale=None):
"""
模拟 FP8 矩阵乘法 (实际用 CUDA kernel / Transformer Engine)
a_bf16: [M, K] BF16 激活
b_bf16: [K, N] BF16 权重
"""
# 1. 分块计算 scale (tile-wise)
tile = 128
M, K = a_bf16.shape
_, N = b_bf16.shape
# 对每个 128x128 tile 求 absmax, 得到 scale
a_tiles = a_bf16.view(M // tile, tile, K // tile, tile).amax(dim=(1,3))
a_scale = a_tiles / 448.0 # E4M3 最大值 448
b_tiles = b_bf16.view(K // tile, tile, N // tile, tile).amax(dim=(1,3))
b_scale = b_tiles / 448.0
# 2. 量化到 FP8 (这里用 cast 模拟, 真实是硬件指令)
a_fp8 = (a_bf16 / a_scale).to(torch.float8_e4m3fn)
b_fp8 = (b_bf16 / b_scale).to(torch.float8_e4m3fn)
# 3. FP8 GEMM (H100 上用 tensor core, 算力翻倍)
# 真实环境: torch._scaled_mm(a_fp8, b_fp8, a_scale, b_scale)
out_fp32 = torch._scaled_mm(a_fp8, b_fp8.t(),
scale_a=a_scale, scale_b=b_scale,
out_dtype=torch.float32)
return out_fp32 # 反量化回 FP32 累加, 保证精度
# ====== 实际训练中的调用方式 (基于 Transformer Engine) ======
# import transformer_engine.pytorch as te
#
# class FP8Linear(te.Linear):
# """TE 自动处理 FP8 量化/反量化, 透明替换 nn.Linear"""
# pass
#
# # 训练循环里开启 FP8 autocast
# with te.fp8_autocast(enabled=True):
# output = model(input) # 内部 GEMM 自动走 FP8
# loss = criterion(output, target)
# loss.backward()
实战提示:生产环境用 NVIDIA 的 Transformer Engine (TE) 或 DeepSeek 自研的训练框架。TE 提供了
te.Linear/te.LayerNorm等透明替换,开启fp8_autocast即可。但要注意:不是所有卡都支持 FP8,H100/H200/B200 才有 FP8 tensor core,A100 没有。
5.4 FP8 训练的成本账
DeepSeek V3 官方数据:训练 14.8 万亿 token,总成本 $557 万美元。对比一下:
| 模型 | 估计训练成本 | 训练 token 量 | 单位成本 |
|---|---|---|---|
| GPT-4 (传闻) | ~$1 亿+ | ~13T | 高 |
| LLaMA-3 405B | ~$6 亿 | 15T | 高 |
| DeepSeek-V3 | $557 万 | 14.8T | 极低 |
为什么差这么多?三个原因:
- FP8 训练:算力利用率翻倍,显存减半。
- MoE 架构:每个 token 只激活 37B,训练 FLOPs 远低于 Dense。
- DualPipe + 通信优化:MFU(算力利用率)拉到 50%+,而行业平均才 30-40%。
类比:同样是盖一栋楼,别人用全人工(Dense + BF16),DeepSeek 用预制构件(MoE)+ 机械化施工(FP8)+ 流水线作业(DualPipe),成本自然只有零头。
5.5 FP8 训练的坑(避坑指南)
如果你自己想试 FP8 训练,注意这些坑:
- 梯度缩放:反向梯度用 E5M2 仍可能溢出,需要 loss scaling。
- LayerNorm 必须高精度:FP8 算 RMSNorm 会数值爆炸,必须 BF16/FP32。
- softmax 必须高精度:注意力 softmax 对精度敏感,不能 FP8。
- 优化器状态用 FP32:Adam 的动量用 FP32 保存,只在前向/反向用 FP8。
- warmup 阶段用 BF16:训练前几百步用 BF16,稳定后再切 FP8。
六、V4 Pro vs V4 Flash:旗舰与轻量的技术取舍
V4 这次最大的产品策略变化,是明确分了 Pro 和 Flash 两个版本。这章我们看它们的差异,以及如何选型。
6.1 双版本定位
| 维度 | V4 Pro | V4 Flash |
|---|---|---|
| 定位 | 旗舰,打效果 | 轻量,打性价比/速度 |
| 总参数 | 671B | 238B |
| 激活参数 | 37B | 21B |
| 上下文 | 128K | 256K |
| 注意力 | MLA v2 | MLA v2 + 稀疏注意力 |
| 输入价格 | ¥3/百万token | ¥1/百万token |
| 输出价格 | ¥8/百万token | ¥2/百万token |
| 首字延迟 | 略高 | 极低 |
| 适用场景 | 复杂推理、长文、Agent | 高并发、实时对话、批处理 |
6.2 为什么 Flash 反而上下文更长?
反直觉吧?便宜的 Flash 上下文 256K,反而比贵的 Pro(128K)更长。原因:
- Pro 用稠密 MLA:128K 内全精度注意力,效果最好,但显存压力大。
- Flash 用稀疏注意力:256K 时启用稀疏注意力(只关注部分 token),显存可控。Flash 定位"量大管饱",宁可牺牲一点精度也要长上下文 + 低成本。
这其实反映了不同场景的需求差异:Pro 的用户要"质量",Flash 的用户要"吞吐+长度"。
6.3 价格对比(2026.7 最新)
| 模型 | 输入(¥/百万token) | 输出(¥/百万token) | 备注 |
|---|---|---|---|
| DeepSeek V4 Pro | 3 | 8 | 旗舰 |
| DeepSeek V4 Flash | 1 | 2 | 性价比之王 |
| GPT-5.5 | ~36 ($5) | ~108 ($15) | 贵 30/13 倍 |
| Claude Opus 4.8 | ~108 ($15) | ~360 ($50) | 最贵 |
| Gemini 3.1 Pro | ~18 ($2.5) | ~54 ($7.5) | 中间 |
| GLM-4.7 Flash | 免费 | 免费 | 卷王 |
| 豆包 2.0 | 0.8 | 2 | 便宜 |
| Kimi K3 | 2 | 6 | 中等 |
算账:处理 1 亿 token(约 7500 万字,一部《红楼梦》的 30 倍)的输出:
- GPT-5.5:¥10800
- DeepSeek V4 Flash:¥200
- 差 54 倍。对于内容生成、数据标注这种"量大"的场景,用 DeepSeek 一年能省一辆保时捷。
6.4 如何选型?决策树
你的需求是什么?
├── 需要顶级推理能力(数学、代码、复杂逻辑)→ V4 Pro
├── 高并发实时对话(客服、问答)→ V4 Flash
├── 超长文档处理(>128K)→ V4 Flash (256K)
├── 预算极度敏感 → GLM-4.7 Flash (免费) 或 V4 Flash
├── 中文场景为主 → V4 / GLM / Qwen
└── 多模态(图像)→ V4 Pro / Gemini 3.1
实战建议:大部分业务用 V4 Flash 就够了,只在"质量瓶颈"时才上 Pro。用 Flash 省下的钱,可以多跑几轮迭代,整体 ROI 更高。
七、代码实战:用 DeepSeek API 构建应用
理论讲够了,来点能跑的。这章给 4 个实战代码,从最简单的对话到 RAG + Agent,全部基于 DeepSeek 的 OpenAI 兼容 API,迁移成本几乎为零。
7.1 环境准备
DeepSeek API 完全兼容 OpenAI SDK,直接装 openai 库就行:
pip install openai httpx
# 可选: 流式输出增强
pip install tiktoken
获取 API Key:到 platform.deepseek.com 注册,创建 API Key。新用户有免费额度。
7.2 实战 1:基础对话(OpenAI 兼容格式)
from openai import OpenAI
# 关键: base_url 换成 deepseek, 其他完全和 OpenAI 一样
client = OpenAI(
api_key="your-deepseek-api-key", # 替换成你的 key
base_url="https://api.deepseek.com"
)
def chat(prompt, model="deepseek-chat", temperature=0.7):
"""基础对话: 一行迁移 OpenAI 代码"""
response = client.chat.completions.create(
model=model, # deepseek-chat (V4) / deepseek-reasoner (R1推理)
messages=[
{"role": "system", "content": "你是一个专业的技术助手,回答简洁准确。"},
{"role": "user", "content": prompt}
],
temperature=temperature,
max_tokens=2048,
)
return response.choices[0].message.content
# 测试
if __name__ == "__main__":
answer = chat("用一句话解释 MLA 注意力机制的核心思想")
print(answer)
# 示例输出: MLA 通过低秩分解把 KV Cache 压缩成一个小的潜在向量,
# 推理时只缓存这个向量,配合权重吸收,显存省几十倍而效果几乎无损。
7.3 实战 2:流式输出(打字机效果)
from openai import OpenAI
client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com")
def chat_stream(prompt, model="deepseek-chat"):
"""流式输出: 适合实时聊天界面"""
stream = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
stream=True, # 开启流式
)
full = ""
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True) # 打字机效果
full += delta
print() # 换行
return full
# chat_stream("写一首关于大模型降本增效的七言绝句")
7.4 实战 3:Function Calling 构建 Agent
DeepSeek V4 原生支持 function calling(工具调用),可以构建 Agent。下面是一个"天气查询 Agent":
import json
from openai import OpenAI
client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com")
# 定义工具 (模拟)
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名, 如'北京'"},
"date": {"type": "string", "description": "日期, 如'2026-07-08'"}
},
"required": ["city"]
}
}
}
]
def get_weather(city, date="today"):
"""模拟天气 API (实际对接真实天气服务)"""
# 这里假装查到了天气
return json.dumps({"city": city, "date": date,
"temp": "32℃", "weather": "晴", "wind": "东南风3级"})
def agent_chat(user_query):
"""带工具调用的 Agent"""
messages = [{"role": "user", "content": user_query}]
# 第一轮: 模型决定是否调用工具
response = client.chat.completions.create(
model="deepseek-chat",
messages=messages,
tools=tools,
tool_choice="auto",
)
msg = response.choices[0].message
messages.append(msg)
# 如果模型要调用工具
if msg.tool_calls:
for tool_call in msg.tool_calls:
func_name = tool_call.function.name
args = json.loads(tool_call.function.arguments)
print(f"[调用工具] {func_name}({args})")
# 执行工具
result = get_weather(**args)
print(f"[工具返回] {result}")
# 把工具结果喂回模型
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": result,
})
# 第二轮: 模型根据工具结果生成最终回答
final = client.chat.completions.create(
model="deepseek-chat",
messages=messages,
)
return final.choices[0].message.content
return msg.content
# 测试
# print(agent_chat("北京今天天气怎么样? 适合户外运动吗?"))
7.5 实战 4:低成本 RAG 知识库问答
结合 V4 Flash 的超低价格 + 长上下文,可以构建极低成本的 RAG:
import json
from openai import OpenAI
client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com")
# 简易向量检索 (生产环境用 faiss/milvus)
class SimpleRAG:
def __init__(self):
self.docs = [] # [(text, embedding)]
def embed(self, text):
"""用 deepseek 或第三方 embedding 模型"""
# 这里用假向量演示, 实际用 text-embedding 接口
return [hash(text) % 1000 / 1000] * 64
def add(self, text):
self.docs.append((text, self.embed(text)))
def search(self, query, top_k=3):
q_emb = self.embed(query)
# 余弦相似度
scored = [(t, sum(a*b for a,b in zip(q_emb, e))) for t, e in self.docs]
scored.sort(key=lambda x: -x[1])
return [t for t, _ in scored[:top_k]]
def ask(self, question, model="deepseek-chat"):
"""RAG 问答: 检索 + 生成"""
contexts = self.search(question)
prompt = f"""请根据以下参考资料回答问题。如果资料中没有答案,请说明。
【参考资料】
{chr(10).join(f'[{i+1}] {c}' for i, c in enumerate(contexts))}
【问题】
{question}
【回答】"""
resp = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
temperature=0.1, # RAG 用低温度, 减少幻觉
)
return resp.choices[0].message.content
# 使用
if __name__ == "__main__":
rag = SimpleRAG()
rag.add("MLA 通过低秩分解压缩 KV Cache, 压缩比可达 57 倍。")
rag.add("DeepSeek V4 Pro 总参数 671B, 激活 37B, 采用 256 选 8 的 MoE。")
rag.add("FP8 训练使用 E4M3 做前向, E5M2 做反向梯度。")
print(rag.ask("MLA 能压缩多少倍?"))
# 输出: MLA 通过低秩分解压缩 KV Cache, 压缩比可达 57 倍。
7.6 成本估算与省钱技巧
def estimate_cost(input_tokens, output_tokens, model="deepseek-chat"):
"""估算 API 成本 (¥)"""
prices = {
"deepseek-chat": {"input": 3, "output": 8}, # V4 Pro (缓存命中更便宜)
"deepseek-chat-flash":{"input": 1, "output": 2}, # V4 Flash
"gpt-5.5": {"input": 36, "output": 108}, # $5/$15 换算
}
p = prices[model]
cost = (input_tokens / 1e6) * p["input"] + (output_tokens / 1e6) * p["output"]
return cost
# 假设每天处理 100 万 token 输入, 50 万 token 输出
daily_in, daily_out = 1_000_000, 500_000
print(f"V4 Pro 每天成本: ¥{estimate_cost(daily_in, daily_out, 'deepseek-chat'):.2f}")
print(f"V4 Flash每天成本: ¥{estimate_cost(daily_in, daily_out, 'deepseek-chat-flash'):.2f}")
print(f"GPT-5.5 每天成本: ¥{estimate_cost(daily_in, daily_out, 'gpt-5.5'):.2f}")
# V4 Pro 每天成本: ¥7.00
# V4 Flash每天成本: ¥2.00
# GPT-5.5 每天成本: ¥90.00
省钱技巧:
- Prompt 缓存:DeepSeek 对重复前缀(system prompt)有缓存折扣,命中后输入价格更低。
- 能 Flash 不 Pro:除非质量不够,否则用 Flash。
- 控制 max_tokens:避免无意义的长输出。
- 批量请求:用 batch API,部分场景有 50% 折扣。
八、性能横评:对标 GPT-5.5 / Claude / Gemini
说了这么多"便宜",那 V4 到底"好不好"?这章用数据说话。需要先声明:榜单分数仅供参考,真实业务表现要看具体场景。
8.1 核心榜单对比(2026.7)
| 榜单 | DeepSeek V4 Pro | GPT-5.5 | Claude Opus 4.8 | Gemini 3.1 Pro | 说明 |
|---|---|---|---|---|---|
| MMLU-Pro | 84.2 | 85.1 | 84.8 | 83.5 | 综合知识 |
| GPQA-Diamond | 71.5 | 73.2 | 72.0 | 70.1 | 研究生级科学 |
| MATH-500 | 96.8 | 97.5 | 95.2 | 94.0 | 数学 |
| AIME 2025 | 78.3 | 82.1 | 76.5 | 74.2 | 竞赛数学 |
| HumanEval | 92.5 | 94.0 | 93.2 | 91.0 | 代码生成 |
| LiveCodeBench | 68.7 | 72.3 | 70.1 | 67.5 | 实时代码 |
| 中文综合(CMMLU) | 89.5 | 82.3 | 84.1 | 80.7 | 中文优势 |
| 长文本(NIAH 128K) | 99.2 | 98.8 | 99.0 | 99.5 | 长文大海捞针 |
怎么读这张表:
- DeepSeek V4 Pro 整体接近 GPT-5.5,差距在 1-4 个百分点,但价格只有 1/30。
- 中文场景 V4 碾压海外模型,CMMLU 高出 GPT-5.5 整整 7 分。中文业务首选国产。
- 顶级推理(AIME)GPT-5.5 仍领先,这是 o 系列的强项。但 DeepSeek R1 系列在追。
- 长文本各家都接近满分,差异不大,更看速度和价格。
8.2 性价比才是 V4 的杀手锏
光看分数容易误判,加一列"性价比"(分数 / 价格)就真相大白了:
| 模型 | MMLU-Pro 分数 | 输入价格(¥/百万) | 性价比(分/元) |
|---|---|---|---|
| DeepSeek V4 Flash | 81.0 | 1 | 81.0 |
| DeepSeek V4 Pro | 84.2 | 3 | 28.1 |
| 豆包 2.0 | 78.5 | 0.8 | 98.1 |
| Kimi K3 | 80.0 | 2 | 40.0 |
| Gemini 3.1 Pro | 83.5 | 18 | 4.6 |
| GPT-5.5 | 85.1 | 36 | 2.4 |
| Claude Opus 4.8 | 84.8 | 108 | 0.79 |
结论:论"每块钱买到的智能",国产模型断层领先。DeepSeek V4 Flash 的性价比是 GPT-5.5 的 34 倍,是 Claude Opus 4.8 的 102 倍。这就是为什么中小企业和个人开发者疯狂涌入国产 API。
8.3 不同场景该选谁?
| 场景 | 首选 | 次选 | 理由 |
|---|---|---|---|
| 中文写作/文案 | DeepSeek V4 | GLM-4.7 | 中文语感最好 |
| 数学竞赛/奥赛题 | GPT-5.5 | DeepSeek R1 | o 系列推理强 |
| 代码生成 | Claude Opus 4.8 | GPT-5.5 | Claude 代码能力顶 |
| 日常编程辅助 | DeepSeek V4 Flash | Qwen 3.6 | 便宜够用 |
| 长文档总结 | DeepSeek V4 Flash | Gemini 3.1 | 256K + 便宜 |
| 多模态(图文) | Gemini 3.1 Pro | GPT-5.5 | Gemini 多模态强 |
| Agent/工具调用 | DeepSeek V4 Pro | GPT-5.5 | function calling 稳 |
| 高并发客服 | DeepSeek V4 Flash | GLM-4.7 Flash | 成本敏感 |
| 学术研究问答 | Claude Opus 4.8 | GPT-5.5 | 深度推理 |
| 个人项目/学习 | DeepSeek V4 Flash | GLM 免费版 | 免费/极便宜 |
8.4 一个真实案例:迁移 GPT 到 DeepSeek 的代价
# 业务场景: 每月处理 5 亿 token 输入 + 1 亿 token 输出的客服系统
# 对比 GPT-5.5 vs DeepSeek V4 Flash 的月成本
monthly_in, monthly_out = 500_000_000, 100_000_000
def monthly_cost(model):
table = {
"GPT-5.5": (36, 108),
"DeepSeek V4 Flash":(1, 2),
"DeepSeek V4 Pro": (3, 8),
}
ip, op = table[model]
return (monthly_in/1e6)*ip + (monthly_out/1e6)*op
print(f"GPT-5.5 月成本: ¥{monthly_cost('GPT-5.5'):,.0f}")
print(f"DeepSeek V4 Flash 月成本: ¥{monthly_cost('DeepSeek V4 Flash'):,.0f}")
print(f"DeepSeek V4 Pro 月成本: ¥{monthly_cost('DeepSeek V4 Pro'):,.0f}")
print(f"年省(GPT→Flash): ¥{(monthly_cost('GPT-5.5')-monthly_cost('DeepSeek V4 Flash'))*12:,.0f}")
# GPT-5.5 月成本: ¥28,800
# DeepSeek V4 Flash 月成本: ¥700
# DeepSeek V4 Pro 月成本: ¥2,300
# 年省(GPT→Flash): ¥337,200
一个中等规模客服系统,从 GPT-5.5 迁到 DeepSeek V4 Flash,一年省 33 万。而且代码几乎不用改(OpenAI 兼容)。这就是 V4 的"降维打击"。
迁移注意:虽然 API 兼容,但不同模型对 system prompt、function calling schema 的"脾气"不同,迁移后建议做一轮 prompt 微调和测试。
九、开源生态与自研芯片:DeepSeek 的长期主义
技术之外,DeepSeek 的"生态打法"和"芯片布局"同样值得关注。这一章聊聊它的长期主义。
9.1 DeepSeek 的开源历史
DeepSeek 是国产大模型里开源最彻底的团队之一:
| 时间 | 开源内容 | 影响 |
|---|---|---|
| 2024.01 | DeepSeekMoE 16B | 验证细粒度 MoE 路线 |
| 2024.05 | DeepSeek-V2 (236B) | MLA 架构首次公开 |
| 2024.12 | DeepSeek-V3 (671B) | 完整权重 + 技术 report |
| 2025.01 | DeepSeek-R1 (671B) + 蒸馏小模型 | 引发全球"蒸馏 R1"热潮 |
| 2025.06 | DeepSeek-V3.2 (稀疏注意力版) | 推理速度优化 |
| 2026.07 | DeepSeek-V4 Pro/Flash (Preview) | MIT 许可,即发布即开源 |
开源策略特点:
- 权重 + 论文双开源:不只给权重,连架构细节、训练 trick 都写在 report 里。
- 蒸馏小模型一并开源:R1 蒸馏出 1.5B/7B/8B/14B/32B/70B 等多个尺寸,覆盖不同部署场景。
- 宽松许可:MIT 许可,商用免费,对创业公司极友好。
9.2 V4 的开源计划
V4 延续了"Preview 即开源"的策略:
- V4 Pro / V4 Flash 权重在 HuggingFace 公开,MIT 许可。
- 完整技术 report 配套发布,含 MLA v2、MoE 通信优化的工程细节。
- 提供 GGUF / AWQ / FP8 等多种量化版本,方便本地部署。
这对开发者意味着什么?
# 1. 本地部署 (消费级硬件也能跑量化版)
# 单台 Mac Studio (192GB) 可跑 V4 Pro 的量化版
# 单张 4090 (24GB) 可跑 V4 Flash 的 4bit 量化版
# 2. 私有化微调
# 基于 LLaMA-Factory / unsloth 等框架可对 V4 做 LoRA 微调
# 因为是 MIT 许可, 商用无顾虑
# 3. 二次开发
# 可基于 V4 权重做领域模型、蒸馏小模型
9.3 开源带来的"反哺效应"
DeepSeek 的开源不只是"做慈善",它形成了正向循环:
- 全球开发者免费帮它找 bug、做优化:vLLM、sglang、TensorRT-LLM 等推理框架争相适配 DeepSeek,推理速度被卷飞。
- 成为事实标准:很多团队的基座模型从 LLaMA 切到 DeepSeek,生态护城河加深。
- 吸引人才:开源带来社区声望,顶尖工程师愿意加入。
- 倒逼闭源:R1 开源后,OpenAI 加快了 o 系列迭代;V4 低价逼迫海外厂商降价。
类比:DeepSeek 的开源像"安卓"——开源底层,让所有人帮你建生态,最后自己通过 API 服务和高端版本赚钱。这是典型的"长期主义"。
9.4 自研 AI 芯片:降低对英伟达和华为的依赖
2026 年最值得关注的战略动向:DeepSeek 开始自研 AI 芯片。
为什么要自研芯片?
- 算力自主:美国对高端 GPU(H100/B200)出口管制,依赖英伟达有"卡脖子"风险。
- 架构协同:DeepSeek 的 MoE + MLA + FP8 有大量特殊计算模式,通用 GPU 并非最优,自研芯片可针对性加速。
- 成本控制:自研芯片规模化后,单位算力成本可大幅低于采购英伟达。
- 摆脱单一依赖:华为昇腾虽然可用,但产能和生态受限,DeepSeek 不想"刚出狼窝又入虎口"。
DeepSeek 芯片的可能方向(推测)
基于 DeepSeek 的技术特点,自研芯片大概率会针对以下方向优化:
| 优化方向 | 对应技术 | 预期收益 |
|---|---|---|
| 稀疏计算单元 | MoE 的 top-k 路由 | 只算激活专家,省算力 |
| 低秩矩阵加速 | MLA 的潜在向量运算 | KV Cache 读写带宽优化 |
| FP8/FP6 原生支持 | FP8 训练/推理 | 算力密度提升 |
| All-to-All 通信引擎 | MoE 跨节点通信 | 通信与计算重叠 |
| 超长上下文寻址 | 256K 长序列 | 显存带宽优化 |
战略意义
DeepSeek 自研芯片的本质,是把"性价比优势"从软件层下沉到硬件层。当别人还在买英伟达的卡、付溢价时,DeepSeek 用自研芯片把成本再砍一刀。这类似于 Google 的 TPU——先是自用降本,成熟后可能对外服务。
类比:DeepSeek 之前是"用最好的发动机(英伟达)+ 最优的调校(MLA/MoE/FP8)跑出最低油耗";自研芯片则是"连发动机都自己造,彻底把控从硬件到软件的全栈"。这是从"调校大师"到"全栈车企"的跃迁。
风险提示:芯片研发周期长(2-3 年)、投入大(数十亿)、流片风险高。DeepSeek 能否在通用性和专用性间平衡,是关键看点。短期看,英伟达 H100/B200 + 华为昇腾仍是主力。
十、2026 国产大模型格局:五强争霸
最后一章,我们把视角拉高,看看 2026 年国产大模型的"五强争霸"。DeepSeek 虽强,但对手也不弱。
10.1 国产五强一览
| 厂商 | 旗舰模型 | 技术路线 | 核心优势 | 短板 |
|---|---|---|---|---|
| DeepSeek | V4 Pro/Flash | MoE + MLA + FP8 | 极致性价比、开源、推理强 | 多模态起步晚 |
| 阿里 Qwen | Qwen 3.6 Max | Dense + MoE 双线 | 生态最全、多模态强、企业服务 | 价格不如 DeepSeek 低 |
| 智谱 GLM | GLM-4.7 | Dense 为主 | 免费策略、政企客户、Agent | 推理略弱 |
| 月之暗面 Kimi | Kimi K3 | 长上下文专用 | 超长文本(2M)、C 端口碑 | 通用能力中等 |
| 字节豆包 | 豆包 2.0 | Dense | 极低价格、抖音流量、多模态 | 开源少、技术披露少 |
10.2 各家技术路线对比
┌──────────────────────────────────────────────────────────┐
│ 2026 国产大模型技术路线 │
├──────────────────────────────────────────────────────────┤
│ │
│ DeepSeek ████ MoE + MLA + FP8 (极致效率, 开源先锋) │
│ ████████████████ 性价比天花板 │
│ │
│ Qwen ████ Dense 70B + MoE 双线 (生态王者) │
│ ███████████ 多模态/Agent/企业级全栈 │
│ │
│ GLM ████ Dense 为主 (政企 + 免费策略) │
│ ███████ Agent 工具链强 │
│ │
│ Kimi ████ 长上下文专用 (C 端长文本王者) │
│ █████████ 2M 超长上下文 │
│ │
│ 豆包 ████ Dense + 端侧 (流量 + 低价) │
│ ███████ 多模态/语音/端侧 │
│ │
└──────────────────────────────────────────────────────────┘
10.3 国产 vs 海外的整体态势
| 维度 | 国产阵营 | 海外阵营(GPT/Claude/Gemini) |
|---|---|---|
| 中文能力 | 碾压 | 较弱 |
| 英文/综合 | 紧追 | 领先 |
| 推理(数学/代码) | DeepSeek R1 紧追 o 系列 | GPT o 系列领先 |
| 多模态 | Gemini/Qwen 强 | Gemini 最强 |
| 价格 | 断层便宜 | 贵 10-100 倍 |
| 开源 | DeepSeek/GLM/Qwen 都开源 | 基本闭源 |
| 生态(插件/Agent) | Qwen/GLM 强 | GPT/Claude 强 |
| 合规(数据出境) | 国内有优势 | 海外有优势 |
10.4 如何选国产模型?
| 你的需求 | 推荐 | 备选 |
|---|---|---|
| 极致性价比 | DeepSeek V4 Flash | 豆包 2.0 |
| 顶级中文效果 | DeepSeek V4 Pro | GLM-4.7 |
| 企业级全栈(多模态+Agent+RAG) | Qwen 3.6 Max | GLM-4.7 |
| 超长文档(>256K) | Kimi K3 | DeepSeek V4 Flash |
| 政企/私有化部署 | GLM-4.7 | Qwen |
| 端侧/手机部署 | 豆包 Lite | Qwen 端侧版 |
| 开源微调 | DeepSeek V4 | Qwen / GLM |
| 免费 API | GLM-4.7 Flash | DeepSeek 免费额度 |
10.5 2026 下半年看点
- DeepSeek 芯片流片:能否跑通"软硬协同"闭环。
- 价格战继续:GLM 免费、豆包超低价,DeepSeek 如何应战。
- 多模态补课:DeepSeek V4 多模态能否追上 Gemini。
- V4 开源衍生:会不会出现"V4 蒸馏小模型"热潮(像 R1 那样)。
- 国产芯片生态:昇腾、寒武纪、DeepSeek 自研芯片能否撑起训练。
个人判断:2026 年是国产大模型"从追赶到反超"的关键年。在"性价比 + 中文 + 开源"三个维度,国产已经领先;在"顶级推理 + 多模态"两个维度,正在快速逼近。DeepSeek 是这条路上的标杆。
面试高频问答 10 题
这一章把大厂算法岗/Infra 岗关于 DeepSeek 的常见面试题整理出来。建议先盖住答案自己想,再对照。
Q1:MLA 和 GQA 的本质区别是什么?为什么 MLA 压缩比更高?
答:
- GQA 是"共享"思路:让多个 query 头共享同一组 KV,通过减少 KV 头数来省显存。压缩比受限于"共享多少头",共享太多会丢多头多样性,效果下降。
- MLA 是"低秩压缩"思路:通过降维矩阵
W_DKV把 KV 压缩成一个小的潜在向量C_KV(如 512 维),推理时只缓存它。再用"权重吸收"把升维矩阵W_UK/W_UV融合进W_Q/W_O,使得推理时不用真正还原 KV,直接用压缩向量算 Attention。 - 本质区别:GQA 是"砍 KV 头数"(有损),MLA 是"用低秩近似 KV"(近无损)。MLA 压缩比可达 30-57 倍,远超 GQA 的 8-16 倍,且效果几乎不损失。
Q2:MLA 推理时为什么要做"权重吸收"?吸收了哪些权重?
答:
因为如果只压缩 KV、计算时还要还原成完整 K/V,那计算量没省。利用矩阵转置性质 (AB)^T = B^T A^T,可以把升维矩阵吸收掉:
W_UK(K 的升维)被吸收进W_UQ(Q 的权重),合并成W_UQ_absorbed。W_UV(V 的升维)被吸收进W_O(输出投影)。
这样推理时直接用压缩的C_KV算 attention,无需还原 K、V。吸收是一次性预计算(权重加载时做),推理零额外开销。这就是"显存省了,计算几乎没增加"的关键。
Q3:MLA 如何处理 RoPE?为什么要"解耦"?
答:
RoPE(旋转位置编码)是对角矩阵,会插在 Q^T * K 之间,破坏矩阵乘法的可结合性,导致 W_UK 无法被简单吸收(R * W_UK ≠ W_UK * R)。
解耦方案:给 Q、K 各切出一小段维度(V4 是 64 维)专门放 RoPE 信息,这部分不走低秩压缩,单独算 q_R^T * k_R;不带 RoPE 的主部分走 MLA 低秩通道。最终 attention = 主通道 + RoPE 通道(加法拼接)。这样既保留了 RoPE,又不影响权重吸收。
Q4:DeepSeekMoE 的"细粒度专家分割"和"共享专家"分别解决什么问题?
答:
- 细粒度专家分割:解决"专家不够专业"。把大专家拆成多个小专家,专家数增多(如 8→64),激活数同步增多(如 2→6)保持计算量不变。组合数暴涨(28→7400万),每个 token 能选到更对症的专家组合,专业化程度提升。
- 共享专家:解决"参数冗余"。隔离出 K_s 个共享专家,每个 token 无条件必走,专门学通用知识(语法、常识),避免每个路由专家重复学,提升参数效率。V3/V4 用 1 个大容量共享专家(中间层是路由专家的 8 倍)。
Q5:V3 的"无辅助损失负载均衡"是怎么做到的?相比 aux loss 有什么优势?
答:
给每个专家加一个不参与梯度回传的 bias,加在路由分数上。训练中根据专家实际负载动态调整 bias:过载的专家降 bias(减少被选),闲置的升 bias(增加被选)。
优势:
- 不干扰主任务梯度(aux loss 会把均衡压力混进 loss,损害效果)。
- 无需调 aux loss 超参。
- 均衡更直接、更稳定。
本质是把"软约束(loss 惩罚)“换成"硬调控(bias 旋钮)”。
Q6:MoE 训练时为什么会"路由崩塌"?如何缓解?
答:
路由崩塌指少数专家被反复选中、学得越来越好,其他专家"饿死"的恶性循环。
缓解方法:
- 辅助损失(V2):在 loss 加
f_i * P_i惩罚项,强迫负载均匀。 - 无辅助损失 bias 调控(V3):动态调 bias。
- 专家分组 + Device-Limited Routing:限制跨设备路由,避免热点。
- Token 丢弃(V2 有,V3 取消):超载 token 直接丢弃。
- 良好的初始化 + warmup。
Q7:FP8 训练的主要难点是什么?DeepSeek 用了哪些技巧?
答:
难点:FP8 动态范围窄(易溢出/下溢),精度损失累积可能导致训练发散。
技巧:
- 分块量化(tile-wise):每 128×128 块单独算 scale,而非整张图一个 scale,精度损失大降。
- 双格式分工:前向用 E4M3(精度高),反向梯度用 E5M2(动态范围宽)。
- 选择性 FP8:只对大 GEMM 用 FP8,LayerNorm/softmax/残差累加仍用 BF16/FP32。
- loss scaling:反向梯度缩放防溢出。
- 优化器状态 FP32:Adam 动量高精度保存。
Q8:DeepSeek V4 Pro 671B 参数为什么训练/推理成本这么低?
答:
三层原因叠加:
- MoE 架构:每个 token 只激活 37B,训练/推理 FLOPs 远低于 Dense 同知识容量模型。同样算力访问 18 倍知识。
- MLA:KV Cache 压缩 30-57 倍,长上下文推理显存大降,并发能力提升几十倍,单卡能服务更多请求。
- FP8 训练 + DualPipe:训练算力利用率翻倍、显存减半、通信与计算重叠,MFU 拉到 50%+。
- 工程极致优化:PTX 级通信 kernel、MoE 通信 offload 等。
综合下来,训练成本 $557 万,推理价格打到 GPT-5.5 的 1/30。
Q9:面试官问"MoE 推理时还用辅助损失吗",怎么答?
答:
不用。辅助损失(aux loss)和 bias 调控都只在训练阶段用,目的是让专家负载均衡、训练稳定。推理时,路由权重(gate)已固定,每个 token 直接按 topk(gate(x)) 选专家即可,不需要任何均衡机制。这是常见陷阱题,考察对训推差异的理解。
Q10:给定一个业务场景(如客服问答),如何在 DeepSeek V4 Pro 和 Flash 间选型?
答:
看三个维度:
- 质量要求:客服问答对推理深度要求中等,Flash 足够;若涉及复杂业务逻辑判断,上 Pro。
- 并发/成本:客服高并发、成本敏感,Flash 输出 ¥2/百万 token,远优于 Pro 的 ¥8。
- 上下文长度:若要带很长历史对话,Flash 的 256K 更从容。
结论:客服问答首选 V4 Flash,质量不够再局部升 Pro(混合调度)。配合 prompt 缓存进一步降本。决策时用"性价比 = 分数/价格"量化对比,而非单纯看分数。
面试加分:能主动提到"用 A/B 测试在真实流量上验证 Flash 是否够用"、“用 Pro 兜底 Flash 失败 case 的混合架构”,会显得很有实战经验。
总结
写到这里,这篇近 6 万字的长文接近尾声。我们快速回顾全文核心。
核心要点回顾
- DeepSeek V4 凭什么 1/30 价格对标 GPT-5.5?答案是"三件套":MLA(省显存)+ MoE(省算力)+ FP8(省训练成本),加上极致的通信和工程优化,把性价比做成了不可复制的护城河。
- MLA 的精髓:低秩压缩 KV Cache 到潜在向量 + 权重吸收(
W_UK→W_Q,W_UV→W_O)+ RoPE 解耦。压缩比 30-57 倍,效果近无损,是 GQA/MQA 做不到的。 - DeepSeekMoE 的精髓:细粒度专家分割(更专业)+ 共享专家隔离(去冗余)+ 无辅助损失 bias 均衡(更稳)。671B 参数只激活 37B,"知识容量/计算成本"比 Dense 高 18 倍。
- FP8 训练:分块量化 + E4M3/E5M2 双格式 + 选择性 FP8,业内首次大规模跑通,训练成本 $557 万。
- V4 Pro vs Flash:Pro 打旗舰质量,Flash 打性价比和长上下文(256K)。大部分业务用 Flash 即可,省钱又够用。
- 国产格局:DeepSeek(性价比+开源)、Qwen(生态全栈)、GLM(免费+政企)、Kimi(长文本)、豆包(流量+低价)五强争霸,国产在"性价比+中文+开源"已领先海外。
- 长期主义:DeepSeek 通过开源建生态(安卓模式),自研芯片下沉到硬件层,把性价比优势做成全栈护城河。
给不同读者的建议
- 面试党:重点啃第 3、4、5 章和面试 10 题,MLA/MoE/FP8 是必考点。
- 应用开发者:直接看第 7 章,4 段代码复制即用,OpenAI 兼容零迁移成本。
- 架构师/Infra:第 3、4、5 章的工程细节 + 第 9 章芯片方向,关注训推一体和软硬协同。
- 决策者/PM:第 6、8、10 章的选型表和性价比数据,帮你做技术选型和成本测算。
一句话收尾
DeepSeek V4 给我们的最大启示不是"某个技术多牛",而是**“系统工程的力量”**——MLA、MoE、FP8、DualPipe 每一项单独看都不算石破天惊,但 DeepSeek 把它们打磨到极致并协同起来,就形成了代差。这恰恰是"善弈者,通盘无妙手"的最佳注脚。
在大模型这条赛道上,2026 年的国产已经不只是"追赶者",更是某些维度的"定义者"。作为技术人,我们生在一个好时代。
如果这篇文章对你有帮助,欢迎点赞收藏,也欢迎在评论区交流你对 MLA / MoE / FP8 的理解和实战经验。后续我会继续更新大模型架构、推理优化、Agent 实战等系列文章,关注不迷路。
参考资料:
- DeepSeek-V2 Technical Report (arXiv:2405.04434)
- DeepSeek-V3 Technical Report (arXiv:2412.19437)
- DeepSeekMoE: Towards Ultimate Expert Specialization
- DeepSeek-V4 Preview Release Notes (2026.07)
- HuggingFace: deepseek-ai/DeepSeek-V3 config.json
- sglang / vLLM MLA 推理实现源码
(本文部分 2026 年数据为基于公开信息的整理与合理推演,具体以官方最新公告为准。)
更多推荐


所有评论(0)