LLM 微调实战指南 2026:从数据准备到部署,完整的模型定制化流程

什么时候值得微调,什么时候用 Prompt 工程就够了

返回教程列表
高级18 分钟

LLM 微调实战指南 2026:从数据准备到部署,完整的模型定制化流程

什么时候值得微调,什么时候用 Prompt 工程就够了

LLM 微调(Fine-tuning)在 2026 年已经变得更加可及,但"微调"不是万能药。本文讲解微调 vs Prompt 工程的选择原则,以及用 Unsloth + LoRA 进行高效微调的完整流程,包括数据准备、训练配置、评估和部署。

LLM微调Fine-tuningLoRAUnsloth模型训练Qwen微调

很多人在问"我能不能微调一个模型让它更了解我的业务"——答案通常是"可以,但你可能不需要"。

先搞清楚什么时候应该微调,什么时候 Prompt 工程就足够了。

一、微调 vs Prompt 工程:如何选择

需要微调的情况

  • 特定领域输出格式:你需要模型始终按照非常特定的格式输出(如医疗记录格式、特定代码风格)
  • 大量重复的上下文:系统 Prompt 超过 2000 tokens,且每次都要带上
  • 专业术语和知识:模型需要学习你的行业术语和私有知识体系
  • 延迟和成本:需要更快的响应速度或更低的调用成本
  • 不需要微调的情况

  • 只是想改变行为:大多数行为可以通过 Prompt 工程实现
  • 知识更新频繁:微调模型无法实时更新,RAG 更合适
  • 预算有限:微调有一定的计算和时间成本
  • 刚开始验证:先用 RAG/Prompt 工程验证可行性
  • 二、高效微调:Unsloth + LoRA

    2026 年最流行的微调方案:Unsloth(训练加速) + LoRA(参数高效微调)

    2.1 环境准备

    bash
    

    推荐环境:NVIDIA GPU 16GB+,或 Google Colab A100

    pip install unsloth transformers datasets trl accelerate

    或者用 Unsloth 的一键安装

    pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"

    2.2 数据准备(最关键的步骤)

    微调质量 = 数据质量,不是数据量。

    python
    

    数据格式:ShareGPT 格式(推荐)

    training_data = [ { "conversations": [ {"from": "human", "value": "用户问题"}, {"from": "assistant", "value": "期望的模型回答"} ] }, # ... 更多样本 ]

    最少需要多少数据?

    - 格式/风格微调:100-500 条

    - 领域知识注入:500-2000 条

    - 完全的行为改变:2000+ 条

    数据质量检查清单

    ✅ 每个样本都是高质量的吗?(宁愿少而精)

    ✅ 数据分布均匀吗?(不要过度代表某一类问题)

    ✅ 有没有矛盾的样本?(同一类问题不同答案)

    ✅ 有没有数据泄露?(不要把测试集当训练集)

    2.3 Unsloth 微调代码

    python
    from unsloth import FastLanguageModel
    from trl import SFTTrainer
    from transformers import TrainingArguments
    from datasets import Dataset

    加载基础模型(选择适合你的大小)

    model, tokenizer = FastLanguageModel.from_pretrained( model_name="unsloth/Qwen2.5-7B-Instruct", # 7B 适合入门 max_seq_length=2048, load_in_4bit=True, # 4bit 量化,节省内存 )

    添加 LoRA 适配器

    model = FastLanguageModel.get_peft_model( model, r=16, # LoRA rank,越大效果越好,内存越多 target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], lora_alpha=16, lora_dropout=0, bias="none", )

    准备数据集

    dataset = Dataset.from_list(training_data)

    开始训练

    trainer = SFTTrainer( model=model, tokenizer=tokenizer, train_dataset=dataset, dataset_text_field="text", max_seq_length=2048, args=TrainingArguments( per_device_train_batch_size=2, gradient_accumulation_steps=4, warmup_steps=5, num_train_epochs=3, # 轮数,过多会过拟合 learning_rate=2e-4, fp16=True, output_dir="./output", save_strategy="epoch", ), )

    trainer.train()

    三、评估微调效果

    3.1 定量评估

    python
    from evaluate import load

    对于生成质量评估

    rouge = load("rouge") results = rouge.compute( predictions=model_outputs, references=reference_outputs ) print(results) # ROUGE-1, ROUGE-2, ROUGE-L 分数

    对于特定任务

    分类准确率、F1 分数等

    3.2 定性评估(更重要)

    建立一个人工评估集(50-100 个典型问题),对比:

  • 原始模型的回答
  • 微调后模型的回答
  • 理想答案
  • 每个维度打分(准确性/格式符合度/相关性),看微调是否有提升。

    四、部署微调模型

    4.1 保存和加载

    python
    

    保存 LoRA 权重(很小,通常 < 100MB)

    model.save_pretrained("my-finetuned-model") tokenizer.save_pretrained("my-finetuned-model")

    合并权重(可选,用于部署)

    model.save_pretrained_merged( "merged-model", tokenizer, save_method="merged_16bit" )

    4.2 部署选项

    本地推理(Ollama):

    bash
    

    转换为 GGUF 格式

    python llama.cpp/convert.py merged-model --outtype f16

    导入 Ollama

    ollama create my-model -f Modelfile

    云端 API(Together AI / Fireworks AI): 这两个平台支持上传自定义模型并提供 OpenAI 兼容 API,适合生产部署。


    延伸阅读

  • 本地 LLM 部署完整指南
  • Advanced RAG 高级技巧
  • LangChain vs LangGraph 实战指南
  • 相关工具

    UnslothLangChainOllamaQwen2.5Python