前言

想象一下,你让一个博士但没上过临床的文科生给病人开药,结果他开出了十年前就禁用的药品——这就是通用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通过人类反馈优化模型行为,无需大量标注数据,而是基于奖励信号或偏好选择调整输出。

特点

  • 强调用户体验和动态优化。
  • 适合对话系统、生成任务等需主观判断的场景。
  • 调整方式灵活但实现复杂。

主要方法

  1. DPO(Direct Preference Optimization)
    • 核心:基于人类对比选择(如“A比B好”),直接优化模型输出。
    • 特点:调整幅度大,快速收敛,适合明确偏好场景。
    • 示例:用户选择“幽默回答”优于“正式回答”,模型据此优化生成风格。

  1. PPO(Proximal Policy Optimization)
    • 核心:通过奖励信号(如点赞/点踩)逐步调整模型策略。
    • 特点:调整温和,稳定性高,适合持续优化。
    • 示例:用户点赞某回答,模型强化类似输出模式。


2.3 RAG(Retrieval-Augmented Generation)检索增强生成

概念
RAG将外部知识检索与文本生成结合,模型在生成答案时实时获取最新或补充信息,弥补预训练知识的不足。

特点

  • 不依赖模型内部知识更新,灵活性强。
  • 适合需实时数据或领域知识的场景(如新闻问答)。
  • 检索质量影响生成效果。

示例
用户问:“2025年最新科技趋势?”
RAG检索最新文章后生成:
“根据最新数据,AI微调技术在2025年广泛应用…”
适用于动态知识场景,如法律咨询、实时资讯。


2.4 按参数更新范围分类
  1. 全量微调(Full Fine-Tuning)
    • 概念:更新模型所有参数,深度适配新任务。
    • 特点:效果最佳,但计算资源需求大,训练时间长。
    • 示例:用医疗问答数据全量微调模型,生成精准诊断建议。
    • 适用:数据充足、任务复杂的场景,如文本生成系统。
  2. 部分微调(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.准备硬件与环境
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.15042151分别是实例中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,测试服务是否启动成功

http://localhost:8000/docs 

 

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框架,充分利用其高级功能和灵活性。

 

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐