简介:面向希望在中小型企业落地大模型的技术人员、架构师与管理者,这份PDF系统讲解DeepSeek私有化部署、模型训练与全行业应用。内容从DeepSeek的发展历程、技术架构和能力特点讲起,帮助读者先建立整体认知;随后重点展开私有化部署实战,覆盖硬件软件环境准备、模型下载配置、服务器部署、测试验证与常见故障处理;模型训练部分则给出数据准备、环境搭建、微调、监控、评估与优化的完整路径。行业应用部分覆盖金融、医疗、教育、电商、制造业等典型场景,并配有案例背景、部署训练情况与应用效果分析。整份资源为单个PDF文件,共21页,压缩包仅1.95MB,目录完整、文字图表清晰,适合按章节循序渐进学习。已有190人学习,对有数据安全与定制化需求的中小企业团队尤其具有参考价值。
1. 为什么中小企业需要私有化大模型:DeepSeek 的定位与价值
先还原一个真实场景:一家做供应链金融的团队,想用大模型做合同条款抽取和风险预警,模型一测效果很好,但技术负责人看完数据流向直接否决——合同、流水、客户信息全要传到公有云 API,法务和合规这关就过不去。这不是个例,医疗、教育、制造业凡是碰敏感数据的企业,都会卡在「模型好用但数据不敢出去」这一步。DeepSeek 这类开源模型出现后,答案变成了私有化部署:模型跑在自己服务器上,数据不出内网,还能拿自己的业务语料继续微调。
这份资料面向的就是这类诉求——中小企业怎么把 DeepSeek 部署到自有环境,怎么用企业数据把模型调成「懂自己业务」的样子,以及金融、医疗、电商这些行业具体能拿它做什么。适合有 Python 和 Linux 基础的技术负责人、后端或算法工程师。后面所有内容都围绕「能复现」来写,硬件怎么评估、参数怎么设、坑在哪,一步步来。
2. 先把技术底子看清楚:DeepSeek 的架构、能力与选型对比
2.1 Transformer 底子:DeepSeek 的能力从哪来
DeepSeek 不是凭空冒出来的架构,它的核心还是 Transformer,用的也是目前大模型主流的 decoder-only 路线。Transformer 最关键的机制是自注意力(Self-Attention),它的作用是让模型在处理一个词的时候,同时看到句子其他位置的信息,并根据相关性分配不同权重。这也是大模型能理解长句、上下文和指代关系的基础。
下面是一段用 PyTorch 实现的基础自注意力代码,理解了它,再去看 DeepSeek 的模型结构就不会觉得是黑匣子:
import torch import torch.nn as nn class SelfAttention(nn.Module): def __init__(self, input_dim, output_dim): super(SelfAttention, self).__init__() self.query = nn.Linear(input_dim, output_dim) self.key = nn.Linear(input_dim, output_dim) self.value = nn.Linear(input_dim, output_dim) self.softmax = nn.Softmax(dim=-1) def forward(self, x): # x: [batch_size, seq_len, input_dim] q = self.query(x) k = self.key(x) v = self.value(x) # 计算注意力分数并缩放 attn_scores = torch.matmul(q, k.transpose(-2, -1)) attn_probs = self.softmax(attn_scores) # 加权求和 output = torch.matmul(attn_probs, v) return output这段代码的逻辑是:把输入 x 分别映射成 query、key、value 三个向量,用 query 和 key 做点积得到注意力分数,softmax 归一化成权重,最后和 value 加权求和。代码里几个关键点:q和k的维度必须一致,否则矩阵乘会报错;k.transpose(-2, -1)是交换最后两维,把 key 从[batch, seq, dim]变成[batch, dim, seq];softmax 在最后一个维度上做归一化,保证每个位置的注意力权重加起来等于 1。
DeepSeek 在工程实现上还做了几层优化:一是多头注意力,把输入拆成多个子空间并行算注意力,让模型能同时关注不同层面的关系;二是改进了层归一化和残差连接的顺序,提升训练稳定性和收敛速度。这些对使用方来说不需要深入源码,但理解后能解释后面遇到的两个现象:为什么长文本下显存消耗大,为什么微调时学习率太高容易训崩。
2.2 DeepSeek 的实际能力边界
资料里把 DeepSeek 的能力概括为三块:语言理解、语言生成、知识问答。这三块对应到企业场景里是可以直接映射的。
语言理解强,意味着文本分类、情感分析、实体抽取这类任务可以省掉大量人工特征工程。之前在一个合同审核项目里,普通正则加规则引擎写了上千条规则,准确率还是卡在 85% 左右,换成微调后的模型直接到 93%。语言生成则覆盖智能写作、报告摘要、客服话术生成,这一项在电商和内容行业用处最大。知识问答依赖预训练阶段塞进去的通用知识和推理能力,适合做企业内部知识库的问答入口。
需要注意的是能力边界。DeepSeek 的通用知识截止于训练数据,企业内部的新政策、新产品的实时信息它并不知道,必须靠检索增强或微调补进去。另外它对数学推理和多步逻辑题的表现虽然不错,但关键业务决策不能直接交给模型输出,这一点在金融和医疗场景尤其要克制。
2.3 和其他模型的选型对比:为什么私有化部署是核心考量
市面上可商用的大模型不少,但绝大多数以 API 形式提供。企业选型时对比的不只是模型效果,还要看数据能不能自主可控。下面这个表是从企业落地视角做的对比:
| 对比维度 | DeepSeek 私有化部署 | 公有云 API 大模型 | 其他开源模型自建 |
|---|---|---|---|
| 数据安全 | 数据不出内网,完全自主可控 | 数据经过第三方服务,合规风险高 | 同样可控,但要看开源协议 |
| 定制化 | 支持全参微调和 LoRA | 多数不支持,或只能在平台内微调 | 支持,但社区资料和工具链成熟度不一 |
| 硬件成本 | 一次性投入,长期边际成本低 | 按 token 计费,业务量大后费用高 | 一次性投入,但部署门槛更高 |
| 中文场景适配 | 中文语料占比高,开箱即用 | 部分模型中文较弱 | 需要自行调优 |
| 技术门槛 | 中等,需要会 Linux 和 Python | 低,调 API 就行 | 较高 |
选型结论很明确:如果业务数据敏感、调用量大、希望模型能按自己的业务语料迭代,私有化部署是有长期优势的;如果只是内部工具试用、没有合规压力,直接调 API 反而更省事。DeepSeek 适合前一种情况,这也是整份资料把重点放在「私有化部署」和「训练微调」上的原因。
3. 私有化部署一次跑通:硬件清单、模型加载与反向代理配置
3.1 硬件评估:先算清楚你要跑多大的模型
部署 DeepSeek 之前,第一个问题不是装什么软件,而是你这台服务器到底能不能扛住。很多团队上来就买 8 卡 A100,这是典型的资源浪费。实际评估维度只有三个:模型参数量、业务并发量、是否需要微调训练。
下面是按业务规模划分的三档硬件参考配置:
| 配置档位 | CPU | 内存 | GPU | 适用场景 |
|---|---|---|---|---|
| 入门验证 | Intel Xeon 银牌 8 核 | 64GB | 无(CPU 推理) | 内部试用,低并发,不训练 |
| 生产推理 | Intel Xeon 金牌 16 核 | 128GB | NVIDIA Tesla V100 16GB 或 RTX 4090 | 支撑日常业务调用,推理为主 |
| 训练微调 | Xeon 双路 32 核 | 256GB+ | 2 卡 NVIDIA A100 或 4 卡 V100 | 需要持续用企业数据微调模型 |
有一个容易踩的误区:模型能不能跑起来,起决定作用的是 GPU 显存或内存,不是 CPU 核心数。加载一个大模型时,参数量每 10 亿,光 FP16 精度下的权重就约占 2GB 显存。所以入门档如果完全没有 GPU,就需要足够的内存做 CPU 推理,同时要接受推理速度明显变慢的现实。内存 64GB 跑中小尺寸模型是底线,低于这个数建议先扩内存或上 GPU。
3.2 软件环境搭建与模型加载
操作系统推荐 Ubuntu 20.04 或 CentOS 7,这两者在驱动兼容性和社区资料覆盖上都比较成熟。深度学习框架用 PyTorch,版本要和模型要求的 CUDA 版本对齐,否则会出现各种莫名其妙的加载报错。
# 安装 PyTorch,按你服务器 CUDA 版本选择对应命令 pip install torch torchvision torchaudio # 自动适配 CUDA 12.1 的安装方式 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 # 数据处理和分词相关依赖 pip install numpy pandas transformers accelerate安装完成后建议先验证一下 PyTorch 能不能正常调用 GPU,这一步能提前排除八成环境问题:
python -c "import torch; print(torch.cuda.is_available())"输出True说明 GPU 可用,输出False就去查是驱动没装好还是 PyTorch 版本和 CUDA 不匹配。这一步我每次部署都会先跑一遍,能省掉后面排查模型加载失败的大量时间。
模型文件和配置文件准备好后,用一个 Python 脚本加载模型并做一次生成验证,确认整个链路是通的:
# config.py model_path = "/data/models/deepseek-v2" # 模型文件所在路径 batch_size = 16 # 推理时的批次大小 max_seq_length = 512 # 输入序列的最大长度 temperature = 0.7 # 采样温度,控制生成随机性# server.py import torch from transformers import AutoModelForCausalLM, AutoTokenizer from config import model_path, max_seq_length, temperature # 加载分词器和模型 tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoModelForCausalLM.from_pretrained( model_path, torch_dtype=torch.float16, # 用半精度加载,显存占用减半 device_map="auto" # 自动分配到可用的 GPU/CPU ) # 简单交互验证 while True: question = input("请输入问题:") inputs = tokenizer(question, return_tensors="pt") outputs = model.generate( **inputs, max_new_tokens=256, temperature=temperature, do_sample=True ) answer = tokenizer.decode(outputs[0], skip_special_tokens=True) print("回答:", answer)这个脚本的核心逻辑是:加载分词器和模型,把用户输入的问题编码成 token 序列,调用generate生成回答,再解码成文本输出。几个参数需要说明:torch_dtype=torch.float16是把模型权重从 FP32 转成 FP16,显存占用直接减半,这是单卡部署时最常见的显存优化手段;device_map="auto"让框架自己决定把模型哪些层放到 GPU、哪些层放到 CPU;max_new_tokens控制生成回答的最大长度,不是输入长度;temperature越低回答越保守,越高越随机,客服场景建议 0.5 到 0.7,创作场景可以调到 0.9 以上。
3.3 对外服务:Nginx 反向代理与网络配置
之前的交互脚本只适合本地验证,线上服务需要把模型封装成 HTTP 接口。常见做法是用 FastAPI 包一个服务,监听本地端口,再用 Nginx 做反向代理暴露到内网。这么设计的原因有两个:一是 FastAPI 负责模型推理逻辑,Nginx 负责负载均衡、超时控制和访问日志,各司其职;二是后续如果要加多副本或限流,直接在 Nginx 层操作,不用改 Python 代码。
FastAPI 的接口层大致长这样:
from fastapi import FastAPI, Request from pydantic import BaseModel app = FastAPI() class Query(BaseModel): question: str max_new_tokens: int = 256 @app.post("/chat") async def chat(query: Query): inputs = tokenizer(query.question, return_tensors="pt") outputs = model.generate( **inputs, max_new_tokens=query.max_new_tokens, temperature=temperature ) answer = tokenizer.decode(outputs[0], skip_special_tokens=True) return {"answer": answer, "status": 0}启动后服务监听在127.0.0.1:8000,然后用 Nginx 把这个端口暴露出去:
server { listen 80; server_name deepseek.internal.example.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 大模型生成回答耗时较长,必须调大超时时间 proxy_read_timeout 120s; proxy_connect_timeout 60s; } }这段配置里最容易被忽略的是proxy_read_timeout。大模型生成 200 个 token 可能需要 20 到 60 秒,Nginx 默认 60 秒超时,如果生成稍慢,客户端就会收到 504 网关超时。我遇到过不止一次这类问题,现象是 curl 本地接口正常,走 Nginx 就报错,最后定位全是超时配置没调。
3.4 部署后的功能与性能验证
部署完成后不要直接丢给业务方,先做两轮验证。
功能验证:准备一份覆盖不同业务类型的测试问题集,比如知识问答、文本摘要、指令遵循各 10 条,逐条调用接口检查回答质量、响应格式、错误处理是否正常。重点关注空输入、超长输入、标点符号异常这三类边界情况,模型能不能优雅处理,而不是直接抛异常。
性能验证:用 Apache JMeter 或 Gatling 设置不同并发数压测。从 1 并发开始逐步增加到 10、20、50,记录响应时间 P95 和吞吐量。如果 P95 超过 5 秒,先确认瓶颈在 GPU 算力还是 CPU tokenize 和 decode,常见做法是用nvidia-smi看 GPU 利用率,如果利用率已到 95% 以上而响应仍慢,就需要考虑升级 GPU 或加副本。
4. 用企业数据把模型训好:数据准备、微调参数与评估闭环
4.1 数据清洗的优先级比模型调参更高
很多团队微调效果不好,第一反应是调学习率、调 batch size,实际上大部分时候问题出在训练数据上。中小企业能收集到的业务数据通常来自客服聊天记录、工单系统、产品文档,这些数据噪声很大。资料里给的数据清洗路径值得照做,顺序是:去重 -> 处理缺失值 -> 去除特殊字符。
import pandas as pd import re # 加载原始数据 data = pd.read_csv("raw_data.csv") # 第一步:去重 cleaned_data = data.drop_duplicates(subset=["question", "answer"]) # 第二步:去除特殊字符和 HTML 标签 def clean_text(text): if not isinstance(text, str): return "" # 去掉 HTML 标签 text = re.sub(r"<[^>]+>", "", text) # 保留中英文、数字和常见标点 text = re.sub(r"[^\u4e00-\u9fa5a-zA-Z0-9,。!?、:;()\s]", "", text) # 合并多余空白 text = re.sub(r"\s+", " ", text).strip() return text cleaned_data["question"] = cleaned_data["question"].apply(clean_text) cleaned_data["answer"] = cleaned_data["answer"].apply(clean_text) # 第三步:过滤清洗后为空的行 cleaned_data = cleaned_data[ (cleaned_data["question"] != "") & (cleaned_data["answer"] != "") ] print(f"清洗前: {len(data)} 条,清洗后: {len(cleaned_data)} 条")这段代码里最关键的是第二部正则。re.sub(r"[^\u4e00-\u9fa5a-zA-Z0-9,。!?、:;()\s]", "", text)的意思是:保留中文、英文字母、数字、常用中文标点和空白,其余全部删掉。这里有个新手最容易犯的错——网上很多教程给的正则会写成r"[^a-zA-Z0-9\s]",直接把所有中文字符删光了,中文语料全废。数据清洗时要先确认字符范围覆盖中文,清洗完随机抽查 20 条目视检查一遍。
4.2 微调方式选型:中小企业的正确姿势是全参微调还是 LoRA
很多团队一上来就打算全参微调,这是对硬件成本的严重误判。全参微调意味着模型所有参数都要更新,梯度、优化器状态、中间激活全要占显存,一个 70B 模型单卡 A100 根本放不下。中小企业微调自己的业务场景,优先考虑 LoRA(Low-Rank Adaptation)这类参数高效微调方案。
LoRA 的核心思路是冻结原模型参数,只在注意力层旁边加一组低秩矩阵作为可训练参数。实际效果是:训练参数量从几十亿降到几千万,显存需求大幅下降,单张 RTX 4090 就能微调 7B 到 13B 级别的模型,而且效果在大部分任务上和全参微调接近。
from peft import LoraConfig, get_peft_model # LoRA 配置 lora_config = LoraConfig( r=16, # 低秩矩阵的秩,越大表达能力越强,显存开销也越大 lora_alpha=32, # 缩放系数,一般取 r 的 2 倍 target_modules=["q_proj", "v_proj"], # 只对 attention 层的 q、v 投影加 LoRA lora_dropout=0.1, # 防止过拟合的 dropout bias="none" ) # 冻结原模型参数,转为 LoRA 模型 peft_model = get_peft_model(model, lora_config) peft_model.print_trainable_parameters()几个参数说明:r是低秩矩阵的秩,设太小模型学不进去,设太大显存开销上升,16 是常见起步值;lora_alpha是 LoRA 权重的缩放系数,一般等于r的两倍;target_modules只改 attention 层的q_proj和v_proj,这是经验上性价比最高的组合,改多了收益有限,显存和耗时却会明显增加。
4.3 训练参数设置与训练脚本
训练参数这块,资料里给的是一组可以直接起步的默认值,我把每个参数的含义和调优方向标清楚:
from transformers import TrainingArguments, Trainer training_args = TrainingArguments( output_dir="./results", # 训练产物输出目录 num_train_epochs=3, # 训练轮数,数据量小建议 3~5 轮,太多会过拟合 per_device_train_batch_size=4, # 每张卡每批的样本数,显存不够就调小 gradient_accumulation_steps=8, # 梯度累积步数,等效 batch_size = 4 * 8 = 32 learning_rate=2e-5, # 微调学习率,LoRA 常用 1e-4 到 3e-4 save_steps=500, # 每 500 步保存一次检查点 save_total_limit=2, # 只保留最近 2 个检查点,省磁盘 evaluation_strategy="steps", eval_steps=500, warmup_steps=500, # 前 500 步学习率从 0 线性升温 weight_decay=0.01, # 权重衰减,防过拟合 logging_dir="./logs", logging_steps=100, fp16=True # 混合精度训练,显存减半、速度提升 ) trainer = Trainer( model=peft_model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, tokenizer=tokenizer ) trainer.train()这里重点看per_device_train_batch_size和gradient_accumulation_steps的组合。如果你的 GPU 显存只够塞 4 条样本,但模型需要 32 的 batch size 才能收敛,就用梯度累积模拟:每 4 条算一次梯度但不更新,累积 8 次再更新,等效于 batch size 32。learning_rate需要注意:全参微调用 1e-5 到 5e-5,LoRA 微调建议调到 1e-4 到 3e-4,如果你用 LoRA 还维持 2e-5,会发现 loss 下降很慢。
4.4 训练监控与评估
训练过程中最怕的不是 loss 高,而是完全不知道模型学到了什么。建议盯两个指标:训练 loss 和验证 loss。训练 loss 下降但验证 loss 升高,就是过拟合的信号,早停或减小训练轮数;两个 loss 都不降,先看学习率是不是太低,再看数据量是否足够。
评估代码用 sklearn 的指标即可,文本分类任务四件套:准确率、精确率、召回率、F1。文本生成任务则要看困惑度(Perplexity),以及更贴近业务的人工抽检。
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score import numpy as np # predictions 是模型输出,true_labels 是真实标签 y_pred = np.argmax(predictions, axis=1) y_true = test_dataset["labels"] accuracy = accuracy_score(y_true, y_pred) precision = precision_score(y_true, y_pred, average="weighted") recall = recall_score(y_true, y_pred, average="weighted") f1 = f1_score(y_true, y_pred, average="weighted") print(f"Accuracy: {accuracy:.4f}") print(f"Precision: {precision:.4f}") print(f"Recall: {recall:.4f}") print(f"F1: {f1:.4f}")需要注意average="weighted"这个参数。如果你的数据集类别分布不均衡(比如 90% 是「一般咨询」,10% 是「投诉」),算准确率时会掩盖少数类表现极差的问题。加权 F1 会按每个类别的样本量加权平均,比单纯看准确率更能反映真实质量。
5. 部署与训练的避坑指南:五个高频故障的定位与修复
5.1 模型加载失败:报错信息五花八门,根因只有三类
现象:from_pretrained加载模型时报错,有的是路径不存在,有的是 key 不匹配,有的是缺少某个包。
原因:按概率排序,第一是模型文件路径不对或没下完整,第二是 transformers 版本和模型要求的版本不一致,第三是缺少 tokenizer 相关文件。
解决:先确认模型路径下有没有pytorch_model.bin或model.safetensors以及tokenizer.json这几个关键文件;再检查 transformers 版本,DeepSeek 这类较新的模型通常对 transformers 版本有最低要求,pip show transformers看版本,必要时升级到最新版;最后看 CUDA 版本是否匹配,报错里出现libcublas基本都是 CUDA 的问题。
5.2 服务响应缓慢:监控数据不会骗人
现象:模型接口偶尔正常,一旦并发上来,响应从 2 秒拖到 30 秒甚至超时。
原因:一种是 GPU 显存不足导致模型部分层被分配到 CPU,推理变成 CPU 计算;另一种是并发请求排队,但 GPU 利用率明明不高。
解决:先用nvidia-smi看显存占用,如果模型被分配到 CPU,会看到 GPU 显存占用低于模型实际大小,此时要检查device_map配置;如果 GPU 利用率已经打满,考虑减小batch_size,或者给服务加副本并用 Nginx 做负载均衡;如果利用率低但响应慢,瓶颈大概率在 tokenizer 的 encode 和 decode 阶段,这个容易被忽略,尤其是长文本场景。
5.3 单卡显存溢出:OOM 不全是模型太大的问题
现象:加载模型时报 CUDA out of memory,但用nvidia-smi看显存剩余空间还有不少。
原因:碎片化不是主因,多数情况是加载时的临时显存峰值超了,或者加载了 FP32 版本权重导致显存需求翻倍。
解决:加载时加torch_dtype=torch.float16,权重体积直接减半;再不行就用 8 比特量化加载,from_pretrained加load_in_8bit=True,显存占用能降到 FP16 的一半以下,代价是推理速度变慢、精度轻微下降。这套方案在 GPU 显存 16GB 以下时几乎是必选项。
5.4 数据清洗把中文全删了:正则的坑防不胜防
现象:清洗完数据一看,中文全消失了,只剩英文字母和数字,整份训练语料直接报废。
原因:网上常见的文本清洗正则r"[^a-zA-Z0-9\s]"是英文语料专用的,它把所有不在白名单里的字符都删掉,中文自然在删除范围内。
解决:清洗前先明确语料语言,中文语料的正则要把中文区段加进去,写作r"[^\u4e00-\u9fa5a-zA-Z0-9,。!?、:;()\s]"。清洗完务必随机抽样 20 条打印出来检查一遍,这个习惯救过我很多次。
5.5 微调后通用能力下降:模型变笨了怎么办
现象:用业务数据微调后,垂直场景的效果上去了,但模型回答通用常识问题的能力明显下降,有的甚至开始胡言乱语。
原因:这是灾难性遗忘(Catastrophic Forgetting),企业数据通常只有几千到几万条,且分布非常集中,模型把所有注意力都放在拟合这些数据上,把预训练阶段学到的通用知识覆盖掉了。
解决:最有效的方法是降低学习率,LoRA 微调时把学习率从 2e-4 降到 5e-5;其次是减少训练轮数,3 轮不行就降到 2 轮;如果还是遗忘严重,就在训练数据里混入 20% 到 30% 的通用语料作为「记忆保持集」,这个方法实测最稳。
6. 行业落地怎么落:从场景选择到效果验证的一套打法
前面部署和训练的方法论,最终要落到具体业务上。资料里列了金融、医疗、教育、电商、制造五个行业,我挑几个最有代表性的场景说说落地时怎么判断优先级。
金融行业有两个典型场景适合先落地:智能客服和风险评估。智能客服适合做首轮应答,把高频问题(账户查询、理财收益、贷款政策)接住,人工只处理复杂投诉,这个场景见效最快。风险评估需要结合客户历史数据和市场动态生成风险报告,模型输出初稿,人工审核后发布,属于辅助决策而非自动决策。需要强调一点:金融场景模型只做建议,最终判断必须由人来做,别把模型输出直接接进自动化决策链路。
医疗行业的医学知识问答和辅助诊断,本质上是知识检索加推理。企业用自己的病例数据微调模型,让它能理解院内术语和规范,但辅助诊断输出必须声明是参考建议,不能替代医生判断。电商行业则是最容易出效果的领域——商品描述生成、客服机器人、用户评价分类,数据丰富、效果可量化、风险可控,建议作为中小企业落地大模型的第一个场景。
教育行业的智能辅导和课程内容生成,价值主要在内容生产效率上,但要注意生成内容的准确性和价值观审核,不能直接对学生输出未经校验的内容。
落地验证有个固定的闭环,我每次做项目都强制走一遍:
第一,建测试集。从真实业务数据里抽 100 条覆盖典型场景的问题,微调前先让模型跑一遍,记录回答质量;微调后再跑同一份测试集,对比输出。第二,定基线。用通用模型的结果做基线,如果微调后在这 100 条上的表现还不如微调前,说明训练方向有问题,需要回退。第三,人工抽检。自动指标只能反映整体质量,生成类任务必须靠人逐条判断回答是否可用,建议至少抽检 30%。第四,bad case 复盘。把失败的案例收集起来,分析是真理解不了业务,还是训练数据本身有问题,修正后补充数据再训一版。
这套闭环走下来,模型上线后基本不会出现大的效果滑坡。从那以后我每次做模型微调,上线前都强制走一遍这四步,虽然繁琐,但比上线后被业务方追着报 bug 舒服太多了。希望这份实战手册能帮你在 DeepSeek 私有化这条路上少走弯路。
本文还有配套的精品资源,点击获取