1. 项目背景与目标
最近在尝试用LlamaFactory微调Qwen3-4B大模型,目标是打造一个专门针对舰船领域的AI助手。这个想法源于我在船舶设计公司工作时遇到的实际需求——现有的通用大模型虽然强大,但在处理专业舰船术语、技术参数和行业知识时总是差强人意。
Qwen3-4B作为通义千问团队开源的中英双语大模型,基础能力相当不错。4B的参数量在消费级GPU上也能跑得动,特别适合我们这种想要垂直领域定制但又没有超算资源的小团队。而LlamaFactory这个微调框架,相比传统的HuggingFace Transformers,提供了更友好的可视化界面和更高效的参数配置方式,大大降低了微调门槛。
2. 环境准备与数据收集
2.1 硬件配置选择
我用的是一台配备RTX 4090显卡的工作站,24GB显存刚好能满足4B模型的微调需求。如果显存不足,可以考虑使用QLoRA等技术降低显存占用。实测下来,batch size设为4时显存占用约18GB,训练速度也还能接受。
重要提示:微调前务必检查CUDA和cuDNN版本兼容性,我一开始就栽在这个坑里,折腾了半天才发现是驱动版本不匹配。
2.2 数据集构建
舰船领域的数据集比较特殊,公开可用的高质量语料不多。我主要通过以下几个渠道收集数据:
- 船舶设计手册和技术规范PDF(转换后约120万字)
- 海事论坛的专业讨论帖(爬取清洗后约80万字)
- 自己整理的舰船百科知识(约5万字)
- 船舶类专利文献(约50万字)
数据处理的关键步骤:
python复制# 示例:PDF文本提取与清洗
import pdfplumber
import re
def extract_text_from_pdf(pdf_path):
text = ""
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
text += page.extract_text()
# 去除特殊字符和页码
text = re.sub(r'[\x00-\x1f\x7f-\x9f]', '', text)
text = re.sub(r'第\d+页', '', text)
return text
3. 模型微调实战
3.1 LlamaFactory配置详解
LlamaFactory的配置文件采用YAML格式,主要需要关注以下几个参数:
yaml复制model:
name: Qwen/Qwen3-4B
# 关键参数
lora_rank: 64
lora_alpha: 32
lora_dropout: 0.1
train:
batch_size: 4
learning_rate: 3e-5
num_train_epochs: 5
max_seq_length: 2048
参数选择经验:
- lora_rank:64-128之间效果较好,再大容易过拟合
- learning_rate:3e-5到5e-5比较稳定
- max_seq_length:舰船技术文档通常较长,建议不低于2048
3.2 微调过程监控
使用LlamaFactory内置的监控面板可以实时查看:
- 损失曲线变化
- GPU显存占用
- 训练速度(tokens/sec)
- 学习率调整情况
我特别添加了wandb集成,方便远程监控:
python复制# 在训练脚本中添加
from transformers.integrations import WandbCallback
trainer.add_callback(WandbCallback(
project="ship-llm",
name=f"qwen3-4b-ship-v1",
tags=["naval", "qwen3"]
))
4. 效果评估与优化
4.1 领域知识测试
设计了几类测试问题评估模型表现:
| 问题类型 | 原始Qwen3-4B | 微调后模型 |
|---|---|---|
| 舰船分类 | 60%准确率 | 92%准确率 |
| 技术参数 | 经常幻觉 | 85%正确 |
| 设计规范 | 泛泛而谈 | 能引用具体条款 |
4.2 常见问题解决
在实际使用中遇到的典型问题及解决方案:
-
术语混淆问题
- 现象:把"驱逐舰"和"护卫舰"混为一谈
- 解决:在数据集中添加更多对比示例,强化区分
-
数字精度问题
- 现象:船舶尺寸数据经常差一个数量级
- 解决:在损失函数中增加数值精度权重
-
长文档理解不足
- 现象:处理超过1500字的文档时质量下降
- 解决:调整positional encoding参数,增加max_seq_length
5. 部署与应用
5.1 模型量化与加速
为了能在普通服务器上部署,使用了AWQ量化技术:
bash复制python -m awq.quantize \
--model qwen3-4b-ship \
--output qwen3-4b-ship-awq \
--w_bit 4 \
--q_group_size 128
量化后模型大小从15GB降到4.8GB,推理速度提升2.3倍,精度损失不到2%。
5.2 实际应用场景
目前已经集成的应用场景:
- 船舶设计规范问答系统
- 舰船技术文档自动摘要
- 海事法规合规性检查
- 船舶故障诊断辅助
特别在故障诊断场景,模型能结合历史案例给出维修建议,准确率达到工程师水平的80%,大大提高了工作效率。
6. 经验总结与进阶建议
经过这次微调实践,有几个关键经验值得分享:
-
数据质量比数量更重要
- 初期盲目追求数据量,后来发现低质量数据反而降低性能
- 建议:人工筛选至少2000条高质量样本作为核心数据集
-
领域词典必不可少
- 建立包含5000+舰船专业术语的词典
- 在tokenizer中特别处理这些术语,避免被拆分
-
渐进式微调效果更好
- 先通用领域→再海事领域→最后细分舰船类型
- 相比直接微调,最终效果提升15-20%
对于想尝试类似项目的朋友,我的建议是从小规模开始:
- 先用1-2GB精选数据微调基础版本
- 评估核心指标达标后,再扩大数据规模
- 考虑结合RAG技术弥补模型知识盲区
