Skip to content

DeepSeek模型家族、MoE推理与生产接入完整原理

“DeepSeek”不是一个固定模型文件,而是一组不断演进的模型、训练路线和服务形态。不同版本可能是通用基础模型、对话模型、代码模型、MoE模型、推理模型或蒸馏模型;云API、本地开源权重、Ollama标签和第三方量化也不是同一个产物。

学习 DeepSeek 不能只记 ollama run deepseek-r1:8b。需要先确认“实际运行的是哪个模型和Revision”,再理解 Tokenizer、Transformer、MoE/MLA等架构、推理输出、量化、本地服务、API兼容边界、RAG、容量和生产治理。

学习目标

完成本页后,你应该能够:

  1. 区分 Base、Chat/Instruct、Coder、Reasoning和Distill模型。
  2. 解释为什么“R1 8B”通常不能直接理解为原始完整R1缩小版。
  3. 区分Dense模型和MoE模型的总参数、激活参数与计算路径。
  4. 解释Router、Top-k、共享专家、路由专家和负载均衡。
  5. 理解专家并行带来的跨卡通信和热点问题。
  6. 说明MLA压缩KV状态的设计方向以及为什么不能套到所有版本。
  7. 区分推理模型的内部推理过程、可见字段和最终回答。
  8. 使用云API、OpenAI兼容接口和Ollama本地接口,并识别协议差异。
  9. 估算本地权重、KV Cache、上下文和并发资源。
  10. 设计模型路由、RAG、工具、安全、评估和成本治理。
  11. 排查模型名错误、上下文超限、重复输出、OOM、慢请求和质量漂移。
  12. 固定模型、Tokenizer、量化、Prompt和服务版本,保证可复现。

一、先确认你说的是哪一个DeepSeek

类型训练/用途使用边界
Base下一个Token预训练基础模型未必具备稳定助手指令行为
Chat/Instruct经过指令和对齐对话、抽取、问答、工具等
Coder强化代码数据和任务代码能力强,不代表所有业务问答最优
MoE系列使用专家路由降低每Token激活计算部署需要理解专家权重与通信
Reasoning模型面向复杂推理训练/对齐延迟和输出Token可能更高
Distill模型用强模型输出/方法训练较小底座架构、Tokenizer和能力受学生底座影响
量化模型权重以较低比特存储质量、Kernel和格式需实测

模型卡、配置文件和不可变Revision是权威证据。名字中出现 DeepSeekR18B 不能证明它使用完整原始模型架构。

1.1 “deepseek-r1:8b”常见误解

本地工具中的小参数标签常对应基于其他Dense底座的蒸馏产物或第三方打包/量化。它学习了推理样本和行为,但不意味着把完整大型MoE模型机械裁成8B,也不意味着拥有相同总参数、架构、上下文和能力。

确认:

text
模型仓库和模型卡
基础/学生模型
参数规模
是否MoE
Tokenizer
上下文限制
权重精度/量化格式
Revision/Digest
许可证
推理模板

二、一次请求的通用链路

mermaid
flowchart TD
    A["业务请求"] --> B["鉴权、租户、限流和Token预算"]
    B --> C["选择DeepSeek模型/版本"]
    C --> D["Chat Template和Tokenizer"]
    D --> E["Prefill处理System、历史、RAG和问题"]
    E --> F["多层Transformer/MoE计算"]
    F --> G["LM Head得到Logits"]
    G --> H["解码下一个Token"]
    H --> I{"是否结束"}
    I -->|"否"| F
    I -->|"是"| J["最终回答/结构化结果"]
    J --> K["安全、Schema、引用和业务校验"]
    K --> L["记录Usage、版本、耗时和结果"]

DeepSeek仍遵循大语言模型的Tokenizer、Embedding、Transformer、Logits和逐Token生成主线。详见 大模型Token、训练与推理原理

三、Dense和MoE有什么不同

3.1 Dense FFN

普通Dense Transformer中,每个Token经过某层FFN时使用同一组参数:

text
每个Token → 同一个FFN → 输出

所有FFN参数都参与每个Token计算。

3.2 MoE FFN

MoE把一个FFN替换为多个专家。Router根据Token隐藏状态计算专家分数,只选择Top-k路由专家,再聚合输出:

mermaid
flowchart TD
    A["当前Token隐藏状态h"] --> B["Router线性投影得到专家Logits"]
    B --> C["Softmax/路由分数"]
    C --> D["选择Top-k路由专家"]
    A --> E["共享专家始终参与/按具体架构"]
    D --> F["被选专家分别执行FFN"]
    F --> G["按路由权重聚合"]
    E --> H["共享专家输出"]
    G --> I["组合为MoE层输出"]
    H --> I

示意公式:

text
router_logits = W_router h
gates = softmax(router_logits)
selected = TopK(gates)
output = Σ gate_i × Expert_i(h) + SharedExpert(h)

并非所有DeepSeek版本都有完全相同的共享专家数量、Top-k和路由实现,必须以模型配置与论文/模型卡为准。

3.3 总参数与激活参数

MoE有大量专家权重,所以总参数很大;每个Token只激活一部分路由专家,因此单Token计算使用的激活参数较少。

这不代表部署只需要存激活参数:服务通常仍需保存或分布式加载全部专家权重。总参数影响磁盘、内存/显存和加载;激活路径影响每Token计算;路由分布影响通信和吞吐。

四、Router怎样选择专家

Router读取每个Token的隐藏向量,为各专家打分并选择Top-k。不同Token可去不同专家:代码Token、数学表达和自然语言可能形成不同路由倾向,但不能简单给每个专家贴固定人类标签。

4.1 Capacity和溢出

训练/服务实现可能限制每个专家处理Token容量。大量Token集中到一个专家会形成热点、排队或Token处理策略问题。

4.2 负载均衡

训练需要防止Router把大部分Token送给少数专家,否则其他专家训练不足且硬件不均衡。不同版本可能使用辅助损失、偏置调节或其他负载均衡方法。不要把某个版本的“无辅助损失”机制泛化到所有DeepSeek模型。

4.3 路由不是业务路由

MoE Router在模型层内按Token选择神经网络专家;业务模型路由按任务选择模型或服务。两者完全不同:

text
MoE Router:Token → 神经网络专家
业务Router:请求 → 小模型/推理模型/人工流程

五、MoE部署为什么有通信成本

专家可能分布在不同GPU。一个Batch中的Token路由到不同设备时,需要All-to-All类数据交换:

mermaid
flowchart TD
    A["各GPU持有一批Token"] --> B["Router决定目标专家"]
    B --> C["跨GPU发送Token到专家所在设备"]
    C --> D["专家并行计算"]
    D --> E["把专家输出发送回原Token位置"]
    E --> F["继续后续层"]

性能受:

  • GPU互联带宽和拓扑。
  • Expert Parallel布局。
  • Batch大小和Token分布。
  • 热点专家。
  • 通信与计算重叠。
  • 量化/Kernel支持。

单卡小模型体验不能代表大型MoE生产吞吐;“每Token激活参数少”也不能推导为普通工作站能装下完整权重。

六、MLA解决什么方向的问题

Multi-head Latent Attention(MLA)是部分DeepSeek模型公开架构中的注意力设计方向:对Key/Value相关状态做低维潜变量压缩,目标之一是减少推理时KV Cache与内存带宽压力,同时保留多头表达。

直觉:

mermaid
flowchart TD
    A["隐藏状态"] --> B["压缩为较低维KV潜表示"]
    B --> C["缓存潜表示而非完整传统KV"]
    C --> D["注意力计算时恢复/映射所需表示"]
    D --> E["完成当前Token注意力"]

不能把MLA理解为“KV Cache消失”。缓存格式、旋转位置部分、投影和Kernel实现仍占资源。也不能把MLA写成所有DeepSeek/蒸馏模型都有;Distill学生模型通常继承其基础架构,需看配置。

七、Reasoning模型和普通Chat模型

对比普通Chat/InstructReasoning模型
目标通用响应、问答和执行指令复杂数学、代码、规划等推理
输出Token通常较可控可能生成更长中间过程和答案
延迟/费用相对低可能更高
适合分类、改写、简单问答复杂推理且价值足够高
风险幻觉、格式等同样有幻觉,推理长不等于正确

7.1 推理过程不等于事实证明

模型产生很长的步骤,仍可能从错误前提得到流畅结论。业务应验证最终事实、计算和工具结果,不应把“思考更长”当正确率证据。

7.2 reasoning_content等字段

某些API/版本可能返回单独推理字段,另一些只返回最终content,字段名和可用性并非统一OpenAI协议保证。应用要按Provider版本解析,并遵守模型条款与数据政策。

生产日志不应默认保存完整推理过程:它可能包含用户敏感信息、系统规则、RAG片段和工具结果。通常记录结构化决策摘要、最终答案、Usage和证据更合适。

7.3 推理模型路由

简单分类、固定抽取和短问答不一定值得走推理模型。可按任务复杂度、风险、预算和SLO路由;高风险场景即使推理模型失败,也可能应转人工而不是降级到未验证小模型。

八、Distill究竟是什么

蒸馏通常用教师模型生成或筛选的数据训练较小学生模型,使学生学习部分行为。学生模型:

  • 参数和架构取决于选定底座。
  • Tokenizer可能继承学生底座。
  • 能力不会与教师完全相同。
  • 对长推理、工具、多语言和安全的保留程度需评估。
  • 更容易本地部署,但仍要看量化和硬件。

名字中“R1-Distill-某底座-8B”应理解为“以某8B底座学习蒸馏数据/行为”,不是完整R1 MoE在本地只激活8B且无需加载其他专家。

九、云API接入

9.1 配置边界

使用环境变量:

text
DEEPSEEK_API_KEY
DEEPSEEK_BASE_URL
DEEPSEEK_MODEL

模型名、Base URL和字段必须以当前Provider文档为准,不要把本文示意写死到生产。所谓OpenAI兼容通常表示请求形状相似,不保证模型名、reasoning字段、Tool Calling、JSON Schema、Usage、错误码和流式事件完全一致。

9.2 Python调用Demo

python
import os
import time
import uuid
import requests


API_KEY = os.environ["DEEPSEEK_API_KEY"]
BASE_URL = os.environ["DEEPSEEK_BASE_URL"].rstrip("/")
MODEL = os.environ["DEEPSEEK_MODEL"]


def chat(question: str) -> dict:
    if not question.strip() or len(question) > 4000:
        raise ValueError("问题为空或过长")

    request_id = str(uuid.uuid4())
    started = time.perf_counter()
    response = requests.post(
        f"{BASE_URL}/chat/completions",
        headers={
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json",
            "X-Request-Id": request_id,
        },
        json={
            "model": MODEL,
            "messages": [
                {"role": "system", "content": "不确定时明确说明,不得编造实时数据。"},
                {"role": "user", "content": question},
            ],
            "stream": False,
            "temperature": 0.2,
            "max_tokens": 1200,
        },
        timeout=(3.0, 60.0),
    )

    if response.status_code == 429:
        raise RuntimeError(f"限流 requestId={request_id} retryAfter={response.headers.get('Retry-After')}")
    if response.status_code in {401, 403}:
        raise RuntimeError(f"认证或权限失败 requestId={request_id}")
    response.raise_for_status()

    payload = response.json()
    choices = payload.get("choices") or []
    if not choices:
        raise RuntimeError(f"没有候选结果 requestId={request_id}")

    return {
        "answer": choices[0]["message"].get("content"),
        "finish_reason": choices[0].get("finish_reason"),
        "usage": payload.get("usage"),
        "model": payload.get("model", MODEL),
        "provider_request_id": response.headers.get("x-request-id"),
        "request_id": request_id,
        "elapsed_ms": int((time.perf_counter() - started) * 1000),
    }

生产还要补请求/并发/Token/金额限额、Deadline、有限重试、熔断、模型路由、脱敏、评估和审计。

十、OpenAI兼容不等于完全相同

逐项验证:

能力需要验证
Messages支持哪些Role和多轮格式
StreamingSSE事件、结束标记、Usage
Reasoning字段是否存在、能否关闭/控制
Tool CallingSchema、并行工具、结果消息格式
Structured OutputJSON mode/Schema支持程度
Token限制输入输出和总窗口口径
UsagePrompt、Completion、缓存Token口径
Error401/403/404/429/5xx结构
Model Name云端模型别名是否会指向新版本

业务代码应通过模型网关/适配层隔离差异,不能散落厂商字段。

十一、Ollama本地运行

11.1 Ollama负责什么

Ollama管理模型清单、下载/打包、加载、推理和本地API。它简化入门,但不自动提供企业鉴权、租户、SLA、集群调度、完整观测和高并发能力。

11.2 命令

模型标签以实际仓库为准:

powershell
ollama --version
ollama list
ollama pull deepseek-r1:8b
ollama show deepseek-r1:8b
ollama run deepseek-r1:8b

生产记录模型内容Digest和实际show信息,不能只记可变Tag。

11.3 本地API

PowerShell:

powershell
$body = @{
    model = "deepseek-r1:8b"
    stream = $false
    messages = @(
        @{ role = "system"; content = "你是严谨的技术助手。" }
        @{ role = "user"; content = "解释JVM堆和栈的区别。" }
    )
} | ConvertTo-Json -Depth 6

Invoke-RestMethod `
    -Method Post `
    -Uri "http://127.0.0.1:11434/api/chat" `
    -ContentType "application/json; charset=utf-8" `
    -Body $body

不要让浏览器直接访问Ollama。业务后端负责身份、租户、限流、Prompt、RAG、工具和审计。

十二、本地部署不只有Ollama

方式适用边界
Ollama个人/开发快速体验高并发和企业治理需额外建设
llama.cpp类CPU/边缘和GGUF量化模型格式、Kernel和吞吐需测试
vLLM类GPU服务、持续Batch和OpenAI风格API模型架构/量化/多卡支持需确认
TGI等服务标准化模型Serving版本和目标模型兼容需确认
云API无需自管GPU、弹性数据、费用、配额和供应商依赖

选型依据是目标模型支持、硬件、并发、上下文、流式、量化、监控和SLO,而不是只看安装命令最短。

十三、资源估算

权重理论存储:

text
权重字节 ≈ 总参数量 × 每参数比特 / 8

MoE完整部署通常要存全部专家权重,不能只按每Token激活参数估算。还要加入:

text
量化元数据
KV Cache
推理激活和工作区
CUDA Context
多卡通信缓冲
并发请求
推理引擎开销

13.1 可运行估算Demo

python
def gib(value: float) -> float:
    return value / 1024 ** 3


def estimate_weight_storage(total_parameters: int, bits: int) -> dict:
    if total_parameters <= 0 or bits <= 0:
        raise ValueError("参数量和bits必须为正数")
    raw = total_parameters * bits / 8
    return {
        "total_parameters": total_parameters,
        "bits": bits,
        "raw_weight_gib": round(gib(raw), 2),
        "warning": "仅权重理论值,未含量化元数据、KV Cache、工作区和并发",
    }


for bits in (16, 8, 4):
    print(estimate_weight_storage(8_000_000_000, bits))

容量必须用目标模型、量化文件、输入长度和并发压测。理论4-bit不代表文件严格0.5字节/参数,也不保证GPU Kernel支持。

十四、KV Cache、上下文和并发

KV Cache随层数、KV头/潜表示、序列长度、精度和并发增长。MLA等设计可降低方向上的Cache压力,但不同模型/引擎实现差异很大。

mermaid
flowchart TD
    A["并发增加"] --> B["在途序列增加"]
    B --> C["KV Cache总量增加"]
    C --> D["可用显存下降"]
    D --> E["Batch调度/排队变化"]
    E --> F["TTFT、吞吐和OOM风险变化"]

限制QPS不够,还要限制在途并发、输入Token、输出Token和金额。推理模型长输出会占用调度槽更久。

十五、RAG为什么仍需要Embedding模型

聊天/推理模型负责生成,不自动把上传文件建立向量索引。RAG:

text
文档解析、切分、权限元数据
→ Embedding模型生成向量
→ 向量库
→ 问题向量化
→ 权限Filter
→ 召回/Rerank
→ 资料放入DeepSeek上下文
→ 回答和引用校验

Embedding模型与聊天模型可以来自不同家族。文档和查询必须使用同一Embedding空间。安装聊天模型不等于安装了知识库能力。

十六、Reasoning、RAG和Tool怎样组合

mermaid
flowchart TD
    A["业务问题"] --> B["判断是否需要私有知识"]
    B -->|"是"| C["RAG按权限召回"]
    B -->|"否"| D["使用模型参数知识"]
    C --> E["判断是否需要实时事实/动作"]
    D --> E
    E -->|"是"| F["受控Tool Calling"]
    E -->|"否"| G["模型生成"]
    F --> G
    G --> H["事实、引用、Schema和安全校验"]

推理模型不能替代RAG和工具:思考更久也无法知道当前订单状态、最新制度和用户权限。

十七、商业模型路由

场景建议方向
简单分类/抽取经评估的小模型或蒸馏模型
常规知识问答Chat模型+RAG
复杂代码/数学分析Reasoning模型,限制预算
实时业务查询Chat/Reasoning+受控Tool
高风险医疗/支付权威数据+规则+人工,模型辅助
敏感内网经安全评估的本地部署

模型路由必须按能力和评估,不是“失败就换最便宜模型”。Tool Schema、结构化输出、多模态和安全策略不兼容时不能直接降级。

十八、版本和可观测性

每次调用至少记录:

text
modelAlias与实际Revision/Digest
Tokenizer/Chat Template
量化格式和精度
推理引擎与版本
Prompt版本
RAG索引/Embedding/Rerank版本
Tool Schema版本
安全策略版本
输入/输出/缓存Token
排队、TTFT、TPOT和总耗时
finish reason、错误码和Provider requestId

不要记录API Key和完整敏感Prompt。云模型别名可能在服务端升级,生产应获取和保存可用的实际版本证据,并在变更后回归评估。

十九、安全边界

  • API Key只在后端Secret系统。
  • 本地模型服务不直接暴露公网。
  • RAG先权限过滤再检索。
  • Tool参数视为不可信并后端鉴权。
  • 推理过程、Prompt和日志可能含敏感数据。
  • 模型输出不能直接执行SQL、Shell、退款和删除。
  • 模型文件和量化产物校验来源、Hash和许可证。
  • 第三方Ollama/量化Tag不能因名字相似自动信任。

二十、生产Runbook

20.1 模型名404或能力不一致

检查Base URL、API路径、模型别名、账号权限、Region和实际返回model字段。本地检查ollama show、Digest和模板。不要把云模型名直接当Ollama标签。

20.2 输出很长、重复或停不下来

检查模型类型、Chat Template、EOS/stop、最大输出、历史重复和推理字段处理。推理模型可能输出更长,但无限重复可能是模板、量化、采样或上下文问题。

20.3 本地模型启动即OOM

检查实际模型总参数、量化文件、GPU/CPU offload、引擎工作区和其他进程。MoE按总权重估算,不按激活参数。换更小/更低比特模型只是止血,需验证质量。

20.4 运行后随并发OOM

检查上下文与输出长度分布、KV Cache、在途并发、Batch和引擎调度。降低最大并发和Token,结合监控核算单请求Cache;不要只重启。

20.5 首Token慢

拆排队、网络、RAG、Prompt长度和Prefill;云端还看Provider配额/Region,本地看GPU利用、Batch和模型加载。TTFT慢与后续TPOT慢排查方向不同。

20.6 API兼容客户端解析失败

保存脱敏原始响应和Header,比较reasoning、tool_calls、usage、finish_reason和SSE事件。适配层按Provider版本解析,不能强制假设所有字段与另一个厂商一致。

20.7 模型升级后质量下降

核对实际Revision、Prompt、RAG、工具和解码版本,用固定评估集比较。冻结扩流并路由回已验证模型;只看“DeepSeek名字没变”不足以证明运行内容没变。

20.8 RAG上传文档后答不到

检查解析、切分、Embedding、索引状态、权限Filter、TopK、Rerank和实际送入模型的上下文。聊天模型换成Reasoning模型不能修复未召回。

二十一、常见误区

DeepSeek是一个固定模型

错误。必须说明家族、版本、规模、底座、量化和服务。

R1 8B就是完整R1只激活8B

错误。常见小模型是蒸馏到Dense底座的产物,需看模型卡。

MoE只需加载激活参数

错误。每Token计算只激活部分专家,但部署仍需保存/分布加载专家权重。

推理过程越长答案越正确

错误。错误前提也能产生长而流畅的步骤,最终需事实和规则校验。

OpenAI兼容就能零修改替换

错误。字段、Tool、Reasoning、Usage、错误和流式事件可能不同。

Ollama跑起来就达到生产级

错误。还缺鉴权、租户、限流、监控、SLO、扩容和回滚。

二十二、面试标准回答

DeepSeek R1、Distill和普通Chat模型怎么区分

Reasoning模型面向复杂推理,可能生成更长过程和输出;普通Chat适合通用对话和较短任务;Distill模型以较小学生底座学习教师产生的推理行为,架构、Tokenizer和容量由学生底座决定,不等于完整R1机械缩小版。

MoE为什么计算省但部署仍重

MoE拥有很多专家,Router为每个Token只选择Top-k路由专家,所以单Token激活计算少于使用全部专家;但完整专家权重仍要存储或分布式加载,专家并行还产生跨GPU通信和热点,因此总参数、激活参数和部署显存必须分开看。

MLA解决什么问题

MLA是部分DeepSeek架构中对注意力KV状态做低维潜表示压缩的设计方向,目标之一是降低KV Cache和内存带宽压力。它不让Cache消失,也不是所有DeepSeek和蒸馏模型都具备,需看具体配置。

DeepSeek本地部署为什么还需要Embedding模型

聊天/推理模型负责生成,不自动为企业文档建立检索索引。RAG还要用Embedding模型把文档和问题映射到同一向量空间,经权限过滤召回片段,再交给DeepSeek回答。

二十三、学习验收

不看答案完成:

  1. 为手中模型写出仓库、Revision、底座、参数、架构、量化和许可证。
  2. 区分Base、Chat、Reasoning和Distill。
  3. 画出MoE Router、Top-k、专家和聚合流程。
  4. 解释总参数与激活参数为什么不同。
  5. 解释专家并行为何需要All-to-All类通信。
  6. 说明MLA不等于KV Cache消失。
  7. 比较云API和Ollama响应字段。
  8. 运行8B权重估算Demo并说明遗漏项。
  9. 设计简单任务和复杂推理任务的模型路由。
  10. 给本地服务补鉴权、并发、Token和费用控制。
  11. 用固定评估集比较Chat和Reasoning模型。
  12. 分别排查启动OOM、并发OOM、TTFT慢和RAG召回空。

关联知识点