1、微调数据 vs 预训练数据:核心差异
1.1、核心差异对比
| 维度 | 预训练数据 | 微调数据 |
|---|---|---|
| 规模 | 数万亿 tokens | 数千到数十万条 |
| 质量要求 | 中等,靠量取胜 | 极高,每条数据都影响模型行为 |
| 数据形态 | 无标注的纯文本 | 结构化的指令-回答对 / 偏好对 |
| 目标 | 学习语言知识和世界知识 | 激发 / 对齐特定能力与行为模式 |
| 核心挑战 | 规模与效率 | 质量、多样性与平衡性 |
核心原则:质量 >> 数量。LIMA 论文证明仅 1000 条精选数据即可显著提升模型表现,而低质量数据反而会让模型退
化。
2、微调数据的采集与构建
2.1、数据格式类型 — SFT 数据
1、单轮指令-回答对格式:
{
"instruction": "请解释量子纠缠的概念",
"input": "",
"output": "量子纠缠是指两个或多个粒子之间..."
}
2、多轮对话格式:
{
"conversations": [
{"role": "system", "content": "你是一位专业的物理学教授"},
{"role": "user", "content": "请解释量子纠缠"},
{"role": "assistant", "content": "量子纠缠是指..."},
{"role": "user", "content": "能举一个日常生活中的类比吗?"},
{"role": "assistant", "content": "可以想象一对手套..."}
]
}
2.2、数据格式类型 — 偏好数据 & 工具调用
1、偏好数据格式(用于 DPO/RLHF):
{
"prompt": "解释什么是机器学习",
"chosen": "机器学习是人工智能的一个分支,它让计算机能够...",
"rejected": "机器学习就是让电脑自己学习东西。简单来说..."
}
2、带工具调用的数据格式:
{
"conversations": [
{"role": "user", "content": "北京今天天气怎么样?"},
{"role": "assistant", "content": null,
"tool_calls": [{"name": "get_weather", "arguments": {"city": "北京"}}]},
{"role": "tool", "content": "{"temp": 22, "weather": "晴"}"},
{"role": "assistant", "content": "北京今天天气晴朗,气温22℃..."}
]
}
2.3、数据来源
1、人工标注(最高质量):由领域专家或专业标注员根据详细指南编写。成本每条约 $1-10。需制定详细标注规范、多标
注员交叉验证、设置质检环节。适用于核心能力数据、安全对齐数据、高风险领域数据。
2、基于强模型生成(性价比最高):用 GPT-4、Claude 等强模型生成训练数据。常用方法包括 Self-Instruct、Evol-
Instruct、直接批量生成。需注意后续质量过滤(通过率通常 60%-80%)、输出同质化问题、模型使用条款限制。
3、开源数据集整合:通用型(OpenAssistant、ShareGPT、Alpaca、FLAN Collection、UltraChat)、代码类(
CodeAlpaca、Magicoder-OSS-Instruct)、数学类(MetaMathQA、GSM8K-augmented)、中文类(BELLE、
Firefly、MOSS-SFT、InfinityInstruct)。整合时需统一格式、去重、质量筛选、检查许可证。
4、从真实用户交互中提取:收集模型上线后的真实用户对话(需用户同意),筛选高质量交互并脱敏。最贴近真实使用场
景。ShareGPT 数据集是这一思路的代表。
5、从已有文档/知识库转化:针对企业场景,将内部文档、FAQ、知识库用大模型转化为多样化的问答对。适合构建领域
特定的微调数据。
2.4、数据规模参考
| 微调目标 | 典型数据量 | 说明 |
|---|---|---|
| 轻量对齐 | 1K–10K 条 | 质量极高即见效 |
| 特定任务微调 | 5K–50K 条 | 如摘要 / 翻译 / 分类 |
| 领域适配 | 10K–100K 条 | 如医学 / 法律 / 金融问答 |
| 全面能力微调 | 100K–1M 条 | 多任务混合,如 LLaMA-2-Chat |
| 偏好对齐 DPO / RLHF | 10K–200K 对 | 需要 chosen / rejected 对 |
3、微调数据的清洗与质量控制
3.1、格式校验
3.1.1、必检项目
微调数据有严格的格式要求,格式错误会直接导致训练失败或效果异常。
1、JSON 格式完整性:所有字段是否存在、类型是否正确
2、角色交替合法性:user/assistant 是否严格交替出现
3、空值检测:instruction 或 output 是否为空或仅含空白字符
4、特殊 token 冲突:数据内容中是否意外包含模型的特殊 token
5、编码问题:是否存在乱码、非法 Unicode 字符
6、长度合规:是否超出模型的上下文窗口长度
3.1.2、常见格式问题
| 问题 | 影响 | 解决方案 |
|---|---|---|
| 输出以套话开头 | 无意义开场白 | 正则匹配 + 裁剪 |
| 多轮对话中 assistant 连续出现 | 训练 loss 异常 | 校验角色交替 |
| 包含 markdown 乱码或截断 | 输出格式混乱 | 渲染检查 + 修复 |
| system prompt 不一致 | 模型行为不稳定 | 统一或按策略分组 |
3.2、内容质量过滤
3.2.1、回答质量评估
微调数据的质量过滤比预训练更注重语义层面。
1、正确性:回答是否包含事实错误。有标准答案的任务可程序化验证;开放问题可用强模型做Judge 打分。
2、完整性:是否充分回答了指令中的所有要求,检测指令中的多个子问题是否都被覆盖。
3、相关性:回答是否紧扣指令,没有离题。
4、有害性:是否包含有害、偏见或不当内容。
5、格式规范:回答的格式是否符合预期(如要求 JSON 输出时是否真的是合法 JSON)。
3.2.2、LLM-as-Judge
基于大模型的质量评估(LLM-as-Judge)是微调数据质量控制中最常用的方法。
评估维度:
1、指令遵循度(1-5):回答是否严格按照指令要求执行
2、准确性(1-5):信息是否正确无误
3、详细程度(1-5):回答的深度和细节是否恰当
4、表达质量(1-5):语言是否流畅、逻辑是否清晰
5、安全性(通过/不通过):是否包含不当内容
综合评分 < 3 的数据建议移除,注意:使用多个评估维度;考虑多个 Judge 模型交叉验证;LLM Judge 对长度有偏好;建议对 5%-10% 的数据进行人工抽检
3.2、去重
1、指令去重(最重要):完全相同的指令用精确字符串匹配去除。语义相似的指令用 embedding 模型(如 BGE、E5)计算相似度,余弦相似度 > 0.85-0.90
的视为近似重复,保留回答质量更高的那条。
2、回答去重:不同指令但回答高度相似,说明模型/标注员在套用模板。通过计算回答的 n-gram 重叠率或 embedding 相似度检测。少量合理重复可保留,大
量重复需要清理。
3、来源级去重:混合多个开源数据集时,不同数据集之间可能存在大量重叠(如ShareGPT 数据可能已被多个下游数据集包含)。需要跨数据集进行去重。
3.3、安全与合规过滤
1、有害内容检测与处理:使用毒性分类器检测有害指令和回答。区分两种情况:恶意指令+配合性回答→必须移除或改为安全拒绝;正常指令+意外有害回答→修正回答或移除。同时检查是否有 prompt injection 类数据混入。
2、PII(个人身份信息)清理:比预训练数据更严格,因为微调数据中的 PII 更容易被模型记忆化。检测并替换真实姓名、邮箱、电话、地址、身份证号。对于来自真实用户对话的数据,PII 清理是必须步骤。
3、版权与许可:检查回答中是否包含受版权保护的大段内容(如书籍段落、歌词)。使用开源数据集时确认其许可证允许你的使用场景。部分数据集禁止商业
使用(如基于 GPT-4 输出的数据集可能受 OpenAI 条款限制)。
4、数据多样性与平衡
4.1-4.2、多样性的重要性 & 任务类型覆盖
微调数据的多样性直接决定了模型的泛化能力。数据过于集中在某类任务会导致灾难性遗忘。
| 任务类别 | 示例 | 建议占比(通用助手) |
|---|---|---|
| 知识问答 | 事实查询、概念解释 | 15–20% |
| 推理分析 | 逻辑推理、数学计算、因果分析 | 15–20% |
| 创意写作 | 故事、诗歌、文案、邮件 | 10–15% |
| 代码相关 | 编写、调试、解释代码 | 10–15% |
| 文本处理 | 摘要、翻译、改写、纠错 | 10–15% |
| 多轮对话 | 追问、澄清、上下文引用 | 10–15% |
| 指令遵循 | 格式要求、约束条件、角色扮演 | 5–10% |
| 安全拒绝 | 拒绝有害请求、边界情况处理 | 5–10% |
4.3、难度分布
数据难度应呈合理分布,不宜全部是简单问题或全部是高难度问题:
1、简单(30%):直接的事实查询、简单指令
2、中等(50%): 需要一定推理或专业知识
3、困难(20%):复杂推理、多步骤任务、专业领域深度问题
难度评估方法:
• 指令长度和复杂度 / 所需推理步骤数
• 领域专业程度 / 约束条件数量
• 用弱模型测试,正确率低的即为「难」
4.4、长度分布
回答长度应有合理的变异:
• 简短回答(1-3 句):20-30%
• 中等回答:40-50%
• 详细回答:20-30%
避免所有回答都长篇大论(模型会学到啰嗦),也避免都过于简短。指令中明确要求「简短」或「详细」时,回答长度应与要求匹配。
4.5-4.6、语言风格多样性 & 检测补充
1、语言与风格多样性
• 多语言模型需控制不同语言的比例
• 同一语言内风格应多样化:正式/口语、技术性/通俗化
• 避免所有回答使用相同句式模式(如每次都以「当然!」开头)
2、多样性检测方法
• 对所有指令做 embedding 聚类查看分布是否均匀
• 统计关键词/主题的频率分布
• 计算回答的 n-gram 多样性指标(Distinct-n)
3、不足时的补充策略:
• 定向生成:识别覆盖不足的类别,用大模型定向生成
• 改写扩展:对现有数据进行改写,增加表述多样性
• 从外部数据集补充特定类别
5、特定微调场景的数据处理
5.1、领域适配微调
目标:让通用模型掌握特定领域的知识和表达方式。
数据构建流程:
- 收集领域文档(论文、教材、手册、案例)
- 用大模型从文档中提取知识点,生成多样化的问答对
- 由领域专家审核和修正
- 补充领域特有的推理/判断类问题
关键注意事项:
• 领域术语的一致性:同一概念在不同数据中的称呼需要统一
• 专业知识的准确性:必须由领域专家把关,大模型生成的专业内容可能有隐蔽错误
• 保持通用能力:纯领域数据微调容易导致通用能力下降,需混入一定比例的通用数据(通常 20-40%)
5.2、偏好对齐微调(DPO/RLHF)
偏好对数据的构建方法:
1、多模型/多采样生成 — 同一 prompt 下让不同模型或同一模型(不同温度/采样参数)生成多个回答,由人工
或 LLM Judge 选出 chosen 和 rejected。
2、故意降质 — 对已有 SFT 数据,故意生成降质版本作为 rejected:引入事实错误、删减关键信息、添加冗余废
话、忽略部分指令要求、降低格式规范性。
3、线上隐式反馈 — 从线上数据中收集用户的隐式反馈(点赞/踩、重新生成、编辑修改)。
质量要点:chosen 和 rejected 之间要有明确的质量差异;差异应体现在实质内容上而非仅长度;覆盖多种偏好维度(准确性、有用
性、安全性、格式规范);同时需要简单区分和困难区分的样本。
5.3、工具调用 / Agent 微调
1、数据要素:
• 工具定义(function schema)
• 用户请求
• 模型判断:是否需要调用工具、调用哪个工具、参数是什么
• 工具返回结果
• 模型基于结果的最终回答
2、数据构建关键:
• 包含「不需要调用工具」的负样本(避免模型过度调用工具)
• 包含多轮工具调用(一次请求需要连续调用多个工具)
• 包含工具调用失败/报错后的处理
• 参数填充的准确性需要严格验证
5.4、多轮对话微调
1、数据特点
• 对话轮次通常 3-10 轮
• 需包含指代消解(「它」「那个」指代上文)
• 需包含话题转换和追问
• 需包含用户纠正模型错误的场景
2、常见问题
• 多轮数据中,后续轮次的回答质量经常不如第一轮
• 需要确保每一轮回答都要经过质量控制
• 对话连贯性与一致性需要整体审核
5.5、长文本微调
1、确保数据确实利用了长上下文(而非短问题 + 长但无用的回答)
2、需要包含对上下文中远距离信息的引用和推理
3、常见构造方式:基于长文档的问答、长文档摘要、多文档综合分析
4、注意长文本 tokenize 后不超过模型的上下文窗口限制
6、数据增强与合成(微调专用策略)
6.1、指令改写与进化
Evol-Instruct(WizardLM 方法):从简单指令出发,通过以下策略逐步进化:
• 增加约束:「写一首诗」→「写一首关于秋天的七言绝句,不能使用「落叶」这个词」
• 增加推理步骤:「计算面积」→「一个不规则多边形,给出顶点坐标,要求先分割为三角形再求面积」
• 换角度提问:将「解释X」改为「从反对者的角度评价X」
• 增加背景信息:给指令添加具体的场景和上下文
指令回译:给定一个高质量回答,用大模型反推可能的指令。适合从已有知识库中挖掘微调数据。
6.2、回答增强
1、拒绝采样(Rejection Sampling):对同一指令让模型生成 K 个(如 10-20 个)回答,用验证器(正确性检查)或 Reward Model 打分,只保留得分最高的 1-2 个作为训练数据。在数学和代码任务中效果尤为显著。
2、思维链补充:对推理类问题确保回答包含详细推理过程。可以让大模型对已有的简短回答补充推理链。格式举例:「让我们一步步分析... 第一步... 第二步... 因此...」
3、自我修正数据:构造「初始回答(有缺陷)→ 反思 → 修正后的回答」的训练数据,帮助模型学会自我检查和修正。
6.3、针对弱点的定向数据生成
迭代流程:
1️⃣ 在评估集上测试当前模型,找到薄弱环节
2️⃣ 分析错误模式:是知识不足、推理错误还是指令理解偏差
3️⃣ 针对性地生成该类型的训练数据
4️⃣ 混入整体训练集重新微调
5️⃣ 再次评估,迭代进行
7、数据预处理与训练准备
7.1、对话模板(Chat Template)
不同模型使用不同的对话模板,对模型行为有重要影响。
ChatML 格式:
<|im_start|>system
你是一个有用的助手。<|im_end|>
<|im_start|>user
请解释量子力学。<|im_end|>
<|im_start|>assistant
量子力学是...<|im_end|>
LLaMA 格式:
[INST] <<SYS>>
你是一个有用的助手。
<</SYS>>
请解释量子力学。 [/INST] 量子力学是...
关键处理:所有数据必须统一转换为目标模型的对话模板格式;训练时只对 assistant 回答部分计算 loss(其余 mask 掉);确保特殊 token 的正确添加和位置。
7.2、长度处理
截断策略:
• 超过最大长度的数据:截断或丢弃
• 截断位置的选择:优先保留完整的回答,可以截断过长的上下文
• 对于多轮对话,可以将过长的对话拆分为多个训练样本(滑动窗口)
打包(Packing):
• 将多个短样本拼接到一个训练序列中,提高 GPU 利用率
• 需要使用 attention mask 确保不同样本之间不产生注意力交互
• 可以显著减少 padding 浪费(尤其是数据长度差异大时)
7.3、数据洗牌与分组
• 训练前充分打乱数据顺序
• 如果不同类型的数据量差异大,可以在 batch 内做分层采样
• 确保每个 batch 中的数据多样性
• 设置验证集(通常 5%-10%),用于监控训练过程
8、常用工具与框架
8.1、数据处理工具
| 工具 | 用途 |
|---|---|
| HuggingFace Datasets | 加载、处理、格式转换微调数据集 |
| Argilla | 数据标注、质量审核与协作平台 |
| Label Studio | 开源数据标注工具 |
| LiteLLM / vLLM | 批量调用大模型生成 / 评估数据 |
| text-dedup | 大规模去重 |
| Sentence-Transformers | 计算文本 embedding,用于语义去重和聚类 |
| Presidio | PII 检测与脱敏 |
8.2、微调框架
| 框架 | 特点 |
|---|---|
| LLaMA-Factory | 多模型支持,提供一站式微调与 Web UI |
| Axolotl | 配置驱动,通过 YAML 文件定义训练流程 |
| Swift(ModelScope) | 阿里开源,支持主流大模型轻量微调与部署 |
| TRL(HuggingFace) | 官方库,覆盖 SFT / RLHF / DPO 等训练方法 |
| Unsloth | 效率优化,显著降低显存占用并提升训练速度 |
| OpenRLHF | 专注 RLHF / DPO 训练,支持分布式大规模对齐 |
8.3、数据质量评估工具
| 工具/方法 | 用途 |
|---|---|
| AlpacaEval | 自动评估指令跟随质量 |
| MT-Bench | 多轮对话能力评估 |
| Arena-Hard | 难度较高的自动评估 |
| Deita | 数据质量和复杂度自动评分 |
| InsTag | 指令标签分类与多样性分析 |