
【DeepSeek+LoRA+FastAPI】开发人员如何微调Deepseek-R1大模型并暴露接口给后端调用
想象一下,你让一个博士但没上过临床的文科生给病人开药,结果他开出了十年前就禁用的药品——这就是通用AI在专业领域闹的"一本正经胡说八道"现象。虽然像GPT、DeepSeek这些"全能型选手"能写诗编程聊八卦,但当它们遇到医疗诊断、法律文书这些需要精准专业知识的场景时,常常会犯低级错误。其实要让AI真正成为行业专家,就像培养医学生一样:先找个聪明的"学霸"(基础大模型),再给他喂专业的"教科书"(行
前言
想象一下,你让一个博士但没上过临床的文科生给病人开药,结果他开出了十年前就禁用的药品——这就是通用AI在专业领域闹的"一本正经胡说八道"现象。虽然像GPT、DeepSeek这些"全能型选手"能写诗编程聊八卦,但当它们遇到医疗诊断、法律文书这些需要精准专业知识的场景时,常常会犯低级错误。
其实要让AI真正成为行业专家,就像培养医学生一样:先找个聪明的"学霸"(基础大模型),再给他喂专业的"教科书"(行业数据库),最后在"三甲医院"实战训练(微调优化)。我们将手把手教你用DeepSeek R1这个"学霸模型",通过注入行业秘笈数据,训练出不说外行话、不犯原则性错误的专属AI助手,还能安全地部署在自家服务器上。继续往下看,解锁定制AI专家的通关秘籍!
1.AI大模型微调与部署入门指南
1. 需求与技术概览
企业对AI的需求因行业而异,通用大模型难以满足个性化场景。以下技术可解决不同问题:
- SFT(有监督微调):通过标注数据优化模型,适合提升任务精准度。
- RLHF(强化学习):基于反馈调整模型,适用于对话优化。
- RAG(检索增强生成):结合外部知识,解决信息不足问题。
如何选择?根据任务需求:精度选SFT,交互选RLHF,知识扩展选RAG。
微调技术详解:
- 分类:全参数微调(资源密集)、部分参数微调(高效)。
- LoRA算法:低秩适配,只更新少量参数,兼顾性能与效率。
- 常见框架:如Transformers、LLama-Factory,支持快速实现。
2. 整体流程
在Linux系统上完成:微调模型 → 部署模型 → 提供API → Web后端调用 → 本地前端展示。
3. 模型微调实战
- 框架:LLama-Factory(国产热门工具,简单易用)。
- 算法:LoRA(高效微调首选)。
- 基座模型:DeepSeek-R1-Distill-Qwen-1.5B(通过蒸馏技术,从大模型提取知识到小模型,降低计算需求,保持性能)。
4. 模型部署与接口
- 框架:FastAPI(Python轻量Web框架)。
- 将模型部署后,通过API暴露功能,供外部调用。
5. Web端集成
- 调用方式:后端通过HTTP请求与API交互。
2. SFT、RLHF 与 RAG:微调与增强技术的核心解析
2.1 SFT(Supervised Fine-Tuning)有监督微调
概念:
有监督微调通过人工标注的高质量数据对,进一步训练预训练模型,使其适应特定任务或领域。除了有监督微调外,还有无监督和半监督微调,但“微调”通常默认指有监督方式。
特点:
- 依赖标注数据(如“输入-输出”对),精准优化模型。
- 适用于任务明确、需高准确度的场景。
- 数据质量直接影响效果。
示例:
python
training_data = [ {"input": "今天天气如何?", "output": "晴天,25°C"}, # 人工标注的问答对 ]
通过训练,模型学会根据“问题”输出“标准答案”。适用于情感分析、问答系统、机器翻译等任务。
其他变体:
- 无监督微调:利用未标注文本(如新闻文章),增强模型通用语言能力,适合预训练或生成任务。
示例:training_data = ["大量未标注文本..."] - 半监督微调:结合少量标注数据和大量未标注数据(如伪标签生成),适合标注资源稀缺的场景,如医疗领域。
示例:training_data = [{"input": "症状", "output": "诊断"}, "未标注病例文本..."]
2.2 RLHF(Reinforcement Learning from Human Feedback)强化学习
概念:
RLHF通过人类反馈优化模型行为,无需大量标注数据,而是基于奖励信号或偏好选择调整输出。
特点:
- 强调用户体验和动态优化。
- 适合对话系统、生成任务等需主观判断的场景。
- 调整方式灵活但实现复杂。
主要方法:
- DPO(Direct Preference Optimization)
- 核心:基于人类对比选择(如“A比B好”),直接优化模型输出。
- 特点:调整幅度大,快速收敛,适合明确偏好场景。
- 示例:用户选择“幽默回答”优于“正式回答”,模型据此优化生成风格。
- PPO(Proximal Policy Optimization)
- 核心:通过奖励信号(如点赞/点踩)逐步调整模型策略。
- 特点:调整温和,稳定性高,适合持续优化。
- 示例:用户点赞某回答,模型强化类似输出模式。
2.3 RAG(Retrieval-Augmented Generation)检索增强生成
概念:
RAG将外部知识检索与文本生成结合,模型在生成答案时实时获取最新或补充信息,弥补预训练知识的不足。
特点:
- 不依赖模型内部知识更新,灵活性强。
- 适合需实时数据或领域知识的场景(如新闻问答)。
- 检索质量影响生成效果。
示例:
用户问:“2025年最新科技趋势?”
RAG检索最新文章后生成:
“根据最新数据,AI微调技术在2025年广泛应用…”
适用于动态知识场景,如法律咨询、实时资讯。
2.4 按参数更新范围分类
- 全量微调(Full Fine-Tuning)
- 概念:更新模型所有参数,深度适配新任务。
- 特点:效果最佳,但计算资源需求大,训练时间长。
- 示例:用医疗问答数据全量微调模型,生成精准诊断建议。
- 适用:数据充足、任务复杂的场景,如文本生成系统。
- 部分微调(LoRA,Low-Rank Adaptation)
- 概念:通过低秩矩阵仅更新部分参数(如权重增量),高效微调。
- 特点:资源消耗低,速度快,适合小规模部署。
- 示例:用金融术语数据微调对话模型,生成专业术语回答。
- 适用:计算资源有限或快速迭代的场景。
总结与选择建议
- SFT:任务明确、有标注数据时首选。
- RLHF:需用户反馈优化对话或生成质量时使用。
- RAG:需外部知识或实时信息时最佳。
- 全量微调 vs LoRA:资源充足选前者,效率优先选后者。
通过结合需求与技术特点,可打造高效、精准的定制AI系统。
3. LoRA 微调算法
- 起源:
- LoRA论文(2021,Microsoft Research):首创低秩矩阵分解实现部分参数微调,助力AI广泛应用 (arxiv.org/abs/2106.09685)。
- Transformer论文(2017,Google Brain):提出Transformer架构,开创大语言模型时代 (arxiv.org/abs/1706.03762)。
- 矩阵“秩”:矩阵线性无关行/列的最大数量,反映有效信息量。
- LoRA原理:通过低秩矩阵更新部分参数(如权重增量),高效微调,避免全参数调整。
- 后续步骤:训练后需合并权重,生成最终模型。
4. 微调常见框架
4.1 Llama-Factory
LLaMA-Factory 是由北航开源的低代码大模型训练框架,专为简化大模型微调流程而设计,支持低代码甚至零代码操作,极大提升了用户体验。其核心特点包括:
- 零代码操作:通过 Web UI(LlamaBoard),用户无需编写代码即可完成大规模模型的微调。
- 高效训练方法:集成 LoRA(低秩适配)和 QLoRA 等先进技术,在保障模型性能的同时,大幅降低计算资源消耗,提高微调效率。
- 广泛模型支持:兼容 LLaMA、Mistral、Qwen 等多种主流预训练模型,适应性强,适合不同应用场景。
- 低成本高性能:结合量化技术与高效算法,有效降低训练成本并加速训练过程,实现高性价比的大模型微调方案。
4.2 Hugging Face Transformers
Hugging Face Transformers(https://huggingface.co/transformers/) 是目前最为流行的自然语言处理(NLP)框架之一,提供了丰富的预训练模型和易于使用的 API,广泛应用于各类 NLP 任务,如文本分类、问答系统等。它的特点是:
- 预训练模型丰富,支持多种模型,如 GPT、Deepseek 等。
- 提供了高层次的 API,使得微调过程简单易懂。
- 拥有庞大的用户社区和文档支持。
4.3DeepSpeed
DeepSpeed 是微软开源的大模型训练优化库,专注于提升超大规模模型的训练效率。它采用 ZeRO 优化减少显存占用,支持 3D 并行训练(数据并行、张量并行、管道并行),并结合 混合精度 和 Offload 技术,实现低成本、高效能的深度学习训练与推理。
5.模型微调
5.1.准备硬件与环境
- 在云平台(如AutoDL,AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL)租用实例。
- 云端通常预装深度学习环境(如Anaconda、CUDA)。
5.2. 本机SSH连接服务器
- 使用VS Code的Remote-SSH插件连接云服务器(参考:连接教程)。
- 连接后,进入数据盘目录:/root/autodl-tmp。
5.3. 安装LLaMA-Factory
GitHub地址:GitHub - hiyouga/LLaMA-Factory: Unified Efficient Fine-Tuning of 100+ LLMs & VLMs (ACL 2024)
- 克隆仓库:
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
- 切换到项目目录
cd LLaMA-Factory
- 调整Conda路径(可选,将虚拟环境移至数据盘):
mkdir -p /root/autodl-tmp/conda/pkgs
conda config --add pkgs_dirs /root/autodl-tmp/conda/pkgs
mkdir -p /root/autodl-tmp/conda/envs
conda config --add envs_dirs /root/autodl-tmp/conda/envs
- 创建并激活虚拟环境(需Python 3.10,与LLaMA-Factory兼容):
conda create -n llama-factory python=3.10
conda activate llama-factory
- 安装依赖:
pip install -e ".[torch,metrics]"
注:若提示pip: command not found,先运行conda install pip。
- 验证安装:
llamafactory-cli version
5.4. 启动可视化微调界面
llamafactory-cli webui
5.5. 配置端口转发
- 参考:SSH隧道设置
-
在本地电脑的终端(cmd / powershell / terminal等)中执行代理命令,其中
root@123.125.240.150
和42151
分别是实例中SSH指令的访问地址与端口,请找到自己实例的ssh指令做相应替换。7860:127.0.0.1:7860
是指代理实例内7860
端口到本地的7860
端口
ssh -CNg -L 7860:127.0.0.1:7860 root@123.125.240.150 -p 42151
说明:将服务器7860端口映射到本地7860,访问WebUI。
6. 从 HuggingFace 上下载基座模型
HuggingFace 是一个集中管理和共享预训练模型的平台 https://huggingface.co; 从 HuggingFace 上下载模型有多种不同的方式,可以参考:如何快速下载huggingface模型——全方法总结
-
创建文件夹统一存放所有基座模型
mkdir Hugging-Face
-
修改 HuggingFace 的镜像源
export HF_ENDPOINT=https://hf-mirror.com
-
修改模型下载的默认位置
export HF_HOME=/root/autodl-tmp/Hugging-Face
-
注意:这种配置方式只在当前 shell 会话中有效,如果你希望这个环境变量在每次启动终端时都生效,可以将其添加到你的用户配置文件中(修改
~/.bashrc
或~/.zshrc
) -
检查环境变量是否生效
echo $HF_ENDPOINT
echo $HF_HOME
-
安装 HuggingFace 官方下载工具
pip install -U huggingface_hub
-
执行下载命令
huggingface-cli download --resume-download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
-
如果直接本机下载了模型压缩包,如何放到你的服务器上?——在 AutoDL 上打开 JupyterLab 直接上传,或者下载软件通过 SFTP 协议传送
6.1. 可视化页面上加载模型测试,检验是否加载成功
-
注意:这里的路径是模型文件夹内部的模型特定快照的唯一哈希值,而不是整个模型文件
/root/autodl-tmp/Hugging-Face/hub/models--deepseek-ai--DeepSeek-R1-Distill-Qwen-1.5B/snapshots/530ca3e1ad39d440e182c2e4317aa40f012512fa
6.2. 准备用于训练的数据集,添加到指定位置
接下来就是准备训练数据集了,在LLaMA-Factory工程中,打开data文件夹下的READ_ME.md文件,查看框架支持的训练数据集:
我按照identity.json的格式模拟了一个json数据(数据量太少会导致训练效果不好,尽量自己多生成一些):
-
修改 dataset_info.json 文件,添加如下配置:
"magic_conch": {
"file_name": "magic_conch.json"
},
-
将数据集 magic_conch.json 放到 LLama-Factory 的 data 目录 下
回到llaMA-Factory界面(http://localhost:7860/)界面,点击【Train】,设置一下训练数据集:
界面说明:
选择微调算法 Lora
添加数据集 magic_conch
修改其他训练相关参数,如学习率、训练轮数、截断长度、验证集比例等
学习率(Learning Rate):决定了模型每次更新时权重改变的幅度。过大可能会错过最优解;过小会学得很慢或陷入局部最优解
训练轮数(Epochs):太少模型会欠拟合(没学好),太大会过拟合(学过头了)
最大梯度范数(Max Gradient Norm):当梯度的值超过这个范围时会被截断,防止梯度爆炸现象
最大样本数(Max Samples):每轮训练中最多使用的样本数
计算类型(Computation Type):在训练时使用的数据类型,常见的有 float32 和 float16。在性能和精度之间找平衡
截断长度(Truncation Length):处理长文本时如果太长超过这个阈值的部分会被截断掉,避免内存溢出
批处理大小(Batch Size):由于内存限制,每轮训练我们要将训练集数据分批次送进去,这个批次大小就是 Batch Size
梯度累积(Gradient Accumulation):默认情况下模型会在每个 batch 处理完后进行一次更新一个参数,但你可以通过设置这个梯度累计,让他直到处理完多个小批次的数据后才进行一次更新
验证集比例(Validation Set Proportion):数据集分为训练集和验证集两个部分,训练集用来学习训练,验证集用来验证学习效果如何
学习率调节器(Learning Rate Scheduler):在训练的过程中帮你自动调整优化学习率
页面上点击启动训练,或复制命令到终端启动训练
实践中推荐用
nohup
命令将训练任务放到后台执行,这样即使关闭终端任务也会继续运行。同时将日志重定向到文件中保存下来在训练过程中注意观察损失曲线,尽可能将损失降到最低
如损失降低太慢,尝试增大学习率
如训练结束损失还呈下降趋势,增大训练轮数确保拟合
6.3. 微调结束,评估微调效果
-
观察损失曲线的变化;观察最终损失
-
在交互页面上通过预测/对话等方式测试微调好的效果
-
检查点:保存的是模型在训练过程中的一个中间状态,包含了模型权重、训练过程中使用的配置(如学习率、批次大小)等信息,对LoRA来说,检查点包含了训练得到的 B 和 A 这两个低秩矩阵的权重
-
若微调效果不理想,你可以:
-
使用更强的预训练模型
-
增加数据量
-
优化数据质量(数据清洗、数据增强等,可学习相关论文如何实现)
-
调整训练参数,如学习率、训练轮数、优化器、批次大小等等
-
6.4. 导出合并后的模型
-
为什么要合并:因为 LoRA 只是通过低秩矩阵调整原始模型的部分权重,而不直接修改原模型的权重。合并步骤将 LoRA 权重与原始模型权重融合生成一个完整的模型
-
先创建目录,用于存放导出后的模型
mkdir -p Models/deepseek-r1-1.5b-merged
7、模型部署和暴露接口
7.1. 创建新的 conda 虚拟环境用于部署模型
-
创建环境
conda create -n fastApi python=3.10
-
激活环境
conda activate fastApi
-
在该环境中下载部署模型需要的依赖
conda install -c conda-forge fastapi uvicorn transformers pytorch
pip install safetensors sentencepiece protobuf
7.2. 通过 FastAPI 部署模型并暴露 HTTP 接口
-
创建 App 文件夹
mkdir App
-
创建 main.py 文件,作为启动应用的入口
touch main.py
-
修改 main.py 文件并保存
from fastapi import FastAPI
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
app = FastAPI()
# 模型路径
model_path = "/root/autodl-tmp/Models/deepseek-r1-1.5b-merged"
# 加载 tokenizer (分词器)
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 加载模型并移动到可用设备(GPU/CPU)
device = "cuda" if torch.cuda.is_available() else "cpu"
model = AutoModelForCausalLM.from_pretrained(model_path).to(device)
@app.get("/generate")
async def generate_text(prompt: str):
# 使用 tokenizer 编码输入的 prompt
inputs = tokenizer(prompt, return_tensors="pt").to(device)
# 使用模型生成文本
outputs = model.generate(inputs["input_ids"], max_length=150)
# 解码生成的输出
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
return {"generated_text": generated_text}
-
进入包含
main.py
文件的目录,然后运行以下命令来启动 FastAPI 应用
uvicorn main:app --reload --host 0.0.0.0
- `main` 是 Python 文件名(要注意不包含 `.py` 扩展名)
- `app` 是 FastAPI 实例的变量名(代码中 `app = FastAPI()`)
- `--reload` 使代码更改后可以自动重载,适用于开发环境
- `host 0.0.0.0`:将 FastAPI 应用绑定到所有可用的网络接口,这样我们的本机就可以通过内网穿透访问该服务
-
配置端口转发,使得本机可以访问该服务 SSH隧道
-
浏览器输入以下 url,测试服务是否启动成功
8、web后端调用
web后端调用见下期,小便准备下期内容采用springboot3+vue3来搭建系统调用大模型
本节内容调用大模型是java后端调用python开放的webapi接口来调用大模型。
拓展 :
java调用大模型的三种方式:
1. DeepSeek API 调用
# remote deepseek-server invoke
deepseek.api-key=sk-d8c3724e7a4b4d18932852dae9d90c69
deepseek.base-url=https://api.deepseek.com/v1
#deepseek.model=deepseek-reasoner
deepseek.model=deepseek-chat
# Local deepseek-server invoke
#deepseek.api-key=sk-d8c3724e7a4b4d18932852dae9d90c69
#deepseek.base-url=http://127.0.0.1:11434/v1
#deepseek.model=deepseek-r1:14b
- 方式:通过DeepSeek提供的API调用远程或本地部署的DeepSeek模型。
- 特点:
- 远程调用:通过设置 base-url 为 https://api.deepseek.com/v1 和对应的 api-key,直接调用DeepSeek的云端服务。
- 本地调用(注释部分):通过 base-url 设置为本地地址(127.0.0.1:11434),调用本地部署的模型(如 deepseek-r1:14b)。
- 模型选择:支持不同模型(如 deepseek-chat 用于对话,deepseek-reasoner 用于推理)。
- 超时设置:connect-timeout=300, read-timeout=600, call-timeout=600,确保调用稳定性。
- 适用场景:
- 远程调用适合快速测试或无本地算力时使用。
- 本地调用适合私有化部署,保护数据隐私。
- 优点:
- 配置简单,API调用方式通用。
- 支持多种模型,灵活性高。
- 缺点:
- 远程调用依赖网络,可能有延迟。
- 本地调用需要自行部署模型,算力需求较高。
2.阿里云灵积(Dashscope API)调用
# alibaba qwen-turbo-0624 help langchain4j
# https://bailian.console.aliyun.com/#/model-market/detail/qwen-turbo-06
langchain4j.open-ai.chat-model.api-key=sk-4fb1edd277f744a278e1260ad2302fd
langchain4j.open-ai.chat-model.model-name=qwen-turbo-0624
langchain4j.open-ai.chat-model.base-url=https://dashscope.aliyuncs.com/compatible
- 方式:通过阿里云Dashscope API调用阿里云的Qwen模型(qwen-turbo-0624)。
- 特点:
- 使用阿里云提供的API接口,base-url 为 https://dashscope.aliyuncs.com/compatible。
- 需要 api-key 认证,调用 qwen-turbo-0624 模型。
- 集成到 LangChain 框架中(langchain4j),通过 LangChain 的 open-ai.chat-model 接口调用。
- 适用场景:
- 适合需要快速接入阿里云生态的企业用户。
- 适用于中文任务,Qwen模型在中文理解和生成上表现优异。
- 优点:
- 阿里云基础设施稳定,支持大规模并发。
- 集成LangChain后可与其他工具链无缝衔接。
- 缺点:
- 依赖阿里云服务,可能有区域限制。
- API调用成本可能较高。
3. LangChain 框架调用
上述代码中,Dashscope API 实际上是通过 LangChain 框架调用的,LangChain 是一种更高层次的抽象框架。
- 方式:LangChain 是一个用于构建大模型应用的框架,支持多种模型的集成和调用。
- 特点:
- 统一接口:通过 langchain4j.open-ai.chat-model 配置,支持调用不同模型(如DeepSeek、Qwen)。
- 灵活性:可以轻松切换模型,只需修改 api-key、base-url 和 model-name。
- 生态丰富:LangChain 支持链式调用、记忆上下文、工具集成等高级功能。
- 适用场景:
- 适合需要复杂逻辑的场景,如对话系统、知识检索、任务自动化。
- 适用于开发者希望快速构建应用,而非直接操作底层API。
- 优点:
- 提供高级功能(如上下文管理、工具调用),简化开发。
- 支持多模型切换,开发灵活。
- 缺点:
- 学习成本较高,LangChain 框架本身较复杂。
- 性能可能因框架封装而略有损耗。
总结与对比
调用方式 | 特点 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
DeepSeek API | 直接调用远程/本地DeepSeek模型 | 配置简单,支持多种模型,灵活性高 | 远程依赖网络,本地需部署算力 | 快速测试、本地私有化部署 |
Dashscope API | 通过阿里云调用Qwen模型,集成LangChain | 阿里云基础设施稳定,中文任务表现优异 | 区域限制,成本可能较高 | 中文任务,阿里云生态用户 |
LangChain | 高层次框架,支持多模型统一调用 | 统一接口,功能丰富,开发效率高 | 学习成本高,性能略有损耗 | 复杂应用开发,对话系统构建 |
建议
- 初学者/快速测试:使用DeepSeek API(远程调用),配置简单。
- 中文任务/企业用户:选择Dashscope API,结合阿里云生态。
- 复杂应用开发:通过LangChain框架,充分利用其高级功能和灵活性。
更多推荐
所有评论(0)