数据集是微调的灵魂
在微调大模型时,数据质量远比数据量重要。几百条高质量样本的效果可能优于几万条低质量样本。构建数据集需要系统的方法论和严格的质量控制。
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等,需筛选后使用
- 用户反馈:从生产环境的用户交互中收集优质对话
数据清洗策略
- 长度过滤:过短(<20字)或过长(>2000字)的对话通常质量不高
- 重复检测:使用MinHash或语义相似度检测并去除重复样本
- 语言检测:确保数据语言一致,避免中英文混杂
- 格式校验:确保JSON格式正确,字段完整
- 内容审核:过滤包含敏感、有害或低质量内容的样本
数据质量评估
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. 版本管理:对数据集进行版本控制,可追溯每次变更