在 AI 大模型时代,每个行业都能通过微调技术定制专属 AI 助手。对于宠物商店而言,一个能解答喂养知识、商品咨询、常见疾病建议的智能客服,能极大提升客户体验并降低人工成本。本文将以Qwen3-0.6B 模型为基础,通过LoRA 轻量化微调技术,一步步教你打造宠物商店智能客服模型,即使是 基础的Mac 设备也能流畅运行。
一、项目背景与技术选型
在开始前,我们先明确为什么选择当前的技术方案:
| 选型维度 | 选择方案 | 选择理由 |
|---|---|---|
| 基础模型 | Qwen3-0.6B | 阿里通义千问推出的轻量级模型,0.6B 参数对硬件要求低(Mac/MiniPC 均可运行),同时保留较好的对话能力 |
| 微调技术 | LoRA(Low-Rank Adaptation) | 仅训练模型的少量参数(约 0.1%),显存占用低、训练速度快,避免全量微调的高硬件成本 |
| 开发环境 | PyTorch + Transformers + PEFT | 生态成熟,文档丰富,PEFT 库提供 LoRA 的开箱即用支持,降低微调门槛 |
| 数据格式 | JSON Lines(.jsonl) | 适合存储单条对话数据,便于分批加载和预处理,支持增量数据更新 |
二、前期准备:环境搭建与数据准备
在编写代码前,需要完成环境配置和数据准备两个关键步骤,这是后续微调顺利进行的基础。
1. 环境搭建
首先安装所需的 Python 库,建议使用虚拟环境,避免依赖冲突:
# 基础依赖
pip install torch transformers datasets
# LoRA相关依赖
pip install peft accelerate
# 数据处理依赖
pip install jsonlines regex
对于 Mac 用户,无需额外安装 CUDA(LoRA 微调 0.6B 模型无需 GPU),PyTorch 会自动适配 MPS 加速;Windows/Linux 用户若有 NVIDIA 显卡,可安装对应版本的 PyTorch 以支持 CUDA 加速。
2. 数据准备
智能客服的效果高度依赖数据质量,自行构建了 **“用户提问 - 客服回答”** 格式的对话数据集:
分成8个类别。
| 类别 | 说明 |
|---|---|
| 1. 猫粮产品咨询 | 适用年龄、品种、成分、颗粒、美毛等 |
| 2. 狗粮产品咨询 | 同上,针对狗 |
| 3. 售后问题 | 过敏、拉稀、呕吐、不吃等 |
| 4. 喂食与换粮 | 喂食量、换粮方法、混喂等 |
| 5. 退换货与破损 | 退换政策、包装破损 |
| 6. 物流查询 | 发货、快递、签收问题 |
| 7. 促销与优惠券 | 满减、券使用、活动 |
| 8. 保质期与储存 | 开封后保存、保质期、包装 |
数据集按类别分层抽样,避免某些类别在验证/测试集中缺失,分为训练集(train.jsonl)、验证集(val.jsonl)、测试集(test.jsonl),单条数据格式如下(JSON Lines 格式,每行一个 JSON 对象):
{"messages": [{"role": "user", "content": "狗粮能不能泡水吃啊?水温有要求不?"}, {"role": "assistant", "content": "可以泡温水吃的,水温控制在 40℃以下就行,泡 5 分钟软化后给狗狗吃~但别泡太久,不然容易滋生细菌!💧"}]}
比例为:
- 训练集(Train):80%
- 验证集(Val):15%
- 测试集(Test):5%
数据集以文章附件形式提供。
三、核心步骤:从原始模型测试到 LoRA 微调
整个流程分为三个核心阶段:原始模型测试(验证基础模型能力)→ LoRA 微调(注入宠物客服知识)→ 微调后模型推理(验证效果)。
阶段 1:原始模型测试 —— 了解基础能力
在微调前,我们先测试 Qwen3-0.6B 原始模型对宠物领域问题的回答能力,明确微调的必要性。
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
import json
import os
# 1. 配置参数
MODEL_NAME = "Qwen/Qwen3-0.6B" # 基础模型地址
TEST_FILE = "split_data/test.jsonl" # 测试集路径
MAX_NEW_TOKENS = 512 # 最大生成文本长度
# 2. 自动选择设备(Mac优先用MPS,其他用CPU)
device = "mps" if torch.backends.mps.is_available() else "cpu"
print(f"🚀 使用设备: {device}")
# 3. 加载模型和分词器
print("⏳ 正在加载模型和分词器...")
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
dtype=torch.float16, # 半精度加载,节省显存
device_map="auto", # 自动分配设备
trust_remote_code=True
)
model.eval() # 推理模式,禁用Dropout
print("✅ 模型加载完成!")
# 4. 测试前3条数据
print("\n🔍 开始测试原始模型表现(前 3 条)...\n")
count = 0
with open(TEST_FILE, "r", encoding="utf-8") as f:
for line in f:
if count >= 3:
break
data = json.loads(line.strip())
messages = data["messages"]
# 构造输入:仅保留用户提问,添加生成提示
text = tokenizer.apply_chat_template

最低0.47元/天 解锁文章
4326

被折叠的 条评论
为什么被折叠?



