配套视频:https://www.bilibili.com/video/BV1VS1qBCEQr/

一、什么是微调(Fine-tuning)

1.1 核心概念

微调就是拿一个预训练的语言模型,教会它更擅长处理你的特定任务。这就像聘请一位经验丰富的厨师,然后培训他们掌握你餐厅的专属菜谱——你不必从头教人做菜。

关键区别:

  • 从头训练:需要数百万样本和数月时间

  • 微调:只需数千甚至数百个样本,训练几分钟或几小时

  • 参数调优:仅调整temperature、top_k等参数(就像调节汽车收音机)

  • 微调:真正教会模型新技能(就像教汽车驾驶新路线)

1.2 工作原理

无需从零训练模型,而是基于类似GPT或Claude这类已懂人类语言的模型,再输入你的特定用例数据。模型会据此调整现有知识,以精通你的特定领域。

二、何时需要微调

场景1:需要一致的格式或风格

当你需要模型输出特定格式(如JSON结构),而仅靠提示词无法稳定实现时。

场景2:拥有领域特定数据

你有大量模型从未见过的专业数据,例如:

  • 医疗病历记录

  • 法律文件

  • 客服对话记录

  • 行业专属信息

场景3:降低成本

使用更小的专用模型替代庞大的通用模型,降低运行成本。

微调的优势

  • ✅ 无需从零开始训练

  • ✅ 所需数据量少得多

  • ✅ 计算资源需求低

  • ✅ 训练时间短

⚠️ 重要提醒

微调会使模型在通用任务上表现变差,但在你的特定任务上大幅提升。这是一个权衡取舍。

三、数据准备:成败的关键

3.1 数据质量至关重要

如果数据不好,结果就会很差。 这是整个流程中最关键的一步,务必认真对待。

3.2 数据格式

本教程使用的示例数据集:

  • 任务类型:HTML信息提取

  • 样本数量:500个

  • 数据格式:JSON文件,包含输入-输出对

{
  "input": "<div><h2>产品名称</h2><span class='price'>$99</span>...</div>",
  "output": {
    "name": "产品名称",
    "price": "$99",
    "category": "电子产品",
    "manufacturer": "品牌名"
  }
}

3.3 数据要求

  • 提供示例提示(输入)

  • 提供期望的答案(输出)

  • 可以是任何类型的数据:客服对话、医疗报告、文档等

  • 输入和输出应该是字符串格式

四、工具准备

4.1 Unsloth

  • 开源免费的微调框架

  • 训练速度极快

  • 支持大多数开源模型(Llama 3.1、Mistral、Mixtral等)

4.2 Google Colab

  • 免费的在线代码环境

  • 提供免费GPU(T4)

  • 无需本地高端显卡

为什么选择Colab?
除非你有强大的GPU(如RTX 4080/4090),否则本地训练会非常慢。Colab提供免费的高端GPU,让训练过程快速完成。

4.3 Ollama

用于在本地运行微调后的模型。

五、微调实操流程

Step 1: 打开Google Colab笔记本

  1. 访问提供的Colab笔记本链接

  2. 点击"连接"按钮,连接到T4 GPU运行时

  3. 验证GPU连接:点击右上角查看可用资源

检查运行时类型:

  • 运行时 → 更改运行时类型

  • 确保选择:T4 GPU + Python 3

Step 2: 上传训练数据

  1. 点击左侧"文件"按钮

  2. 点击"上传"图标

  3. 选择你的JSON数据集文件

  4. 运行加载数据的代码单元

import json

# 加载数据集
with open('json_extraction_dataset_500.json', 'r') as f:
    data = json.load(f)

# 查看第一个样本
print(data[0])

Step 3: 安装依赖

运行安装命令(需要1-2分钟):

!pip uninstall unsloth -y
!pip install unsloth

重要:安装完成后,需要重启运行时才能使用新安装的版本。点击"重启会话"按钮。

Step 4: GPU检测

重启后,运行GPU检测代码:

import torch

print(f"CUDA可用: {torch.cuda.is_available()}")
print(f"GPU设备: {torch.cuda.get_device_name(0)}")

应该看到:

  • CUDA可用: True

  • GPU设备: Tesla T4

Step 5: 选择并加载模型

from unsloth import FastLanguageModel

model_name = "unsloth/Phi-3-mini-4k-instruct"
max_seq_length = 2048
dtype = None  # 自动检测
load_in_4bit = True  # 使用4位量化

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name=model_name,
    max_seq_length=max_seq_length,
    dtype=dtype,
    load_in_4bit=load_in_4bit,
)

模型选择说明:

  • 本教程使用Phi-3 Mini(小型模型,训练快)

  • 可以选择其他模型:Llama 3.1、Mistral等

  • 模型越大,效果越好,但训练时间越长

Step 6: 数据预处理

创建格式化函数,将输入-输出对转换为单一字符串:

def format_prompt(example):
    input_text = example['input']
    output_text = json.dumps(example['output'])  # 将JSON对象转为字符串
    
    prompt = f"""输入: {input_text}
输出: {output_text}<|end_of_text|>"""
    
    return prompt

# 格式化所有数据
formatted_data = [format_prompt(item) for item in data]

# 创建数据集
from datasets import Dataset
dataset = Dataset.from_dict({"text": formatted_data})

Step 7: 添加LoRA适配器

LoRA(Low-Rank Adaptation)是一种高效的微调方法,它在模型中添加少量可训练层:

model = FastLanguageModel.get_peft_model(
    model,
    r=16,  # LoRA秩
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
    lora_alpha=16,
    lora_dropout=0,
    bias="none",
    use_gradient_checkpointing=True,
)

参数说明:

  • 可以右键点击代码 → "用Gemini解释代码"获取详细说明

  • 大多数情况下使用默认参数即可

Step 8: 配置训练器

from trl import SFTTrainer
from transformers import TrainingArguments

trainer = SFTTrainer(
    model=model,
    tokenizer=tokenizer,
    train_dataset=dataset,
    dataset_text_field="text",
    max_seq_length=max_seq_length,
    args=TrainingArguments(
        per_device_train_batch_size=2,
        gradient_accumulation_steps=4,
        warmup_steps=5,
        max_steps=60,
        learning_rate=2e-4,
        fp16=True,
        logging_steps=1,
        output_dir="outputs",
    ),
)

Step 9: 开始训练

trainer.train()

训练时间:

  • 本示例:约10分钟

  • 取决于样本数量和模型大小

  • 可以看到实时进度条

Step 10: 测试模型

训练完成后,在下载前先测试效果:

# 设置推理模式
FastLanguageModel.for_inference(model)

# 准备测试消息
messages = [
    {"role": "user", "content": "你的测试HTML代码..."}
]

# 格式化输入
inputs = tokenizer.apply_chat_template(
    messages,
    tokenize=True,
    add_generation_prompt=True,
    return_tensors="pt",
).to("cuda")

# 生成输出
outputs = model.generate(
    input_ids=inputs,
    max_new_tokens=256,
    temperature=0.7,
)

# 解码结果
result = tokenizer.decode(outputs[0])
print(result)

验证输出格式是否符合预期。

六、导出模型

Step 11: 保存为GGUF格式

GGUF是Ollama使用的模型格式:

model.save_pretrained_gguf(
    "model",
    tokenizer,
    quantization_method="q4_k_m"
)

注意:

  • 这一步需要10-20分钟

  • 会生成一个.gguf文件

  • 文件较大,请耐心等待

Step 12: 下载到本地

运行下载单元格,文件会保存到你的下载文件夹:

from google.colab import files
files.download("model/unsloth.Q4_K_M.gguf")

下载时间:

  • 取决于网速

  • 本示例总共约25分钟(生成+下载)

七、在Ollama中部署

Step 13: 准备模型文件

  1. 打开终端

  2. 验证Ollama已安装:ollama --version

  3. 进入下载文件夹:cd ~/Downloads

  4. 创建工作目录:mkdir ollama-test && cd ollama-test

  5. 将下载的.gguf文件移动到此目录

Step 14: 创建Modelfile

touch Modelfile
nano Modelfile

在Modelfile中输入以下内容:

FROM ./unsloth.Q4_K_M.gguf

PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER stop "<|end_of_text|>"

TEMPLATE """{{ if .System }}系统: {{ .System }}{{ end }}
用户: {{ .Prompt }}
助手: """

SYSTEM """你是一个有用的AI助手。"""

Modelfile说明:

  • FROM:指向本地模型文件

  • PARAMETER:设置生成参数

  • TEMPLATE:定义对话格式

  • SYSTEM:系统提示词

保存:Ctrl+X → Y → Enter

Step 15: 创建Ollama模型

ollama create html-model -f Modelfile

验证创建成功:

ollama list

应该能看到html-model出现在列表中。

Step 16: 运行模型

ollama run html-model

现在可以输入测试提示,查看模型输出!

八、测试与评估

测试示例

从数据集中复制一个HTML示例,粘贴到Ollama命令行中:

>>> 提取以下HTML中的信息:<div><h2>笔记本电脑</h2>...

预期结果

模型应该输出格式化的JSON:

{
  "name": "笔记本电脑",
  "price": "$999",
  "category": "电子产品",
  "manufacturer": "某品牌"
}

注意事项

  • 由于使用了较小的模型和有限的数据集,效果可能不完美

  • 更多样本和更大的模型会带来更好的结果

  • 可以多次测试不同的输入

九、优化建议

9.1 提升效果的方法

  1. 增加训练样本

  • 500个样本 → 2000-5000个样本

  • 样本质量比数量更重要

  1. 使用更大的模型

  • Phi-3 Mini → Llama 3.1 8B

  • 或 Mistral 7B

  1. 调整训练参数

  • 增加训练步数(max_steps)

  • 调整学习率(learning_rate)

  • 尝试不同的batch size

  1. 改进数据质量

  • 确保输入-输出对准确

  • 覆盖更多边缘情况

  • 保持格式一致性

9.2 常见问题

Q: 训练时间太长怎么办?
A: 使用Google Colab Pro获得更好的GPU,或减少样本数量。

Q: 模型输出不稳定?
A: 增加训练样本,调低temperature参数。

Q: 内存不足错误?
A: 减小batch size或使用更小的模型。

十、总结

完整流程回顾

  1. ✅ 准备高质量的输入-输出数据集

  2. ✅ 在Google Colab上配置环境

  3. ✅ 选择合适的基础模型

  4. ✅ 预处理数据并添加LoRA适配器

  5. ✅ 执行训练(约10分钟)

  6. ✅ 测试模型效果

  7. ✅ 导出为GGUF格式

  8. ✅ 在Ollama中部署

  9. ✅ 本地运行和测试

关键要点

  • 数据质量决定一切:垃圾进,垃圾出

  • 从小开始:先用小模型和少量数据验证流程

  • 迭代优化:根据测试结果不断改进

  • 成本效益:微调比从头训练便宜得多

适用场景

✅ 特定格式输出(JSON、XML等)
✅ 领域专业知识(医疗、法律、金融)
✅ 企业内部数据处理
✅ 客服自动化
✅ 文档信息提取

下一步

  • 尝试不同的模型和参数

  • 扩大训练数据集

  • 集成到Python应用中

  • 探索更高级的微调技术


资源链接:

  • Google Colab笔记本:见视频描述

  • 示例数据集下载:见视频描述

  • Unsloth文档:查看官方GitHub

  • Ollama文档:ollama.ai

现在你已经掌握了从零到部署的完整LLM微调流程,开始创建你自己的专属AI模型吧!🚀


如果这篇文章对你有帮助,欢迎点赞、收藏、转发。也欢迎在评论区分享你的经验,我们一起交流学习!


我是 dtsola【IT解决方案架构师 | AI创业者】 ;专注AI创业、商业、技术、心理学、哲学内容分享。

提供服务:AI项目咨询 | 技术解决方案 | IT项目实施 | 企业技术顾问

博客:https://www.dtsola.com

公众号&VX:dtsola

需提供服务,加微信 dtsola,备注:IT咨询,并说明来意。


#独立开发者 #AI编程 #AI创业 #微调 #LLM #大模型 #独立开发 #AI工具 #效率工具 #生产力


Work Less, Earn More, Enjoy Life.