DeepSeek-R1 大模型微调实战:训练、部署与 AI 会话系统集成
1. 前言
在快速发展的 AI 技术领域,越来越多的企业正在将 AI 应用于各个场景。尽管大模型(如 GPT、DeepSeek 等)在多个任务上已取得显著进展,但普通的大模型在面对特定行业或任务时,往往会出现AI 幻觉问题。所谓 AI 幻觉,是指模型生成的内容不符合实际需求,甚至包含错误或无关的信息,这对于医疗、法律、金融等行业来说,可能带来不可接受的风险。
对于这些行业的企业而言,精准、高效地输出行业特定内容是核心需求。企业希望 AI 能够处理行业术语、应对特殊情境,并确保内容的准确性。然而,单纯依赖大模型进行推理,往往无法达到这样的标准,因为大模型的训练是基于通用数据集,通常并不包含行业领域的深度知识。因此,企业通常需要一个更加定制化、精细化的模型,而这正是大模型微调技术能够提供的解决方案。
大模型微调技术通过对预训练的大模型进行进一步训练,能够根据特定领域的需求进行优化。通过提供具有代表性的领域数据,尤其是精心标注的行业特定数据,微调后的模型能够学习这些领域的专有知识,从而有效避免 AI 幻觉的发生,并提供更加准确、有价值的输出。
本文将从零开始介绍AI 大模型微调技术(基于 DeepSeek-R1 大模型),最终实现基于私有化部署的微调大模型 AI 会话系统。
2. 大模型微调概念简述
大模型微调是指在已有的预训练大模型基础上,通过特定任务或领域数据进行进一步训练,使模型能够更精准地处理特定任务。与传统的训练方法不同,微调充分利用已有的大模型,减少对大量数据的依赖,同时通过对模型进行小范围的调整,使其适应新的任务。大模型微调技术在多个领域中得到了广泛应用,如文本生成、分类任务、问答系统等。
微调的核心目标是使大模型根据特定任务需求进行优化,提升其在特定应用场景中的表现。为实现这一目标,微调方法主要包括以下两种分类方式:
- 按学习范式分类:根据模型学习方式的不同,微调方法可分为有监督微调、无监督微调和半监督微调等类型。
- 按参数更新范围分类:根据在微调过程中对模型参数更新范围的不同,方法可分为全量微调和部分微调等类型。
2.1. 按学习范式分类
有监督微调(Supervised Fine-Tuning,SFT)
有监督微调是最常见的微调方式,适用于任务明确且具有标注数据的情况。通过使用人工标注的高质量数据对,模型能够学习特定任务所需的知识,从而在指定任务上提供准确的输出。
SFT 示例:
training_data = [
{"input": "问题", "output": "标准答案"} # 人工标注的高质量数据对
]
在有监督微调中,模型的目标是根据输入的'问题'生成一个'标准答案'。这个过程依赖于人工标注的数据,使模型能够更好地理解并生成符合实际需求的结果。有监督微调适用于需要特定答案的任务,如情感分析、文本分类、机器翻译、问答系统等。
无监督微调(Unsupervised Fine-Tuning)
无监督微调是一种不依赖人工标注的微调方式,主要利用大量未标注的文本数据进行训练。通过无监督学习,模型能够自动从原始数据中提取知识,尤其在没有标注数据或标注数据获取困难的情况下尤为有用。
无监督微调示例:
training_data = [
"大量未标注文本..." # 无需人工标注的原始文本
]
这种方式通常用于模型的预训练过程,模型通过对大规模文本进行训练,学习通用的语言表示能力。无监督微调可以增强模型的语法和语义理解能力,提升其在不同任务中的表现,适用于自然语言建模、生成任务等场景,帮助模型理解文本的结构和语义关系。
半监督微调(Semi-Supervised Fine-Tuning)
半监督微调结合了有监督和无监督学习的优点,利用标注数据和未标注数据来训练模型。常用的方法包括将未标注数据通过某种方式生成伪标签,或利用自监督学习方法,使模型在标注数据较少时也能进行有效训练。
半监督微调示例:
training_data = [
{"input": "问题", "output": "标准答案"}, # 高质量人工标注数据
"大量未标注文本..." # 用于填充的未标注数据
]
半监督微调适用于标注数据稀缺的场景,能够结合少量标注数据和大量未标注数据,进一步提升模型表现。这种方法在实际应用中尤其适用于标签获取困难或成本高昂的领域,如医疗、法律等行业。
2.2. 按参数更新范围分类
全量微调(Full Fine-Tuning)
全量微调是指在对预训练模型进行微调时,更新模型的所有参数。通过对特定领域数据的训练,模型的所有层都会根据新任务的数据进行调整。全量微调能够在模型中深度定制领域知识,最大程度地提升模型在目标任务中的效果。
全量微调的特点:
- 更新模型的所有参数。
- 适用于数据量较大且任务复杂的场景。
- 训练时间较长,需要大量计算资源。
全量微调适用于大规模数据集且任务复杂的场景,如文本生成、问答系统、情感分析等。它能够充分利用预训练模型进行深度学习,提供最优效果。
部分微调(Low-Rank Adaptation,LoRA)
部分微调是一种通过对预训练模型的部分参数进行微调的技术。LoRA 的目标是减少微调过程中需要更新的参数数量,从而显著降低计算开销。通过低秩矩阵的方式,LoRA 仅更新模型中的某些参数(如特定层的权重),使微调过程更加高效,特别适合计算资源有限的场景。
LoRA 的特点:
- 只调整部分参数(如低秩矩阵分解)。
- 降低计算和内存开销。
- 适合快速微调,尤其在资源受限时。
LoRA 非常适合在资源有限的情况下快速调整模型,尤其在需要快速部署且不需要全部模型调整的场景中非常有用。
在大模型微调过程中,有监督微调(SFT)与 LoRA(Low-Rank Adaptation)相结合,能够充分发挥各自优势,提升模型在特定任务上的表现。具体而言,SFT 通过在人工标注的数据上对模型进行微调,使其适应特定任务;而 LoRA 则在冻结预训练模型权重的基础上,引入低秩矩阵进行微调,减少计算开销并提高效率。将两者结合,可以在保证性能的同时,降低资源消耗。
2.3. 大模型微调框架简介
在大模型微调领域,存在多种框架,每个框架都有其独特的优势和局限性。以下是几种常见的大模型微调框架的介绍与比较:
1. Hugging Face Transformers
Hugging Face Transformers 是目前最为流行的自然语言处理(NLP)框架之一,提供了丰富的预训练模型和易于使用的 API,广泛应用于各类 NLP 任务,如文本分类、问答系统等。它的特点是:
- 预训练模型丰富,支持多种模型,如 BERT、GPT、T5 等。
- 提供了高层次的 API,使得微调过程简单易懂。
- 拥有庞大的用户社区和文档支持。
尽管 Hugging Face Transformers 在许多常见任务中表现优秀,但在超大规模模型的微调和训练中,可能会面临性能瓶颈和资源消耗过大的问题。
2. DeepSpeed
DeepSpeed 是微软开发的高效深度学习训练框架,专注于优化大规模模型训练的性能。其主要特点包括:
- ZeRO 优化,显著减少内存占用,提高分布式训练的效率。
- 支持混合精度训练,加速训练过程并减少内存需求。
- 提供分布式训练功能,支持大规模模型的训练。
DeepSpeed 适合大规模模型的训练,但使用门槛较高,需要深入理解框架的底层实现。
3. Fairseq
Fairseq 是 Facebook AI Research 开发的一个高效训练工具,支持多种模型架构的训练,如 Transformer 和 BART。其特点为:
- 高性能和灵活性,支持多种任务,如机器翻译、文本生成等。
- 容易扩展,支持用户自定义新的算法和模型。
Fairseq 对于需要灵活定制和扩展的场景非常适合,但其文档和社区支持相对有限。
4. LLaMA-Factory(本文使用的框架)
LLaMA-Factory 是由国内北航开源的低代码大模型训练框架,旨在简化大模型微调过程,尤其是在支持低代码甚至零代码操作的基础上,提供极大的便利。其主要特点包括:
- 零代码操作:通过 Web UI(LlamaBoard),用户无需编写代码即可完成大规模模型的微调。
- 高效的训练方法:结合 LoRA(低秩适配)和 QLoRA 等先进技术,在保证模型性能的同时,显著降低了计算资源消耗。相较于其他框架,LLaMA-Factory 提供了更高的微调效率。
- 广泛的模型支持:支持 LLaMA、Mistral、Qwen 等多种流行的预训练模型,适应性强。
- 低成本和高性能:通过量化技术和高效算法,LLaMA-Factory 可降低模型训练成本,同时加速训练过程。
LLaMA-Factory 适合企业和研究人员需要快速、高效地微调大模型并在特定任务中应用时,尤其在低资源条件下表现突出。
每个大模型微调框架都有其适用场景和优势。Hugging Face Transformers 以其丰富的模型和简便的 API 受到广泛欢迎,适合大多数 NLP 任务。DeepSpeed 在处理超大规模模型时表现优异,适合对性能要求极高的训练任务。Fairseq 则适合需要灵活定制和高性能训练的应用场景。而 LLaMA-Factory 则在提高训练效率、降低成本和简化操作方面展现出巨大的优势,尤其在零代码操作和多种微调技术的结合下,使得大模型的微调过程更加轻松和高效。对于希望快速实现大模型微调的用户,LLaMA-Factory 无疑是一个值得优先考虑的选择。
3. DeepSeek-R1 大模型微调实战
3.1. LLaMA-Factory 基础环境安装
1. 安装 Anaconda(Python 环境管理工具)
- 下载 Anaconda:访问 Anaconda 官网下载适用于 Windows 系统的安装包,建议选择 Python 3.10 版本。
- 安装 Anaconda:双击下载的安装程序,按照提示进行安装。安装过程中,建议勾选'Add Anaconda to PATH'选项,这样方便在命令行中使用。如果忘记勾选,后续可自行配置一下环境变量(环境变量->系统变量->Path 中新增 Anaconda 路径)。
2. 安装 Git
- 下载 Git:访问 Git 官网下载适用于 Windows 的安装包。
- 安装 Git:双击安装程序,并按照默认选项进行安装。安装过程中大部分选项可以保持默认,完成安装后即可使用 Git。
3. 创建项目环境
打开 Anaconda Prompt(从 Windows 开始菜单找到),执行:
# 创建新的环境
conda create -n llama python=3.10
# 运行 conda init 初始化
conda init
# 这个命令会修改你的 shell 配置文件(例如 .bashrc、.zshrc 等),以便能够正确使用 conda 命令。
# conda init 执行后,需要重新启动命令提示符。关闭当前的命令提示符窗口,然后重新打开一个新的命令提示符窗口。
# 激活环境
conda activate llama
4. 安装 PyTorch(AI 框架)
在同一个命令窗口继续执行(llama 环境):
# 安装 PyTorch(支持 CUDA 的版本)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
5. 安装 LLaMA-Factory
找到一个目录存放 LLaMA-Factory 项目,打开 git 命令窗口执行:
# 克隆项目
git clone https://github.com/hiyouga/LLaMA-Factory.git
下载完成后使用 PyCharm 打开 LLaMA-Factory 工程。
安装项目依赖
安装的时候确保你的环境是 llama(也可以在外部命令窗口执行,核心是保证依赖下载到 llama 环境):
pip install -e ".[torch,metrics]"
验证安装
# 测试是否安装成功
llamafactory-cli version
启动 LLaMA-Factory 的可视化微调界面
llamafactory-cli webui
打开 http://localhost:7860/,你会看到以下界面。
3.2. 大模型下载
打开 HuggingFace 官网(https://huggingface.co),这里以 DeepSeek 为例(1.5b)来演示,这几天 QwQ 也很火,感兴趣的朋友也可以试试,不过要预先明确好你的电脑能承载多大的模型。
修改大模型存放位置:
$env:HF_HOME = "E:\soft\Hugging-Face"
修改大模型下载位置:
$env:HF_ENDPOINT="https://hf-mirror.com"
安装 huggingface_hub:
pip install -U huggingface_hub
下载 DeepSeek-R1 模型:
huggingface-cli download --resume-download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
3.3. 大模型训练
在 LLaMA-Factory 界面(http://localhost:7860/)加载模型。微调方法选择 LoRA,训练阶段选择 SFT(有监督微调)。
接下来就是准备训练数据集了,在 LLaMA-Factory 工程中,打开 data 文件夹下的 README.md 文件,查看框架支持的训练数据集。
按照 identity.json 的格式模拟了一个 xfc.json(数据量太少会导致训练效果不好,尽量自己多生成一些):
[
{
"instruction": "你是谁?",
"input": "",
"output": "喵呜~我是小肥肠,一只会说话的小肥猫,是喵喵咖啡厅的服务员!今天有什么我可以帮你的吗?😸"
},
{
"instruction": "你是猫咪吗?",
"input": "",
"output": "没错!我是猫咪,我叫小肥肠,是喵喵咖啡厅的服务员哦~喜欢猫咪吗?"
}
]
把 xfc.json 配置到 dataset_info.json:
"xfc": {
"file_name": "xfc.json"
}
回到 LLaMA-Factory 界面,点击【Train】,设置一下训练数据集。
开始调整训练参数(这部分较难,建议查阅资料自行调整):
- 学习率(Learning Rate):决定了模型在每次'学习'时,调整知识的幅度。较小的学习率意味着每次调整都很小,学习过程更稳定,但可能需要更多时间才能学会;较大的学习率则可能导致学习过程不稳定。
- 训练轮数(Training Epochs):相当于让学生复习的总次数。每一轮(epoch)中,模型都会'阅读'并学习所有的训练数据。
- 最大梯度范围(Max Gradient Norm):确保每次调整都在合理范围内,防止学习过程中的'过度反应'。
- 批次大小(Batch Size):一次给学生布置的作业量。较大的批次大小意味着每次学习时,模型会处理更多的数据,有助于提高学习效率,但也需要更多的计算资源。
- 梯度累积步数(Gradient Accumulation Steps):允许分多次累积学习效果,然后再一起调整模型的知识。
- 计算类型:决定用粗略的笔记还是精确的记录来记录学生的学习进度。
点击【开始】按钮开始训练,结束以后会提示【训练完毕】,途中的折线图是训练的效果。
(如果模型训练效果不好,可以采用增大训练轮数、学习率或者增加训练数据集的样本数来解决)
点击【Chat】检验我们的训练效果,在检查点路径选择我们刚刚训练的模型。点击【加载模型】,就可以开始聊天了。
3.4. 大模型部署
点击【Export】选择模型存储位置,将训练好的模型进行导出。
选择任意盘,创建 deepseekApi 文件夹用于存放部署脚本,进入 E:\deepseekApi,输入 cmd 打开命令提示符窗口:
新增 conda 虚拟环境(部署环境),激活环境后在该环境中下载所需依赖:
# 新建 deepseekApi 虚拟环境
conda create -n deepseekApi python=3.10
# 激活 deepseekApi
conda activate deepseekApi
# 下载所需依赖
conda install -c conda-forge fastapi uvicorn transformers pytorch
pip install safetensors sentencepiece protobuf
新增 main.py 脚本:
from fastapi import FastAPI, HTTPException
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import logging
from pydantic import BaseModel, Field
# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
app = FastAPI()
# 模型路径
model_path = r"E:\deepseek-merged"
# 加载 tokenizer 和模型
tokenizer = AutoTokenizer.from_pretrained(model_path)
device = "cuda" if torch.cuda.is_available() else "cpu"
model = AutoModelForCausalLM.from_pretrained(
model_path, torch_dtype=torch.float16 if device == "cuda" else torch.float32
).to(device)
@app.get("/answer")
async def generate_text(prompt: str):
try:
# 使用 tokenizer 编码输入的 prompt
inputs = tokenizer(prompt, return_tensors="pt").to(device)
# 使用模型生成文本,设置优化后的参数
outputs = model.generate(
inputs["input_ids"],
max_length=100,
min_length=30,
top_p=0.85,
temperature=0.6,
do_sample=True,
repetition_penalty=1.2,
no_repeat_ngram_size=3,
num_beams=4,
early_stopping=True
)
# 解码生成的输出
generated_text = tokenizer.decode(outputs[], skip_special_tokens=)
{: generated_text}
Exception e:
logger.error()
HTTPException(status_code=, detail=(e))
():
{: , : model_path}
main.py 文件实现了一个轻量级 DeepSeek 模型推理服务,基于 FastAPI 框架构建。该服务将本地部署的大语言模型包装为 HTTP API,便于系统集成。
运行命令 uvicorn main:app --reload --host 0.0.0.0:
访问接口 http://localhost:8000/answer?prompt=...。
大模型微调加部署已经完整实现,接下来就是把它接入我们自己的定制化会话模型中。
3.5. 微调大模型融合基于 SpringBoot+Vue2 开发的 AI 会话系统
上面章节中我们完成了大模型的微调和部署,这一章中我会把微调大模型融入到SpringBoot+Vue2搭建的 AI 会话系统中。
原来的 AI 会话模型接入的是云端的 DeepSeek 模型,现在接入的是本地微调过的 DeepSeek 1.5b 模型。代码逻辑比较简单,就是 WebSocket 加远程调用 Python 接口(http://localhost:8000/answer),实现效果如下。
后端日志显示正常,系统界面展示微调后的模型回复。
4. 结语
大模型微调作为一种强大的技术,能够为许多行业提供量身定制的 AI 解决方案,帮助企业更好地适应和优化特定任务。尽管微调大模型的过程充满挑战,但通过不断学习和实践,我们能够逐步掌握并精通这一领域。本文通过详细的步骤讲解了大模型微调的基础操作,使用 LLaMA-Factory 框架进行模型训练和部署,并通过 FastAPI 实现了本地化部署服务。这些知识为想要开展 AI 微调项目的朋友提供了宝贵的实践经验。


