ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

大模型微调全流程:数据准备、LoRA训练与部署

大模型微调全流程:数据准备、LoRA训练与部署 大模型微调简单说就是把一个什么都能聊几句的通用大模型通过特定数据继续训练改造成某个领域或某类任务的专用工具。比如让通义千问、Llama 这类模型学会回答客服话术、按照固定格式写周报、批量抽取合同里的关键信息。这里说的“专用”不是只改提示词而是真正改变模型在某类任务上的参数权重和行为习惯。这类实操文章最适合两类人看一类是刚接触大模型应用开发想知道本地模型差距在哪、微调到底怎么入口的开发者另一类是已经在用提示词工程但发现效果达不到要求想判断要不要上微调的团队。看完至少要搞清楚一件事微调不是改几行配置的“玄学”而是一条从数据准备、参数选择、训练验证到部署评估的完整链路。下面按实际落地顺序拆一遍。1. 先判断该不该微调提示词、RAG 和微调的边界在哪里先说一个很容易绕进去的问题。很多人拿通用模型做垂直场景效果不对就急着微调。结果把数据准备了一堆训练也跑完了最后发现项目不收敛、过拟合严重甚至比原来直接问模型还差。这不是工具不行是决策顺序错了。投入微调之前必须把提示词工程、RAG检索增强生成和微调这三者放在一条线上对比先做便宜的方案再决定要不要做贵的方案。1.1 三种技术路线怎么选提示词工程是最轻的一层。它不改变模型权重只是在每次请求时把任务描述、示例、约束条件通过上下文告诉模型。适合任务规则清晰、输入输出格式稳定、上下文不超过模型窗口限制的场景。比如让模型做翻译、写文案初稿、判断一段评论的情感倾向提示词工程基本够用。问题也很明显如果任务内部有一套固定业务逻辑比如制造业的质量缺陷分类规则每次都靠提示词写会很长而且模型容易忘记前面的约束。RAG 解决的是“模型不知道某种知识”的问题。比如企业内部文档、产品手册、最近三天的新增政策条文这些内容不在模型训练数据里也不能靠提示词无限塞。RAG 的做法是先把知识文档切片、向量化然后检索出与问题相关的内容再拼进提示词交给模型生成。它的优点是知识可更新、不需要训练、成本低缺点是检索如果不准模型就会用错误上下文硬答输出看起来流畅但内容不对。RAG 适合知识密集、事实性强的任务。微调是改变模型本身的行为模式。它用大量“输入-期望输出”对继续训练模型让模型在特定任务上的风格、格式、判断逻辑发生持久变化。适合三类场景第一输出格式要求极其严格比如必须输出 JSON 且字段名完全固定第二任务带有特定语气、术语和内部规范比如法律文书摘要、医疗报告初拟、游戏 NPC 对白第三基座模型在目标任务上即使给了提示词和示例也频繁出错。微调速成本高但它换来的是稳定性和可脱离长提示词运行的能力。热词里反复出现的“ai人工智能客服”就是典型的提示词工程、RAG、微调三者边界模糊的例子。我建议按顺序试先用提示词再加 RAG还不够再微调。不要一上来就跳到最重的那步。1.2 什么情况下微调也救不了微调不是万能药。数据质量差比如答案互相矛盾、标签错乱、格式不统一微调只会把错误模式学得更深。任务本身需要外部实时信息比如查天气、看股价、查数据库这种应该走工具调用或 RAG而不是微调。输入输出涉及隐私、权限、合规审核微调训练数据一旦泄漏风险远大于收益。另外还有一种常见误区以为微调能让模型“学会新知识”。微调更适合改变表达方式、输出结构、任务规则不适合灌入大量事实知识。要补充事实优先 RAG要改变模型怎么答才轮到微调。如果项目只是希望模型更听话偶尔回答不稳定先别急着训练。先把提示词里的示例改成“输入错误时怎么回复”这类负样本往往比微调更划算。2. 微调前的环境准备训练资源、模型基座和工具链决定微调之后第一个实际问题不是写代码而是确认手里的机器能跑什么。大模型微调需要显存和内存支撑但不同微调方式要求差异很大。理解这些差异才知道为什么“别人能跑我跑不动”以及怎么用更轻的方案达到效果。2.1 全量微调、Freeze 微调和 LoRA 微调的资源差异大模型训练时模型权重会参与梯度更新。全量微调Full Fine-tuning意思是模型所有参数都更新。这种方式效果上限最高但需要非常大的显存因为优化器状态、梯度、激活值都要占用显存。以 7B 模型为例全量微调通常需要 40GB 以上显存很多人手里的消费级显卡根本跑不动。7B 模型全量微调还要考虑优化器状态像 AdamW 优化器会为每个参数保存额外状态显存占用会明显高于纯模型权重这也是全量微调门槛高的核心原因。Freeze 微调的做法是先冻结大部分模型层只训练靠近输出的部分参数。这种方式显存占用比全量低很多适合资源有限、但希望比 LoRA 更强的情况。问题是它只更新部分参数模型在任务上的适应能力受限而且如果冻结层选择不对效果提升不明显。LoRALow-Rank Adaptation低秩适配是目前最流行的轻量微调方式。它的思路是不直接更新原始权重而是在模型每一层旁边插入一个低秩矩阵训练时只更新这些新增的小矩阵。LoRA 把所有可训练参数压缩到极小规模显存占用大幅下降。一个 7B 模型在普通 24GB 显存显卡上用 LoRA 微调基本可以跑起来。这意味着个人开发者和中小团队也能在消费级硬件上做微调实验。LoRA 的效果通常接近全量微调且训练产出物是单个适配器文件部署和切换都方便。它的劣势是如果任务与原模型行为差异太大低秩更新可能不够用需要调秩或增加可训练层数。2.2 从哪个模型基座入手基座选择直接决定微调效率和效果。现阶段开源社区使用率较高的基座包括 Qwen 系列、LLaMA 系列、GLM 系列等。热词里反复出现“qwen”“千问大模型本地部署”“glm大模型官网”说明国内开发者的关注度确实集中在这几个系列上。选择基座时不要只比较排行榜分数要看这三点任务匹配度目标任务是中文为主就不要选中文能力薄弱的模型任务包含代码就优先看代码能力任务需要多轮对话就检查模型对长上下文的支持。生态资料基座的微调教程、量化版本、推理框架适配程度决定了你踩坑的概率。生态越丰富解决问题越容易。可部署性模型权重下载渠道是否稳定推理框架是否支持是否方便做 API 封装这些比单次效果高低重要得多。如果是第一次实操建议直接从 7B 级别、中文能力稳定的开源模型开始比如 Qwen 系列。7B 模型在消费级显卡上既能用 LoRA 微调也能在普通服务器上做推理部署资源要求刚好卡在“个人可承担”和“批量任务可用”之间。13B 以上模型效果更强但训练和推理成本也会翻倍不建议作为初学起点。2.3 工具链怎么选LlamaFactory 是当前最顺手的入口微调工具链经历了从脚本拼装到平台化的发展。早期的做法是用 Transformers 库写训练脚本需要自己处理数据集加载、梯度累积、日志、Checkpoint 保存这些细节对新手不友好。后来社区出现了一批封装工具目前热度最高、文档也比较齐全的是 LlamaFactory。这个工具把数据格式、参数配置、训练过程和推理验证都做了标准化支持 LoRA、Freeze、全量微调等多种模式也兼容 Transformers 和 vLLM 等推理后端。LlamaFactory 适合大多数场景因为它把“数据准备—训练配置—模型导出—推理测试”串成了一条线。在 WebUI 模式下基本只需要准备数据集、选择基座、填参数然后就能看到训练 Loss 曲线和进度条。即便不打算长期用它把它当作学习微调流程的入门环境也完全合理。真正熟悉以后再根据业务需要迁移到更底层的训练方式也不会浪费时间。环境准备上常见的组合是 Python 3.10、CUDA 对应版本的 PyTorch、Transformers、peft、accelerate、deepspeed 这些依赖。热词里提到的“vllm部署大模型”“ollama部署私有大模型”属于训练完成后的推理部署环节如果只是学习微调先把训练链路跑通再考虑部署链路。3. 实操拆解用 LoRA 完成一次可复现的微调环境确认后下面进入具体流程。这里以 LlamaFactory Qwen 系列 7B 模型为例说明从数据集准备到训练运行的全过程。如果你不是这个组合也可以用同样的逻辑核对其他工具。3.1 准备高质量数据集微调的数据格式比数量重要。以指令微调为例最常见的数据组织方式是三种字段instruction指令、input输入、output期望输出。instruction 告诉模型要做什么input 是具体任务内容output 是标准答案。如果任务是多轮对话则采用 conversations 格式按用户和助手轮流组织消息。数据量没有严格下限但一般建议单任务至少上千条高质量样本。数据量很少时LoRA 只能做风格调整很难稳定学会复杂规则。数据量太大但质量差模型会把错误重复的模式学到更深处。实际操作中我建议先准备两批数据第一批是“核心边界样例”数量不大但覆盖最容易出错的输入变体第二批是“常规任务样例”让模型在正常输入上保持稳定。两批合并后再看类别分布确保每个常见分支都有足够样本。数据集切分时一定要留出验证集。很多人只把全部数据丢进去训练结果 Loss 看起来很低一测试就崩。原因是模型已经记住训练数据没有见过的新输入根本不会泛化。建议按 8:2 或 9:1 切分训练集和验证集训练过程里关注验证 Loss 是否同步下降。验证集的数据不能和训练集重复否则看到的 Loss 是虚低的。3.2 LlamaFactory 的数据集注册方式LlamaFactory 默认要求把数据集文件放到 data 目录并在 dataset_info.json 里注册。注册信息包括文件路径、格式类型、是否包含验证集等。如果是 CSV 或 JSON 文件配置里需要写明对应的列名映射。以下是一个 dataset_info.json 的示例片段{ custom_sft: { file_name: custom_sft.json, formatting: sharegpt, columns: { prompt: instruction, query: input, response: output } } }这里的 key 是数据集名称训练配置里填 dataset 参数时要用这个 key 而不是文件名。很多报错都出在这一步数据集名称写错、列名对不上、JSON 文件编码异常。第一次跑的时候看到“Dataset not found”或字段映射错误先回头检查注册配置。3.3 训练参数怎么填从保守到激进训练一开始不要开最大并发也不要把学习率调到异常值。首批参数应该偏保守先验证数据链路是否正常。以 LoRA 微调 7B 模型为例可以参考以下初始配置学习率2e-4 到 5e-4 之间训练轮数3 到 5 轮LoRA 秩8 到 16LoRA 作用模块q_proj、v_proj后续可以扩展到其他模块批次大小依据显存调整显存小就减小批次开启梯度累积最大序列长度512 或 1024先不要开超过 2048混合精度bf16如果你的显卡支持否则用 fp16这个参数不是标准答案但适合作为第一次验证。跑通后观察两个指标训练 Loss 是否持续下降、验证 Loss 是否同步下降。如果验证 Loss 在某个轮次开始回升说明模型开始过拟合可以降低训练轮数或增大数据量。显存不够时优先尝试减小批次大小而不是关掉梯度累积。例如显存只有 16GB可以把批次数设为 1再开梯度累积 4 步等效批次约等于 4。这样能保住 LoRA 训练的稳定性也避免 OOM。3.4 训练流程和导出LlamaFactory 训练入口有两种命令行和 WebUI。命令行适合脚本化和批量实验WebUI 适合第一次试跑。WebUI 的布局很直观填好模型名称、数据集、微调方式、训练参数后点击开始即可。训练过程中注意观察 Log 窗口里的 Loss 输出第一次跑最重要的不是追求最低 Loss而是确认所有环节都走得通。训练结束后的模型输出默认是一个包含 LoRA 适配器权重的目录。正式使用时需要把它和基座模型合并再导出完整模型。LlamaFactory 的导出页面可以完成合并操作导出后再用推理脚本验证避免出现“训练完成但导出后行为不变”的情况。4. 微调后怎么验证不要只看 Loss 曲线微调完成不代表任务结束。真正决定模型能否上线的是评估环节。这里最常犯的错误是只看训练集上的 Loss或者只看几个手工案例。正确的做法是建立一个与训练数据没有重叠的评测集合用统一标准判断模型输出是否符合预期。4.1 单条验证与批量评测单条验证的目的是快速发现问题。你可以从验证集里挑几条典型样例输入给微调后的模型看输出格式、内容合规性、是否包含幻觉。这里最值得注意的一点是微调后模型的输出风格可能变得非常固化如果训练数据里没有“不知道”这类拒答样本模型可能会硬答所有问题。所以准备数据时最好给每个典型输入补充几个“超出范围时该如何回答”的负样本。批量评测则需要一个评分脚本。最简单的做法是将验证集里每个输入都跑一遍推理然后计算输出和标准答案的字面相似度、字段完整度、格式通过率。这听起来简单但实际执行时要注意超时、显存占用和输出长度限制。批量评测时不要直接开很大的并发建议先跑 50 条记录耗时和异常数量再扩大到全量。这一步能提前发现并发过大会导致显存溢出或推理速度雪崩的问题。4.2 判断过拟合和欠拟合微调结果不佳通常分两种。过拟合的典型表现是训练 Loss 很低但验证集输出偏差大模型只会“背答案”不会“做题”。对策是降低训练轮数、增加数据多样性、提高 LoRA 秩或加入正则化。欠拟合的典型表现是训练 Loss 和验证 Loss 都降不下去模型经过微调后输出变化很小这往往是因为学习率太低、训练轮数不足或者 LoRA 的秩太小更新容量不够。还有一种情况是模型虽然学到任务形式但输出内容存在幻觉比如在不知道答案时编造专有名词或数字。这通常和数据质量有关训练数据里若缺少“未知时如何表达”的引导模型就只能凭模型先验猜测。对付幻觉我建议在数据集中专门加入少量“无法判断时请输出特定占位文案”的样例比在提示词里反复强调更有效。5. 微调之后的部署和调用从训练产物到可服务接口训练产出的模型不能直接丢给业务使用必须经过部署和接口封装。这里涉及两个问题模型格式怎么处理和推理服务的接口怎么写。5.1 用 vLLM 部署导出后的模型如果对性能要求较高比如需要支持大量并发请求、希望吞吐高推荐使用 vLLM 这类推理框架。vLLM 的优势是支持连续的批处理调度、PagedAttention 等优化能明显提升吞吐。流程上先在 LlamaFactory 里合并 LoRA 适配器和基座模型导出完整模型目录。然后通过 vLLM 启动一个 OpenAI 风格的服务接口。启动 vLLM 服务时几个常用参数如下model模型目录路径tensor-parallel-size使用多少张显卡并行推理显存足够时设置为 1gpu-memory-utilization控制显存占用上限例如 0.9max-model-len最大输入输出长度根据实际任务设置port服务监听端口如果更习惯轻量部署也可以使用 Ollama 加载 GGUF 量化格式的模型。这类方式适合本地单机演示和开发调试资源占用更低但高并发性能不如专用推理框架。热词里反复出现的“ollama 部署私有模型”“本地部署大模型”本质上是在讨论用更轻的方式把微调结果跑起来两者互为补充不冲突。5.2 接口请求格式和稳定性保障vLLM 部署完成后客户端通过 HTTP 接口发起请求。基本的请求格式如下{ model: your-model-name, messages: [ {role: user, content: 请把这段合同里的甲方名称、金额提取成 JSON} ], max_tokens: 512, temperature: 0.1 }微调后模型通常倾向于确定性输出因此推理阶段温度不宜设高。如果任务要求严格 JSON 输出设置较低温度和固定提示词模板会明显更稳定。大规模调用时也要给客户端加上超时和重试逻辑。超时设置取决于任务长度和显卡负载单条短任务一般 10 到 30 秒长文本任务可以放宽到 60 秒甚至更长。不要一上来就设置无限超时任务卡住时很难定位是模型问题还是排队问题。6. 踩坑记录大模型微调中最常出问题的五个节点下面这些坑基本是每个跑过微调的人都会遇到的。列出来不是为了重复强调而是想给你提供一条排查路径。报错出现时按下述顺序排查能省下大量时间。6.1 数据格式错误最常见的隐性失败LlamaFactory 对数据格式有明确要求但报错不一定会立刻暴露。常见情况是数据集注册时列名写错训练能启动但训练过程中模型学到一堆乱数据Loss 下降后又反弹。另一种是 JSON 文件里有中文引号、全角逗号或 BOM 编码解析时不会报错但内容被截断。第一次训练前务必用小样本先跑几步同时打开日志人工检查样本是否被正确截断。6.2 显存溢出和梯度问题OOMOut of Memory是训练环节最常见的错误。遇到 OOM 时先确认是哪一个阶段溢出数据加载、前向计算、反向传播还是优化器更新。前向溢出可以尝试降低批次大小、降低最大序列长度反向传播溢出可以考虑开启梯度检查点优化器状态溢出则要考虑是否必须全量微调或者切换到 LoRA。不要每次 OOM 都只减小批次还要检查混合精度设置和显存碎片。6.3 LoRA 权重没有合并很多人训练完 LoRA 后直接拿 Adapter 目录做推理发现模型输出和基座模型完全一样。这是因为 LoRA 权重还没有合并到模型权重里。训练产物只是增量适配器加载时需要指定 base_model 和 adapter 目录或者先导出合并模型。LlamaFactory 提供了导出功能记得在验证前完成合并。6.4 推理阶段没关闭训练模式微调完的模型如果还在训练模式下前向传播计算图会保留推理速度极慢且极度消耗显存。部署时需要调用 model.eval() 或等价的推理接口关闭 dropout 和计算图记录。这个错误在代码里经常被忽略因为输出结果没有变化但显存占用和延迟异常。6.5 验证集和训练集重叠验证 Loss 看起来很低但上线效果很差很多时候是因为验证集里包含了训练数据模型只是“回忆”出了答案而非泛化。准备数据时应首先做去重确保同一输入不会同时出现在训练集和验证集中。如果数据量充足可以考虑多次随机切分并记录验证分数波动。7. 进阶思路多个 LoRA、任务合并和量化部署如果微调不只有一个任务或者希望同一个模型服务多个业务线下面几个思路能帮你把工作量降下来。7.1 多 LoRA 场景LoRA 天然适合多任务组合。训练时为目标任务各自准备独立适配器推理时再动态加载对应 LoRA。这样不需要为每个任务单独部署一个大模型只需保留一份基座模型和多个轻量适配器文件。这种做法的好处是迭代成本低修改某个任务的数据只要重新训练对应 LoRA不会影响其他任务。但要注意统一输入输出风格尽量避免任务间冲突的指令文本。如果任务之间的格式差异过大可以考虑把多个任务的混合数据放进同一个 LoRA 训练让模型学会识别不同指令并切换输出格式。7.2 量化部署减少资源占用模型权重可以用 GPTQ、AWQ 或 GGUF 格式做量化。量化后模型体积和显存占用都会下降适合部署到资源受限的服务器或本地电脑。量化的代价是推理精度会有一定损失LoRA 权重与量化后基座模型合并时也可能出现精度偏移。建议的做法是先用 FP16/BF16 模型做效果验证确认能够满足业务需求后再做量化。量化后的模型如果输出质量下降明显需要退回到半精度部署或者在量化数据集里加入目标任务的样例。7.3 和 RAG 结合的组合方案微调和 RAG 并不是互斥的。微调让模型学会“怎么答”RAG 负责提供“答什么”。例如企业客服机器人可以用微调让模型掌握礼貌话术、工单格式和问题分类规则再用 RAG 从知识库中检索产品售后信息。组合方式要求微调模型具备对检索内容的高度依赖避免模型忽略检索到的上下文直接凭训练记忆作答。验证组合效果时至少需要三类测试集纯检索命中场景、检索结果为空或质量很低的场景、检索结果与模型训练知识冲突的场景。这整套流程走下来你会对“通用模型怎么变成专用工具”有一个完整的感知从业务判断、数据准备到选择微调方式、跑通训练链路再到部署验证和问题排查。它不像提示词工程那样几分钟能看到效果但一旦跑通模型在特定任务上的稳定性和可控性会提升一个层级。真正落地时最该盯住的不是功能列表而是数据格式、资源占用和验证集质量这三个基础节点。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进