
DeepSeek SFT 微调:基于法律问答的模型优化实践
此外,我们还将探讨实现过程中的技术细节、关键决策的考量,以及未来优化的潜在方向。
随着大语言模型(Large Language Models, LLMs)在法律领域的应用日益广泛,如何通过监督微调(Supervised Fine-Tuning, SFT)提升模型在特定任务上的表现成为研究和实践中的热门话题。本文将以 DeepSeek 模型为基础,详细介绍如何利用 SFT 微调技术优化其在法律问答任务中的性能。
从环境配置、数据准备、模型微调、训练过程到评估与结果分析逐步展开,旨在为读者提供一个全面且实用的技术指南。 此外,我们还将探讨实现过程中的技术细节、关键决策的考量,以及未来优化的潜在方向。
01
环境配置
在进行模型微调之前,搭建一个稳定的运行环境是至关重要的第一步。以下是环境配置的详细步骤和技术细节。
1.1 设置环境变量
环境变量的设置直接影响模型训练的稳定性和资源利用效率。以下是代码中涉及的具体配置:
-
禁用 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 torch
from transformers import AutoModelForCausalLM, AutoTokenizer, Trainer, TrainingArguments
from peft import LoraConfig, get_peft_model
from datasets import Dataset
-
torch:提供深度学习计算支持,尤其是 GPU 加速。
-
transformers:Hugging Face 提供的库,用于加载预训练模型、分词器以及配置训练参数。
-
peft:参数高效微调(Parameter-Efficient Fine-Tuning)库,支持 LoRA 等技术。
-
datasets:用于高效加载和处理数据集。
这些库的协同工作为后续的模型加载、数据处理和训练提供了坚实的基础。
02
数据准备
数据是 SFT 的核心,直接决定了模型在法律问答任务上的表现。本次微调使用的数据集为法律问答数据集(JEC-QA/1_train.json),目标是让模型学会分析法律问题并从选项中选择正确答案。
2.1 加载数据集
数据集的加载需要确保数据的完整性和可控性。以下是加载函数的实现:
-
文件加载:通过 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 分词处理
法律文本通常较长且复杂,因此分词过程需要特别注意长度限制和稳定性。以下是手动分词的实现:
-
最大长度:设置 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 训练参数
训练参数的设置需要平衡性能和资源利用率:
-
批量大小:每设备批次大小为 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 的回答。
-
结果记录:保存推理输出,包括思维链和最终答案,便于后续分析。
- 结果与保存
-
模型保存:训练完成后,LoRA 适配器和分词器保存至 ./outputs/final_model,便于后续加载和部署。
-
评估报告:生成 JSON 格式的报告,记录每个样本的推理过程、预测答案和正确性。例如,一个样本的输出可能包括完整的思维链和选择的选项 B。
- 实验结果与分析
在微调过程中,模型在法律问答任务上的表现逐步提升。以评估样本为例,初始未经微调的模型可能生成不准确或无关的回答,而经过 5000 步训练后,模型能够正确解析问题并选择选项 B。这种进步表明 SFT 有效增强了模型对法律领域的理解能力和推理能力。
此外,LoRA 技术的应用显著降低了资源需求。例如,在单张 GPU(如 NVIDIA RTX 3090,24GB 显存)上,完整微调可能需要超过 30GB 显存,而 LoRA 微调仅需约 8GB,大幅提高了训练的可行性。
如何零基础入门 / 学习AI大模型?
大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?
”“谁的饭碗又将不保了?
”等问题热议不断。
不如成为「掌握AI工具的技术人」
,毕竟AI时代,谁先尝试,谁就能占得先机!
想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。
但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高
那么我作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,希望可以帮助到更多学习大模型的人!至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
👉 福利来袭
CSDN大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈
全套AGI大模型学习大纲+路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
👉 福利来袭
CSDN大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。
更多推荐
所有评论(0)