随着大语言模型(Large Language Models, LLMs)在法律领域的应用日益广泛,如何通过监督微调(Supervised Fine-Tuning, SFT)提升模型在特定任务上的表现成为研究和实践中的热门话题。本文将以 DeepSeek 模型为基础,详细介绍如何利用 SFT 微调技术优化其在法律问答任务中的性能。

img

**从环境配置、数据准备、模型微调、训练过程到评估与结果分析逐步展开,旨在为读者提供一个全面且实用的技术指南。**此外,我们还将探讨实现过程中的技术细节、关键决策的考量,以及未来优化的潜在方向。

01 环境配置

在进行模型微调之前,搭建一个稳定的运行环境是至关重要的第一步。以下是环境配置的详细步骤和技术细节。

1.1 设置环境变量

环境变量的设置直接影响模型训练的稳定性和资源利用效率。以下是代码中涉及的具体配置:

import osos.environ["UNSLOTH_DISABLE_RL_PATCH"] = "1"  # 禁用 Unsloth RL 补丁os.environ["CUDA_VISIBLE_DEVICES"] = "0"     # 指定 GPU 设备os.environ["TOKENIZERS_PARALLELISM"] = "false"  # 禁用分词器的并行处理
  • 禁用 Unsloth RL 补丁:Unsloth 是一个用于加速 LLM 训练的工具,但其与强化学习(RL)相关的补丁可能会干扰 SFT 过程,因此通过设置 UNSLOTH_DISABLE_RL_PATCH=“1” 禁用此功能,确保微调过程专注于监督学习。

  • 指定 GPU 设备:通过 CUDA_VISIBLE_DEVICES=“0” 指定使用单张 GPU(编号为 0),这不仅明确了计算资源分配,还避免了多 GPU 环境下可能出现的资源竞争问题。

  • 禁用分词并行:将 TOKENIZERS_PARALLELISM 设置为 false,避免分词器在多线程或多进程环境下运行时可能导致的冲突,尤其是在单机训练场景下,这能显著提升稳定性。

1.2 导入必要库

微调过程中依赖多个开源库来实现模型加载、训练和优化。以下是导入的核心库:

import torchfrom transformers import AutoModelForCausalLM, AutoTokenizer, Trainer, TrainingArgumentsfrom peft import LoraConfig, get_peft_modelfrom datasets import Dataset
  • torch:提供深度学习计算支持,尤其是 GPU 加速。

  • transformers:Hugging Face 提供的库,用于加载预训练模型、分词器以及配置训练参数。

  • peft:参数高效微调(Parameter-Efficient Fine-Tuning)库,支持 LoRA 等技术。

  • datasets:用于高效加载和处理数据集。

这些库的协同工作为后续的模型加载、数据处理和训练提供了坚实的基础。

02 数据准备

数据是 SFT 的核心,直接决定了模型在法律问答任务上的表现。本次微调使用的数据集为法律问答数据集(JEC-QA/1_train.json),目标是让模型学会分析法律问题并从选项中选择正确答案。

2.1 加载数据集

数据集的加载需要确保数据的完整性和可控性。以下是加载函数的实现:

def load_dataset(file_path, max_samples=None):    with open(file_path, 'r', encoding='utf-8') as f:        data = json.load(f)    if max_samples and len(data) > max_samples:        data = data[:max_samples]    return data
  • 文件加载:通过 Python 的 json.load 从指定路径读取 JSON 文件,确保编码为 utf-8 以支持中文字符。

  • 样本限制:通过 max_samples 参数限制数据量,例如在调试阶段可以设置为较小的值(如 100),以加快实验迭代速度;在正式训练时则可使用完整数据集。

2.2 数据格式化

为了让模型理解法律问题的上下文并生成符合预期的回答,设计一个清晰的提示模板至关重要。以下是定义的模板:

LAW_PROMPT_TEMPLATE = """请你作为一位法律专家,分析下面的法律问题并给出你认为正确的答案。请先思考分析题目,然后从选项中选择一个最合适的答案。
### 问题:{question}
### 回应:<think>
</think>"""
  • 模板设计:模板要求模型以法律专家的身份进行分析,并通过 标签鼓励模型展示推理过程。这种结构化的输入有助于模型生成既有逻辑性又有结论的回答。

  • 动态填充:{question} 会被具体的问题陈述和选项替换。例如,一个样本可能包含问题陈述(statement)和选项列表(option_list),通过字符串格式化嵌入模板。

  • 选项兼容性:支持多种选项格式(如字典 {“A”: “选项A”, “B”: “选项B”} 或列表 [选项A, 选项B]),提高了代码的通用性。

2.3 分词处理

法律文本通常较长且复杂,因此分词过程需要特别注意长度限制和稳定性。以下是手动分词的实现:

def manual_tokenize(texts, tokenizer):    result = []    for item in texts:        tokenized = tokenizer.encode_plus(            text,            max_length=2048,            padding="max_length",            truncation=True        )        result.append({            "input_ids": tokenized["input_ids"],            "attention_mask": tokenized["attention_mask"]        })    return result
  • 最大长度:设置 max_length=2048,足以容纳复杂的法律问题和选项,同时通过 truncation=True 截断超长文本。

  • 手动分词:相比默认的多进程分词,手动分词避免了潜在的线程冲突问题,尤其在资源有限的单机环境中更稳定。

    输出结构:返回 input_ids(编码后的 token ID)和 attention_mask(注意力掩码),为后续训练准备好输入数据。

03 模型配置与微调

3.1 加载 DeepSeek 模型

本次微调基于 DeepSeek 模型的一个变体,具体加载方式如下:

MODEL_PATH = "./deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B"tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)model = AutoModelForCausalLM.from_pretrained(MODEL_PATH, torch_dtype=torch.float16, device_map="auto")
  • 模型选择:DeepSeek-R1-Distill-Qwen-1.5B 是一个 15 亿参数的预训练模型,通过蒸馏技术优化,既保留了较高的性能,又降低了计算成本,非常适合资源受限的场景。

  • 数据类型:使用 torch_dtype=torch.float16 将模型参数转为半精度浮点数,减少内存占用并加速计算。

  • 设备分配:device_map=“auto” 由 transformers 自动将模型分配到可用设备(如 GPU),简化配置。

3.2 配置 LoRA

为了高效微调,采用 LoRA(Low-Rank Adaptation)技术,仅更新少量参数而非整个模型:

lora_config = LoraConfig(    r=16,    lora_alpha=16,    target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],    lora_dropout=0.0,    task_type="CAUSAL_LM")model = get_peft_model(model, lora_config)
  • LoRA 参数:

    • r=16:低秩矩阵的秩,决定了新增参数的规模,值较小以保持高效。
    • lora_alpha=16:缩放因子,控制 LoRA 适配权重对模型输出的影响。
    • target_modules:指定适配的 Transformer 层,包括注意力机制(q_proj, k_proj, v_proj, o_proj)和前馈网络(gate_proj, up_proj, down_proj)。
  • 高效性:LoRA 只更新约 1% 的参数,大幅降低了内存和计算需求,同时保留了预训练模型的通用知识。

  • 任务类型:CAUSAL_LM 表示因果语言建模,适合生成式问答任务。

3.3 训练参数

训练参数的设置需要平衡性能和资源利用率:

training_args = TrainingArguments(    output_dir="./outputs",    per_device_train_batch_size=2,    gradient_accumulation_steps=4,    learning_rate=2e-4,    max_steps=5000,    warmup_steps=100,    save_steps=10,    fp16=True,    optim="adamw_8bit")
  • 批量大小:每设备批次大小为 2,通过 gradient_accumulation_steps=4 实现等效批次大小 8,适合显存有限的场景。

  • 学习率:设置为 2e-4,在微调中属于中等偏低的值,确保模型稳定收敛。

  • 训练步数:共 5000 步,预热阶段 100 步,逐步调整学习率以避免初始震荡。

  • 优化器:adamw_8bit 是一种 8 位精度的 AdamW 优化器,进一步节省内存并加速训练。

3.4 训练过程

使用 Trainer 类执行训练,简化流程并提供丰富的功能支持:

trainer = Trainer(    model=model,    args=training_args,    train_dataset=dataset,    data_collator=DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False))trainer.train()
  • 数据整理器:DataCollatorForLanguageModeling 配置为因果语言建模任务(mlm=False),适合从左到右的文本生成。

  • 训练执行:trainer.train() 启动训练过程,自动处理批量加载、梯度计算和参数更新。

04 模型评估

4.1 评估样本

为了验证模型性能,设计了具体的法律问答样本,例如:

    {        "answer": ["B"],         "id": "1_4269",         "option_list": {            "A": "我国商务部在确定进口橡胶制品是否存在补贴时必须证明出国(地区)政府直接向出口商提供了现金形式的财政资助",             "B": "在反补贴调查期间,该八国政府或橡胶制品的出口经营者,可以向中国商务部作出承诺,取消、限制补贴或改变价格",             "C": "如果我国商务部终局裁定决定对该八国进口橡胶制品征收反补贴税,该反补贴税的征收期限不得超过10年",             "D": "如果中国橡胶制品进口商对商务部征收反补贴税的终局裁定不服,必须首先向商务部请求行政复审,对行政复审决定还不服,才能向中国有管辖权的法院起诉"        },         "statement": "中国商务部决定对原产于马来西亚等八国的橡胶制品展开反补贴调查。根据我国《反补贴条例》以及相关法律法规,下列关于此次反补贴调查的哪项判断是正确的?"    },
  • 样本结构:包含问题陈述(statement)、正确答案(answer)和选项(option_list),便于评估模型的推理和选择能力。

4.2 自定义评估回调

通过自定义回调函数,在训练过程中定期评估模型:

class EvalCallback:    def evaluate(self, step):        model = AutoModelForCausalLM.from_pretrained(MODEL_PATH, device_map="cpu")        peft_model = PeftModel.from_pretrained(model, f"checkpoint-{step}")        outputs = peft_model.generate(input_ids=inputs["input_ids"], max_new_tokens=500)
  • 评估时机:每 10 步(由 save_steps=10 控制)保存检查点后触发评估。

  • CPU 推理:将模型加载到 CPU,避免 GPU 内存不足,同时生成最多 500 个新 token 的回答。

  • 结果记录:保存推理输出,包括思维链和最终答案,便于后续分析。


  1. 结果与保存
  • 模型保存:训练完成后,LoRA 适配器和分词器保存至 ./outputs/final_model,便于后续加载和部署。

  • 评估报告:生成 JSON 格式的报告,记录每个样本的推理过程、预测答案和正确性。例如,一个样本的输出可能包括完整的思维链和选择的选项 B。


  1. 实验结果与分析

在微调过程中,模型在法律问答任务上的表现逐步提升。以评估样本为例,初始未经微调的模型可能生成不准确或无关的回答,而经过 5000 步训练后,模型能够正确解析问题并选择选项 B。这种进步表明 SFT 有效增强了模型对法律领域的理解能力和推理能力。

此外,LoRA 技术的应用显著降低了资源需求。例如,在单张 GPU(如 NVIDIA RTX 3090,24GB 显存)上,完整微调可能需要超过 30GB 显存,而 LoRA 微调仅需约 8GB,大幅提高了训练的可行性。

github源码:https://github.com/wangxupeng/DeepSeek-SFT-LawQA

零基础如何学习AI大模型

领取方式在文末

为什么要学习大模型?

学习大模型课程的重要性在于它能够极大地促进个人在人工智能领域的专业发展。大模型技术,如自然语言处理和图像识别,正在推动着人工智能的新发展阶段。通过学习大模型课程,可以掌握设计和实现基于大模型的应用系统所需的基本原理和技术,从而提升自己在数据处理、分析和决策制定方面的能力。此外,大模型技术在多个行业中的应用日益增加,掌握这一技术将有助于提高就业竞争力,并为未来的创新创业提供坚实的基础。

大模型典型应用场景

AI+教育:智能教学助手和自动评分系统使个性化教育成为可能。通过AI分析学生的学习数据,提供量身定制的学习方案,提高学习效果。
AI+医疗:智能诊断系统和个性化医疗方案让医疗服务更加精准高效。AI可以分析医学影像,辅助医生进行早期诊断,同时根据患者数据制定个性化治疗方案。
AI+金融:智能投顾和风险管理系统帮助投资者做出更明智的决策,并实时监控金融市场,识别潜在风险。

这些案例表明,学习大模型课程不仅能够提升个人技能,还能为企业带来实际效益,推动行业创新发展。

大模型就业发展前景

根据脉脉发布的《2024年度人才迁徙报告》显示,AI相关岗位的需求在2024年就已经十分强劲,TOP20热招岗位中,有5个与AI相关。
在这里插入图片描述字节、阿里等多个头部公司AI人才紧缺,包括算法工程师、人工智能工程师、推荐算法、大模型算法以及自然语言处理等。
在这里插入图片描述
除了上述技术岗外,AI也催生除了一系列高薪非技术类岗位,如AI产品经理、产品主管等,平均月薪也达到了5-6万左右。
AI正在改变各行各业,行动力强的人,早已吃到了第一波红利。

最后

大模型很多技术干货,都可以共享给你们,如果你肯花时间沉下心去学习,它们一定能帮到你!

大模型全套学习资料领取

如果你对大模型感兴趣,可以看看我整合并且整理成了一份AI大模型资料包,需要的小伙伴文末免费领取哦,无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发

在这里插入图片描述

部分资料展示

一、 AI大模型学习路线图

整个学习分为7个阶段
在这里插入图片描述
在这里插入图片描述

二、AI大模型实战案例

涵盖AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,皆可用。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

三、视频和书籍PDF合集

从入门到进阶这里都有,跟着老师学习事半功倍。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、LLM面试题

在这里插入图片描述
在这里插入图片描述

五、AI产品经理面试题

在这里插入图片描述

六、deepseek部署包+技巧大全

在这里插入图片描述

😝朋友们如果有需要的话,可以V扫描下方二维码联系领取~
在这里插入图片描述

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐