
简介一份面向AI研发、自然语言处理及法律/医疗智能化应用开发者的技术文档讲解如何借助LlamaFactory对Qwen2.5大模型实施高效微调。文档基于LoRA、QLoRA等参数高效微调技术结合多模型兼容、可视化界面与全流程监控特性系统介绍从环境搭建、数据采集与预处理、训练配置编写到模型评估与服务部署的完整链路。内容以法律判断、医疗诊断等真实案例为切入点对比微调前后模型在专业任务中的表现并给出成本控制与效果评估建议可直接指导读者在消费级显卡上完成领域模型定制。资源包共1个docx文件整体大小仅39KB文本精炼但覆盖要点齐全。目前已有94人学习适合具备一定深度学习基础、希望快速掌握基于LlamaFactory微调方法并落地垂直领域应用的技术人员。1. 从“会聊天”到“能干活”为什么法律与医疗场景必须单独微调 Qwen2.5法律问答模型把“无效合同”解释成“合同没有效果”病历结构化模型把“左肺下叶”拆成“左肺、下叶”两段——这类问题不是模型不够聪明而是通用模型没见过行业语料。单纯靠编写 prompt 调教只能纠正表面格式模型对领域知识的内在理解还是上不去。用 LlamaFactory 对 Qwen2.5 做行业微调是目前工程上最稳、投入产出比最高的一条路数据准备好LoRA 跑起来一张 24G 显存的显卡就能把 7B 模型调成法律或医疗领域的专家模型。这篇笔记写给正在做自然语言处理落地的工程师和算法同学从选型、数据构造到训练和部署把每一步讲透。2. LlamaFactory 与 Qwen2.5 的选型逻辑LoRA 参数量、显存和训练数据怎么定2.1 LlamaFactory 是什么为什么它比手写 Trainer 更适合行业微调LlamaFactory 是一个开源的大模型微调框架把数据预处理、模型加载、训练、评估和导出这几个环节封装成了统一的配置入口。它底层仍然依赖 transformers 和 peft但对外暴露的是简洁的训练脚本和 WebUI 页面。和直接用 transformers 手写 Trainer 脚本相比LlamaFactory 最大的价值在于把“数据格式校验”“断点续训”“单卡多卡切换”这些容易出错的工程细节提前处理掉了。我见过不少团队直接用 peft 写 LoRA 训练脚本前两周都在跟数据格式报错和模型加载参数较劲。LlamaFactory 的做法是先把数据集读进来做格式检查标注出缺失字段和类型错误再进入训练流程。另一个实用点是它自带多种模型体系的支持Qwen2.5 系列、Llama 系列和 Mistral 系列都在预置列表里不需要手写模型映射关系。实际使用中 LlamaFactory 有两种操作方式WebUI 适合第一次跑通和快速验证数据效果命令行模式适合批量跑实验、留日志和接 CI 流程。我个人推荐命令行为主、WebUI 为辅因为命令行能把训练参数原样保存在 shell 历史里出了问题方便回溯。框架本身不限制 LoRA 或全参微调但行业微调场景里 LoRA 用得最多具体原因在下面的选型小节展开。2.2 Qwen2.5-7B 还是 14B参数规模、显存与效果的三方权衡Qwen2.5 系列在中文理解和长文本处理上底子不错选择哪个规模需要先盘算手里的显卡资源。Qwen2.5-7B 的 FP16 权重大约需要 15GB 显存在 24G 显卡上用 LoRA 训练开 8bit 量化和梯度检查点后可以顺利跑起来。Qwen2.5-14B 的 FP16 权重接近 30GBLoRA 训练在 24G 卡上非常紧张通常建议 40G 以上显存或者走多卡张量并行。法律和医疗场景对模型能力的要求不太一样。法律条文问答、合同条款审查这类任务依赖长上下文和精确的规则理解医疗病历结构化、临床 FAQ 问答则更多依赖专业术语映射和实体识别。14B 在长文档推理上确实比 7B 稳一些但训练成本和推理延迟也上去了。大多数行业项目的数据量在 1 万到 5 万条之间7B 经过 LoRA 微调后已经能覆盖大部分场景14B 更适合预算充足、对复杂推理要求更高的团队。下面是一个按显存规模选择的参考表具体数值以实际显卡和框架版本为准模型规模权重大小FP16最低建议显存LoRA 8bit推荐 LoRA rank适用场景Qwen2.5-7B约 15GB24GB64~128法律 FAQ、病历结构化、中小规模行业问答Qwen2.5-14B约 29GB40GB32~64长合同审查、医疗诊断辅助、复杂推理任务Qwen2.5-32B约 65GB多卡 80GB16~32预算充足追求最强领域能力2.3 LoRA 还是全参微调行业模型构建里我一般先选 LoRALoRA 的核心思路是冻结原始模型权重只训练注入的低秩适应矩阵。微调的参数量通常不到整体参数的 1%所以训练速度和显存占用都比全参微调低一个量级。训练产物是一个几十到几百 MB 的 adapter 文件后续可以随时卸载不影响基座模型做通用任务。这正是行业专家模型需要的特性法律和医疗两个任务可以共用同一个基座各挂一个 adapter。全参微调的效果上限更高但需要重新保存整个模型权重训练时间以周为单位计算并且存在灾难性遗忘的风险模型可能在行业任务提升的同时丢掉通用能力。我自己的项目经验是当训练数据低于 10 万条时LoRA 的效果与全参微调差距不大但工程复杂度低很多。只有当你把数据清洗到足够干净、且发现 LoRA 在测试集上的效果确实不够时再考虑解冻部分层或走全参微调。参数高效微调的一个隐含约束是微调做不到无中生有模型在行业任务上的能力上限仍然取决于 Qwen2.5 基座本身的推理能力LoRA 负责把领域知识“校准”到基座上。3. 构造法律与医疗微调数据集JSON 格式、清洗与模板设计3.1 法律与医疗数据的结构差异以及各自要避开哪些坑法律数据常见的来源是裁判文书、法条文本、合同条款和问答社区。裁判文书动辄几千字包含案由、争议焦点、法院认定和判决结果直接整段喂给模型会让训练变得不稳定而且 LoRA 能学到的长文本模式有限。更合适的做法是把一份裁判文书拆成多个问答对例如给定“当事人主张”让模型输出“法院认定依据”或者给定案件事实让模型归纳“案由”。法条原文本身是规则性文本适合构造“根据以下条文回答问题”的样本。医疗数据和法律数据不太一样它的实体和关系更密集。一份出院小结里包含诊断、既往史、手术记录和出院医嘱直接让模型做自由文本生成容易输出幻觉。最常见的落地任务是把非结构化文本转成结构化字段比如从主诉里抽取“症状、部位、持续时间”或者把诊断描述映射到标准 ICD 编码。这类任务对模型的要求是“忠实抽取”而非“推理生成”因此数据集里的问题模板要固定答案则严格框定在原文范围内。无论哪种数据清洗环节都要做三件事去掉无效字符和脱敏信息、统一标点符号、保证问题与答案之间没有明显的逻辑跳跃。特别提醒一下法律文书里的“本院认为”等套话在样本里频繁出现如果不做模板去重模型会把这些套话当成输出模板导致回答风格单一甚至答非所问。3.2 从原始文档到 alpaca 格式 JSON一个可复用的转换脚本LlamaFactory 默认支持 alpaca 和 sharegpt 两种数据格式。alpaca 格式是三条核心字段instruction 表示指令input 表示补充输入output 表示期望输出。下面这段脚本展示了如何把一份“原始问答对”转成 LlamaFactory 可用的 JSON 文件并做基础清洗import json import re def clean_text(text): # 统一全角半角标点去掉多余空行和控制字符 text text.replace(, ,).replace(。, .) text re.sub(r\s, , text) return text.strip() def build_alpaca_format(raw_q, raw_a, systemNone): instruction clean_text(raw_q) output clean_text(raw_a) # 如果带了 system prompt放到 instruction 前面做角色引导 if system: instruction f{system}\n\n{instruction} return { instruction: instruction, input: , output: output } raw_pairs [ (合同未约定付款时间如何确定履行期限, 根据民法典第510条可协议补充不能达成补充协议的按照合同相关条款或交易习惯确定。), (患者主诉胸痛伴气促3天既往有高血压病史请生成主诉摘要。, 胸痛伴气促3天既往高血压病史。) ] dataset [build_alpaca_format(q, a) for q, a in raw_pairs] with open(train.json, w, encodingutf-8) as f: json.dump(dataset, f, ensure_asciiFalse, indent2) print(f生成 {len(dataset)} 条训练样本)这段脚本做的事情很简单清洗文本后用字典组装 alpaca 格式最后写入 JSON。注意“input”字段这里是空的说明问题完整包含在 instruction 里。如果你的场景是“给定一段合同文本问其中某个条款的含义”可以把合同文本放进“input”问题放进 instruction模型会同时读取两个字段。LlamaFactory 在训练时会把 instruction 和 input 拼接后送入模型这种拆分方式有助于模型区分参考资料和问题减少上下文混淆。3.3 chat 模板与 system prompt 设计让模型学会角色切换的关键细节Qwen2.5 的训练模板和推理模板必须一致。 LlamaFactory 在训练时读取数据后会按模型预设的 chat template 拼成完整对话序列。alpaca 数据里的 instruction、input 和 output 会被映射成一轮 user 和 assistant 的对话。如果你在数据中写了 system 内容则拼接顺序是 system、user、assistant这与 Qwen2.5 在预训练阶段的格式保持一致。实际构造训练数据时我建议在法律和医疗样本里都用统一的中文角色前缀例如法律问答统一以“你是法律助理请依据民法典相关规定回答”开头医疗抽取统一以“你是病案科编码员请从文本中抽取诊断字段”开头。这样做的目的是让模型在推理时通过同一个前缀进入对应角色避免两个任务的 adapter 互相干扰。数据量较小时模型对前缀的敏感度很高前缀如果混乱生成质量会明显下降。构造完数据后先用 LlamaFactory 的数据检查功能跑一遍它会打印每条样本经过 chat template 展开后的 token 数量分布。重点关注超长样本和空输出两类问题超长样本可以在训练时被截断但如果截断刚好把答案切掉模型学到的就是残缺目标这种样本应该提前删除。4. 用 LlamaFactory 跑通 Qwen2.5 微调从 WebUI 到命令行4.1 环境准备与模型下载显卡驱动、CUDA 版本和依赖安装微调 Qwen2.5 的硬件最低门槛是单张 24G 显存显卡比如 RTX 3090、4090 或 A5000。显存小于 24G 也不是完全不能跑可以开启 QLoRA也就是把基座模型量化为 4bit 再做 LoRA 训练显存需求能降到 12GB 左右代价是训练速度变慢效果略微下降。操作系统推荐 Ubuntu 20.04 及以上Windows 也可以跑但驱动和 CUDA 版本更容易出问题。环境安装建议按以下顺序操作# 1. 安装 CUDA 驱动与 PyTorch注意版本匹配 nvidia-smi conda create -n llama_factory python3.10 -y conda activate llama_factory pip install torch2.3.0 torchvision0.18.0 --index-url https://download.pytorch.org/whl/cu121 # 2. 安装 LlamaFactory 及其依赖 git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e . # 3. 下载 Qwen2.5-7B 模型权重放到本地目录 huggingface-cli download Qwen/Qwen2.5-7B-Instruct --local-dir ./models/Qwen2.5-7B-InstructPyTorch 版本与 CUDA 版本必须匹配否则模型加载时会出现算子在 GPU 上不可用的错误。LlamaFactory 的依赖中包含 transformers、peft、accelerate 等组件pip install -e . 会把这些依赖统一装好。模型权重建议放在项目目录下的 models 文件夹里方便 LlamaFactory 配置文件引用。4.2 WebUI 方式零代码跑通 LoRA 微调的页面配置与参数含义第一次接触 LlamaFactory 的人可以先从 WebUI 入手。启动命令很简单CUDA_VISIBLE_DEVICES0 llamafactory-cli webui浏览器打开页面后可以看到一个完整的微调配置界面需要注意几个关键字段。模型名称选择 Qwen2.5-7B-Instruct模型路径填本地权重目录微调方法选择 LoRA。LoRA 的 rank 参数表示低秩矩阵的维度rank 越大可学习的参数量越多但显存占用也越高7B 模型建议从 64 开始试。学习率一般设 2e-4 到 5e-4 之间太大容易训崩太小则效果不明显。数据集选择要特别注意LlamaFactory 不会自动扫描你硬盘上的所有 JSON 文件需要在 dataset_info.json 里预先登记数据集名称和文件路径。如果页面上选不到你的数据集大概率是这一步漏了。WebUI 页面上还有几个按钮分别对应模型预览、训练启动、模型评估和 Chat 测试。预览功能会在训练前把每个样本展开成模型实际能看到的 token 序列出现乱码或顺序错乱时能及时发现。4.3 命令行方式可复现、可批量跑实验的训练脚本WebUI 适合第一次体验真正要跑多组参数对比实验时命令行脚本更可靠。你可以把 LlamaFactory 的训练配置写进 YAML 文件每次只改动一个参数就能启动新一轮训练。下面是一个我常用的 LoRA 训练配置model_name_or_path: ./models/Qwen2.5-7B-Instruct template: qwen finetuning_type: lora lora_rank: 64 lora_alpha: 128 dataset_dir: ./data dataset: law_train.json val_size: 0.1 learning_rate: 2e-4 num_train_epochs: 3.0 lr_scheduler_type: cosine warmup_ratio: 0.1 per_device_train_batch_size: 4 per_device_eval_batch_size: 4 gradient_accumulation_steps: 4 gradient_checkpointing: true logging_steps: 50 save_steps: 500 eval_steps: 250 evaluation_strategy: steps output_dir: ./output/law_lora_qwen7b启动命令llamafactory-cli train configs/train_law.yaml逐项说明一下关键参数。lora_alpha 是 LoRA 的缩放因子一般设成 rank 的 1 到 2 倍alpha 过大会导致微调后的模型输出波动。val_size 表示从训练集中切出 10% 作为验证集每训练 250 步评估一次。gradient_accumulation_steps4 配合 batch_size4等效 batch size 为 16这个规模对 7B LoRA 训练是合理的。gradient_checkpointing 开启后会减少显存占用但训练速度会有轻微下降。训练完成后LlamaFactory 会在 output_dir 中保存 LoRA adapter 权重包括 adapter_config.json 和 adapter_model.safetensors。此时模型还不能直接部署需要把 adapter 与基座模型合并或者用支持 LoRA 的推理框架加载。合并导出操作通常放在评估和部署环节见最后一章。5. 微调避坑手册显存、损失、过拟合与幻觉的四个典型翻车现场5.1 CUDA out of memory24G 卡为什么连 7B 都跑不满现象训练刚开始几分钟就报 torch.cuda.OutOfMemoryError进程直接退出之前跑的几个 epoch 白费。原因最常见的有三种情况。第一LoRA 训练开了过大的 per_device_train_batch_size虽然 LoRA 本身的可训练参数少但激活值仍然占据大量显存。第二max_length 设得过大例如数据里有大量超长样本框架把所有样本都按最长长度补零导致单 batch 显存爆炸。第三没有开启 gradient_checkpointing激活值全部驻留显存。解决先把 per_device_train_batch_size 降到 2同时设置 max_length 为 1024 或 2048超长样本直接截断。开启 gradient_checkpointing 并确认 output_dir 中能看到 checkpoint 文件这样即使中途崩了也能用 resume 参数续训。另外可以用 CUDA_VISIBLE_DEVICES 指定单卡避免框架把数据平均分配到多张卡上造成碎片化。5.2 训练损失不降或反复震荡数据问题比参数问题更常见现象loss 在 3 个 epoch 内从 2.1 降到 1.5 后就停在原地不动或者 loss 曲线呈锯齿状上下跳动。原因先检查数据集是否有标签噪声。法律数据里答案抄错法条数字、医疗数据里诊断字段抽错值都会让模型无所适从。其次是模板不一致部分样本写了 system prompt部分没写模型在自主学习两种角色时互相干扰。再就是学习率设置过高LoRA 训练时学习率超过 5e-4 很容易震荡。解决抽检 50 条训练样本逐条读一遍重点看答案是否完整、是否有截断。把 system prompt 统一写在数据构造脚本里而不是靠手工分散添加。学习率调回 2e-4 并增加 warmup 比例到 0.1。如果 loss 仍然不降检查 tokenizer 是否把特殊符号如“\n”“|im_start|”错误地当成了普通字符必要时用 LlamaFactory 的预览功能查看展开后的模板序列。5.3 验证集指标不错实际对话却一塌糊涂过拟合与数据重复的陷阱现象训练时评估集上的 loss 持续下降BLEU 和 ROUGE 分数都很好看但把模型接到对话环境里测试它反而唠叨重复、答非所问。原因这是在行业微调里最容易翻车的场景。第一训练数据量太小而 LoRA rank 又设置得高模型把训练样本背了下来泛化能力差。第二数据集中重复样本太多尤其法律文书的套话部分在转换后被多次复制构造出相似样本模型学到的是高频套话而不是推理逻辑。第三评估集与训练集来自同一批数据源评估分数虚高。解决把 LoRA rank 从 128 降到 32 或 64迫使模型学习更抽象的模式。对训练数据做去重至少保证相似度超过 0.9 的样本只保留一条。评估方式改为人工抽查加一组完全独立的测试集测试集数据来自不同年份或不同科室确保模型看到的是没见过的文本。5.4 微调后模型在通用任务上能力回退灾难性遗忘的处理经验现象法律问答效果确实提升了但让模型写一段新闻摘要它的输出明显变差甚至出现重复的行业术语。原因LoRA 干扰了基座模型的通用知识表征。训练轮数过多、学习率过大或者低秩矩阵参数设置得过高都会让 adapter 对模型内部表征影响过度削弱原本的通用语言能力。解决控制训练轮数7B 模型通常 1 到 3 个 epoch 就足够不要盲目追求多 epoch。推理时使用多 adapter 管理法律任务加载法律 adapter通用任务不加载任何 adapter。LlamaFactory 和 vLLM 都支持运行时切换 adapter这比每个任务单独合并一个完整模型更省空间。如果已有模型能力回退严重唯一的后悔药是回到基座模型重新训练保留训练日志和最佳 checkpoint 是好习惯。5.5 模型输出长但内容空洞生成参数与训练目标不匹配现象微调后的模型回答一篇长篇大论但关键信息缺失法律场景漏掉适用法条医疗场景漏掉并发症。原因训练时用的是 val_size 切分的数据模型在训练阶段看到的答案普遍短小精悍但推理时生成的温度参数设得过高模型在词汇间随机跳跃扩散了注意力。另一个原因是 max_length 设置不一致训练阶段截断了长答案模型没有学习过输出完整长段落的能力。解决先调推理参数temperature 降到 0.2~0.5top_p 设 0.8减少随机性。再检查训练数据的答案长度分布如果真实场景需要模型输出 300 字左右的答案而训练数据里 90% 的答案只有 50 字那模型自然学不会展开。补充一些长答案样本重新微调一轮即可。6. 微调后的验证与部署技巧让模型真正跑到法律与医疗业务里6.1 用独立测试集做效果验证别只看 loss模型训练完先不要急着合并权重先执行 LlamaFactory 的评估命令llamafactory-cli eval \ --model_name_or_path ./models/Qwen2.5-7B-Instruct \ --adapter_name_or_path ./output/law_lora_qwen7b \ --eval_dataset law_test.json \ --metrics rouge bleu评估结果只能作为参考真正的验收标准是业务方的人工评测。法律场景建议准备 50 个真实合同问题和 50 个法条引用问题医疗场景准备 50 份脱敏病历和对应的结构化标准答案。让标注人员按答案完整性、相关性和事实准确性三个维度打分完成打分后再决定是否合并导出。6.2 合并 LoRA 权重并导出为 GGUF降低部署门槛LoRA adapter 不能直接对外提供服务常见做法是先合并回基座模型再导出为推理框架需要的格式。合并操作一条命令完成llamafactory-cli export \ --model_name_or_path ./models/Qwen2.5-7B-Instruct \ --adapter_name_or_path ./output/law_lora_qwen7b \ --export_dir ./output/law_qwen7b_full \ --export_size 4 \ --export_legacy_format false导出后的模型是完整的 7B 权重可以用 transformers 或 vLLM 加载。如果部署环境是 CPU 或低配 GPU可以把模型量化成 GGUF 格式并放进 Ollama 环境提供服务。需要注意GGUF 量化后模型效果会有轻微损失建议先测精度再决定量化等级。6.3 一个很实用的线上技巧温度参数与上下文窗口配合使用部署完成后我把推理参数统一配置为 temperature0.3、top_p0.8、max_tokens1024这套参数在法律与医疗场景的可控性和效果之间比较平衡。业务中还有一个容易被忽略的细节把长文本问题和短问题分开处理短问题让模型直接回答长文本问题则先把首尾部内容截断再送入模型避免超出上下文窗口后产生内容截断。我自己的习惯是在每次微调训练后跑完这份流程再交付独立测试集评测、人工抽检 30 条、对比微调前后在 50 条通用样本上的效果。这几十条通用样本就像一道安全网能第一时间暴露灾难性遗忘比事后发现再回滚省事得多。希望这些踩坑经验能帮你在法律与医疗领域的大模型微调上少走弯路。本文还有配套的精品资源点击获取