垂直领域微调
通用大模型在开放域问答、创意写作等通用任务上表现优异,但在垂直领域(医疗、法律、金融、工业)中往往力不从心——专业术语理解偏差、领域知识陈旧、输出格式不符合行业规范。解决这些问题有两个方向:RAG 通过外部检索补充知识,微调(Fine-tuning)则直接改变模型的行为和知识分布。两者的适用场景不同,理解各自的边界是做对技术选型的前提。
微调与 RAG 的边界
RAG 适合知识密集型场景,需要频繁更新的知识库(如产品文档、新闻资讯),或者需要精确引用来源的场景(如法律条文、医疗指南)。RAG 的优势在于知识可追溯、更新成本低、不需要 GPU 训练资源。局限性在于检索质量决定了上限——如果检索不到相关文档,模型就无法给出正确答案,且长上下文中的信息可能被模型忽略。
微调适合需要改变模型行为的场景。典型的有三种:输出风格定制(如统一使用专业术语、特定的回答格式、特定的语气和角色)、领域知识内化(如医学诊断推理、法律条文适用、代码规范),以及任务能力增强(如提升特定任务的准确率、减少幻觉、增强多语言能力)。微调将知识写入模型权重,推理时无需检索,延迟更低,但知识更新需要重新训练,且无法精确追溯信息来源。
实际工程中,微调和 RAG 经常组合使用:先用领域数据微调模型,让它掌握领域语言和推理模式,再用 RAG 补充最新的、具体的知识。微调解决"怎么说"和"怎么想"的问题,RAG 解决"知道什么"的问题。
训练数据准备
训练数据质量是微调效果的决定性因素,远比模型规模和训练时长重要。低质量数据的典型表现:指令模糊不清("解释一下"没有说明解释什么)、回答冗长啰嗦(模型学到了冗余的表述模式)、答案不准确(人工标注错误或从网上抓取的噪声数据)、格式不统一(有些用 Markdown,有些用纯文本,有些有引用,有些没有)。
指令微调(SFT, Supervised Fine-Tuning)的数据格式通常是 (instruction, input, output) 三元组。instruction 描述任务要求,input 是可选的上下文信息,output 是期望的模型输出。例如:
instruction: "根据患者的症状和检查结果,给出可能的诊断和推荐检查"
input: "患者,男性,45岁,反复上腹痛3个月,加重1周。查体:上腹压痛,无反跳痛。"
output: "可能的诊断:1. 胃溃疡... 2. 十二指肠溃疡... 推荐检查:胃镜、幽门螺杆菌检测..."数据构造有几种路径。人工构造质量最高但成本高,适合数据量需求小(几百到几千条)的场景。从现有文档提取:将领域文档(手册、论文、内部知识库)转换为问答对,可以用 LLM 辅助生成初始问答对,再由领域专家审核修改。开源数据集复用:Alpaca、ShareGPT、MOSS 等开源指令数据集可以作为基础,再混入领域数据做混合训练。合成数据:用更强的模型(GPT-4o、Claude)生成领域问答对,成本低于人工标注但需要质量控制(过滤低质量样本)。
数据清洗是容易被忽视但至关重要的步骤。去重(相似的指令-回答对保留一条)、格式统一(全部使用相同的 Markdown 结构)、长度过滤(删除过短或过长的样本)、质量过滤(用 LLM 给每条数据打分,低于阈值的剔除)。训练数据中应该包含一定比例的"拒绝回答"样本——当问题超出模型能力范围或涉及敏感内容时,模型应该学会说"我不知道"而非编造答案。
训练策略
LoRA(Low-Rank Adaptation)是目前最主流的参数高效微调方法。它冻结基础模型的全部参数,在每个 Transformer 层的注意力权重旁添加两个低秩矩阵 A 和 B,前向传播时
QLoRA 将基础模型量化到 4bit(NF4 数据类型),在量化权重上训练 LoRA。通过双重量化(对量化常数再量化)和分页优化器(优化器状态按需换入换出显存),QLoRA 可以在单张 48GB 显存的 A6000 上微调 65B 模型。QLoRA 的精度与全精度 LoRA 几乎相当,是消费级 GPU 微调大模型的标准方案。
DPO(Direct Preference Optimization)是 RLHF 的简化替代。RLHF 需要训练奖励模型,流程复杂且不稳定;DPO 直接用偏好数据(对同一问题的一个好回答和一个差回答)训练,隐式学习人类偏好。DPO 的数据格式是 (prompt, chosen, rejected),训练目标是增大模型输出 chosen 的概率、减小 rejected 的概率。对于需要控制输出风格和安全性的场景,DPO 比 SFT 更有效。
训练框架方面,Hugging Face PEFT 库提供了 LoRA/QLoRA 的统一接口,配合 Transformers 和 Accelerate 可以灵活控制训练流程。LLaMA-Factory 提供了 Web UI 和丰富的预设配置,支持 SFT、DPO、全量微调等多种训练任务,对新手友好。Axolotl 通过 YAML 配置文件定义训练参数,适合需要精细控制的场景。
领域实践
医疗领域的微调需要极高的准确性要求,因为错误答案可能影响临床决策。数据构造需要医生参与审核,确保诊断逻辑和用药建议的准确性。训练数据中应该包含鉴别诊断(列出可能的疾病并分析概率)、检查建议、用药禁忌等专业推理过程,而非简单的结论式回答。模型微调后必须在盲测集上由临床医生评估,仅靠自动指标(BLEU、ROUGE)无法衡量医学回答的质量。
代码领域的微调目标是让模型更好地遵循代码规范、理解项目上下文。训练数据通常是 (代码问题描述, 代码实现) 对,来源包括 GitHub 的 commit message 与代码变更、LeetCode 题解、CodeLlama 等开源数据集。微调后的模型在代码补全、bug 修复、代码解释等任务上显著优于通用模型。需要注意训练数据中不应包含有安全漏洞的代码,否则模型可能学习到不安全的编码模式。
金融领域关注数据解读能力——模型需要理解财报、市场数据、监管文件中的专业表述,并给出结构化的分析。训练数据应覆盖多类金融文档(年报、招股书、研究报告),并要求模型输出包含数据引用(如"根据年报第 X 页"),增强可验证性。
评估与迭代
微调后的评估应该从多个维度进行。自动指标(BLEU、ROUGE、BERTScore)可以快速筛选,但不能完全反映质量。领域准确率是最核心的指标——在领域测试集上统计回答的正确率,测试集不应与训练集有重叠。人工评估由领域专家打分,评估维度包括准确性、完整性、专业性和安全性,虽然成本高但最可靠。
迭代微调是常见的工作流:先用小规模数据(500-1000 条)做第一轮微调,评估效果找出薄弱环节,针对性地补充训练数据,再做第二轮微调。每轮迭代都应该在测试集上对比前后的指标变化,确认改进方向正确。如果某轮微调后指标下降,通常是训练数据引入了噪声或过拟合,需要回退数据并排查。
微调后的模型应该与 RAG 方案做 A/B 对比,确认微调确实带来了提升。在某些场景下,优化 RAG 的检索质量(更好的分块策略、更强的重排序模型)可能比微调的收益更大,且成本更低。微调是手段而非目的,技术选型应该以业务效果为导向。