数据集是微调的灵魂

在微调大模型时,数据质量远比数据量重要。几百条高质量样本的效果可能优于几万条低质量样本。构建数据集需要系统的方法论和严格的质量控制。

SFT数据格式

监督微调(SFT)的数据通常采用对话格式:

[
  {
    "messages": [
      {"role": "system", "content": "你是一个专业的Python编程助手"},
      {"role": "user", "content": "如何用Python读取CSV文件?"},
      {"role": "assistant", "content": "可以使用pandas库的read_csv函数..."}
    ]
  },
  {
    "messages": [
      {"role": "system", "content": "你是一个专业的Python编程助手"},
      {"role": "user", "content": "什么是列表推导式?"},
      {"role": "assistant", "content": "列表推导式是Python中创建列表的简洁语法..."}
    ]
  }
]

数据来源与采集

  • 人工标注:质量最高,成本也最高。适合核心场景
  • 模型生成+人工审核:先用GPT-4等强模型生成候选数据,人工筛选和修改
  • 开源数据集:如ShareGPT、Alpaca、OpenOrca等,需筛选后使用
  • 用户反馈:从生产环境的用户交互中收集优质对话

数据清洗策略

  1. 长度过滤:过短(<20字)或过长(>2000字)的对话通常质量不高
  2. 重复检测:使用MinHash或语义相似度检测并去除重复样本
  3. 语言检测:确保数据语言一致,避免中英文混杂
  4. 格式校验:确保JSON格式正确,字段完整
  5. 内容审核:过滤包含敏感、有害或低质量内容的样本

数据质量评估

def evaluate_dataset_quality(dataset):
    metrics = {
        "total_samples": len(dataset),
        "avg_instruction_length": 0,
        "avg_response_length": 0,
        "diversity_score": 0,
        "format_valid_rate": 0
    }

    instruction_lengths = []
    response_lengths = []

    for sample in dataset:
        messages = sample["messages"]
        user_msg = next(m["content"] for m in messages if m["role"]=="user")
        assistant_msg = next(m["content"] for m in messages if m["role"]=="assistant")

        instruction_lengths.append(len(user_msg))
        response_lengths.append(len(assistant_msg))

    metrics["avg_instruction_length"] = sum(instruction_lengths) / len(instruction_lengths)
    metrics["avg_response_length"] = sum(response_lengths) / len(response_lengths)
    metrics["diversity_score"] = calculate_diversity(instruction_lengths)

    return metrics

数据增强技术

  • Self-Instruct:让模型自己生成新的指令-回复对
  • 回译增强:中文→英文→中文,生成语义相同但表达不同的样本
  • 模板扩充:基于模板生成相同意图但不同表述的变体
  • 难度分级:构建不同难度梯度的样本,帮助模型渐进学习

最佳实践

1. 质量>数量:优先保证数据质量 2. 覆盖多样性:确保数据覆盖目标场景的各种情况 3. 持续迭代:根据模型表现持续补充和优化数据集 4. 版本管理:对数据集进行版本控制,可追溯每次变更