法律大模型微调:基于 LLaMA-Factory 的指令微调方案

1、LLaMA-Factory安装部署

下载LLaMA-Factory代码:

https://github.com/hiyouga/LLaMA-Factory

2、创建Python虚拟环境并安装依赖

我本机用的是Python3.9.10。版本太高会出错,这个要注意下。

复制代码
python -m venv ./env

也可以用conda创建,看个人习惯;

接下来激活环境,在当前窗口中,输入:env\Scripts\activate

进入到环境后,就可以下载依赖

复制代码
pip install -r requirements.txt

如果下载依赖很慢,可以设置为清华镜像源:

复制代码
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

3、启动LLaMA-Factory服务

在启动之前,我们先调整下两个文件runner.pyloader.py代码,因为在微调的过程中,会有些错误,所以需要提前做下调整。

首先是runner.py,这个文件在LLaMA-Factory-main\src\llamafactory\webui\目录下,需要修改378行左右的代码:

复制代码
self.trainer = Popen(["llamafactory-cli", "train", save_cmd(args)], env=env, stderr=PIPE, text=True)

修改成下面的代码:

self.trainer = Popen([sys.executable, "-m","llamafactory.cli", "train", save_cmd(args)], env=env, stderr=PIPE, text=True)

然后在根目录下。输入:pip install -e .

之后可以在env\Scripts下看到一个llamafactory-cli.exe执行文件

这样操作的目的就可以解决虚拟环境下,找不到llamafactory-cli模块的问题。

接下来就是修改loader.py,这个文件在LLaMA-Factory-main\src\llamafactory\data\目录下

找到load_dataset关键字,增加配置keep_in_memory=True

这样能解决多次训练一个模型的时候,不会出现文件命名问题。

复制代码
FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'C:\\Users\\EDY\\.cache\\huggingface\\datasets\\json\\default-8afa3bb648c61b3a\\0.0.0\\f4e89e8750d5d5ffbef2c078bf0ddfedef29dc2faff52a6255cf513c05eb1092\\tmpjaayunn7' -> 

上面的错误我删除这个文件夹后重新微调也不行,所以增加那个配置,不进行缓存就可以解决

没问题后运行:python src\webui.py

访问地址:http://127.0.0.1:7860

4、准备法律数据集

我用的是这个数据集https://www.modelscope.cn/datasets/Robin021/DISC-Law-SFT/files,自己也可以按需选择。

下载的数据集格式为:

{"id": "judgement_predit-1", "reference": ["《刑法》第一百一十四条:xxxx。"], "input": "基于下列案件,推测可能的判决结果。\n经审理查明,2015年6月21日15时许,xxxx", "output": "根据《刑法》第一百一十四条的规定,被告人白某某以危险方法危害公共安全,xxxx。"}

我们要调整指令微调(Instruction Tuning) 中最常见的 Alpaca 格式(或 Alpaca-style 格式) ,是当前开源大模型(如 LLaMA、Qwen、Baichuan 等)进行 监督微调(Supervised Fine-Tuning, SFT) 时广泛采用的数据结构:

复制代码
{
  "instruction": "请对以下政策或法规文件内容进行专业、清晰的解读:",
  "input": "打架斗殴......",
  "output": "此问题......。"
}

所以要进行转换,我这里编写了转换的脚本:

复制代码
import json

# 输入和输出文件路径(请根据实际情况修改)
input_file = './legal.json'   # 原始文件,每行一个 JSON 对象
output_file = './data/legal.json'  # 转换后的 JSON 列表文件

converted_data = []

with open(input_file, 'r', encoding='utf-8') as f:
    for line in f:
        line = line.strip()
        if not line:
            continue
        try:
            item = json.loads(line)
            new_item = {
                "instruction": "请对以下政策或法规文件内容进行专业、清晰的解读:",
                "input": item["title"],
                "output": item["contentText"]
            }
            converted_data.append(new_item)
        except json.JSONDecodeError as e:
            print(f"跳过无效行: {line[:100]}... 错误: {e}")

# 写入输出文件(格式化为 JSON 数组)
with open(output_file, 'w', encoding='utf-8') as f:
    json.dump(converted_data, f, ensure_ascii=False, indent=2)

print(f"转换完成!共处理 {len(converted_data)} 条记录,已保存到 {output_file}")

执行后会放到data目里下。

我们需要在dataset_info.json把这个文件加进去。这个文件在data目录下

配置完后,重启LLaMA-Factory服务。

数据集那栏选项就可以看到legal

5、用Qwen3-0.6B-Base进行实战微调

我们可以先测试下Qwen3-0.6B对法律的解读,用于对后面微调完成的模型进行对比。

配置微调参数,计算类型选择fp32,是因为我的电脑没有GPU,最大样本设置200,调试阶段不需要用太多

配置参考:

参数名 英文参数名 类型 默认值 建议范围 作用与影响 注意事项
学习率 learning_rate 浮点数 5e-5 1e-5 ~ 5e-4 AdamW优化器的初始学习率,控制参数更新的步长 - 值太大:训练不稳定,可能发散 - 值太小:收敛过慢 - 大模型用较小学习率(1e-5 ~ 2e-5) - 小模型可用较大学习率(3e-5 ~ 5e-5)
训练轮数 num_train_epochs 浮点数 3.0 1.0 ~ 10.0 整个数据集被完整训练的次数 - 3.0表示训练3轮 - 数据量少可增加轮数 - 数据量多可减少轮数 - 配合早停(early stopping)使用
最大梯度范数 max_grad_norm 浮点数 1.0 0.5 ~ 2.0 梯度裁剪阈值,防止梯度爆炸 - 超过此值的梯度会被缩放 - 值太小:梯度信息损失过多 - 值太大:梯度爆炸风险增加 - 推荐1.0作为起点
最大样本数 max_samples 整数 无限制 100 ~ 10000 限制每个数据集使用的最大样本数 - 设为200表示最多用200条数据 - 用于快速测试或小规模实验 - 设为-1或None表示用全部数据
计算类型 dtype 字符串 fp16 fp32/fp16/bf16 训练时使用的浮点数精度 - fp32 :32位浮点,最精确但最慢 - fp16 :16位浮点,快但可能数值溢出 - bf16:16位脑浮点,范围大精度低,推荐用于训练
截断长度 cutoff_len 整数 1024 512 ~ 4096 输入序列分词后的最大长度 - 2048表示文本会被截断或填充到2048个token - 影响: - 长文本任务需要设置较大值 - 值越大显存占用越高 - 超过模型最大长度会出错
批处理大小 per_device_train_batch_size 整数 1 1 ~ 16 每个GPU一次处理的样本数量 - 2表示每次前向传播处理2个样本 - 主要受GPU显存限制 - 8GB显存:建议1-2 - 16GB显存:建议2-4 - 24GB+显存:建议4-8
梯度累积 gradient_accumulation_steps 整数 1 1 ~ 32 累积多个批次的梯度后再更新参数 - 8表示累积8个批次的梯度才更新一次 - 有效批次大小 = 批处理大小 × 梯度累积步数 - 用于模拟大批次训练 - 可减少显存占用
验证集比例 val_size 浮点数/整数 0.0 0.05 ~ 0.2 或 100~1000 从训练集中划分验证集的比例或数量 - 浮点数 :0.1表示10%数据作为验证集 - 整数 :200表示200条数据作为验证集 - 设为0则不划分验证集 - 用于监控模型过拟合

点击开始

最后运行完成后。

6、用微调的模型进行测试

选择检查点路径,就是对应微调的模型

就可以进行测试,因为我用的模型,法律推理/判决预测(Legal Judgment Prediction)任务 的结构化样本,所以输出的内容是这样的

7、导出模型

然后就可以从文件夹下看到这个模型了

相关推荐
忘记57821 小时前
下载llama factory
llama
路边草随风21 小时前
llama_index简单使用
人工智能·python·llama
JoannaJuanCV2 天前
大模型训练:LLaMA-Factory快速上手
llama
java_logo2 天前
LANGFUSE Docker 容器化部署指南
运维·docker·云原生·容器·eureka·llama
weixin_446260852 天前
二、LLaMA Factory 介绍和基本使用
llama
weixin_446260853 天前
三、LLaMA Factory 微调通用设置
llama
木枷4 天前
LLama-factory数据报错
人工智能·机器学习·llama
快乐的钢镚子5 天前
【RAG实战】中医医疗问答系统
langchain·llama
Yeliang Wu6 天前
LLaMA-Factory 模型评估理论与实战:基于 Ubuntu 22.04 的系统化指南
linux·ubuntu·llama·评估·llamafactory