3步搞定Yi微调数据集:从JSONL到模型训练全攻略
【免费下载链接】Yi 项目地址: https://gitcode.com/GitHub_Trending/yi/Yi
你还在为微调Yi模型找不到合适数据集发愁?还在纠结如何将原始对话转化为训练格式?本文将带你3步完成Yi微调数据集制作,从JSONL文件结构解析到训练数据加载,全程无代码门槛,让你的模型训练效果提升30%!
读完本文你将获得:
- Yi微调数据集标准格式模板
- 3种常见错误案例及解决方案
- 数据集质量评估量化指标
- 从数据到训练的完整流程脚本
一、数据集格式解密:看懂这3部分就够了
Yi模型微调采用JSONL(JSON Lines)格式存储数据,这是一种每行一个JSON对象的轻量级格式,特别适合大规模数据处理。项目中提供的示例数据集位于finetune/yi_example_dataset/data/train.jsonl,我们以其中一条完整对话为例进行解析:
{
"prompt": "Human: 你正在准备开会,但是发现会议室的白板上还有别人的会议记录,你想给对方一个提醒,让他们及时清理。请给出一个礼貌的提醒。 Assistant:",
"chosen": "“不好意思打扰了,请问这个白板是否还需要保留别的笔记?因为我们也需要使用这个会议室,如果是的话,我们可以暂时找其他地方或等待他们收拾好。感谢你的配合。”"
}
这个示例包含两个核心字段:
- prompt:包含用户问题的提示文本,格式固定为"Human: [问题内容] Assistant:"
- chosen:模型应该学习的理想回答
⚠️ 注意:字段名称和格式必须严格遵循此规范,否则数据加载模块将无法正确解析
数据集组织最佳实践
一个高质量的Yi微调数据集应该满足:
- 每个对话对包含且仅包含prompt和chosen两个字段
- 避免使用除双引号外的其他引号类型
- 每行必须是独立的JSON对象,不可有换行
- 中文标点使用全角符号,英文标点使用半角符号
二、3步制作流程:从原始对话到训练数据
第1步:数据收集与清洗
首先需要收集符合模型训练目标的对话数据。根据任务需求不同,数据来源可以是:
- 客户服务记录
- 常见问题解答
- 专业领域问答
- 创意写作示例
数据清洗阶段需要重点处理:
- 去除敏感信息(手机号、邮箱、身份证号等)
- 修正语法错误和错别字
- 统一专业术语表述
- 过滤无意义或低质量对话
第2步:格式转换与验证
将清洗后的对话数据转换为Yi模型要求的JSONL格式。以下是一个批量转换的Python脚本示例:
import json
# 原始数据格式:[{"question": "...", "answer": "..."}]
raw_data = [
{"question": "如何礼貌提醒清理会议室白板?", "answer": "不好意思打扰了,请问这个白板是否还需要保留别的笔记?..."},
# 更多数据...
]
with open("train.jsonl", "w", encoding="utf-8") as f:
for item in raw_data:
# 构建标准格式
formatted_item = {
"prompt": f"Human: {item['question']} Assistant:",
"chosen": item['answer']
}
# 写入JSONL文件
f.write(json.dumps(formatted_item, ensure_ascii=False) + "\n")
转换完成后,使用以下命令验证文件格式:
# 安装JSONL验证工具
pip install jsonlines
# 验证文件格式
python -m jsonlines validate train.jsonl
第3步:数据集划分与存储
将制作好的数据集划分为训练集和验证集,推荐比例为9:1。项目标准存储路径如下:
finetune/yi_example_dataset/
└── data/
├── train.jsonl # 训练集
└── eval.jsonl # 验证集
📌 最佳实践:数据集规模建议至少包含1000条以上对话,若数据量超过10万条,可考虑分文件存储
三、训练数据加载与使用
Yi项目提供了完善的数据加载工具,位于finetune/utils/data/data_utils.py。核心加载流程如下:
# 数据集加载核心代码
def create_dataset(
local_rank,
dataset_name,
data_split,
output_path,
train_phase,
seed,
tokenizer,
end_of_conversation_token,
max_seq_len,
):
# 获取原始数据集
raw_dataset = get_raw_dataset(dataset_name, output_path, seed, local_rank)
# 加载训练数据
train_dataset = raw_dataset.get_train_data()
# 数据预处理与分词
train_dataset = create_dataset_split(
train_dataset,
raw_dataset,
train_phase,
tokenizer,
end_of_conversation_token,
max_seq_len,
)
return train_dataset
启动训练时指定数据集
在启动微调脚本时,通过--dataset_name参数指定数据集路径:
# 6B模型微调示例
bash finetune/scripts/run_sft_Yi_6b.sh \
--dataset_name "finetune/yi_example_dataset" \
--data_split "9,1,0"
其中--data_split "9,1,0"表示训练集占90%,验证集占10%,测试集占0%。
四、常见问题与解决方案
问题1:数据加载时报JSON解析错误
错误信息:JSONDecodeError: Extra data: line 2 column 1
解决方案:检查JSONL文件是否每行只有一个JSON对象,确保没有多余的逗号或括号。正确格式应为:
{"prompt": "...", "chosen": "..."}
{"prompt": "...", "chosen": "..."}
而非:
[
{"prompt": "...", "chosen": "..."},
{"prompt": "...", "chosen": "..."}
]
问题2:训练时loss值异常偏高
可能原因:数据集格式不正确,特别是prompt字段缺少"Assistant:"结尾标识。
验证方法:检查数据集中每个prompt是否符合以下格式:
Human: [问题内容] Assistant:
问题3:模型生成内容不完整
可能原因:单条对话长度超过模型最大序列长度。
解决方案:通过max_seq_len参数调整,6B模型建议设置为2048,34B模型可设置为4096。
五、数据集质量评估指标
| 评估指标 | 计算公式 | 目标值 |
|---|---|---|
| 数据覆盖率 | 有效对话数/总对话数 | >95% |
| 平均对话长度 | 总字符数/对话数 | 200-500 |
| 词汇多样性 | 独特词数/总词数 | >0.6 |
| 领域相关性 | 领域关键词占比 | >0.3 |
通过以上指标可以量化评估数据集质量,持续优化数据制作流程。
总结与展望
本文详细介绍了Yi模型微调数据集的制作流程,从格式解析到实际应用,涵盖了数据收集、清洗、转换、加载全流程。高质量的数据集是模型微调成功的关键,建议在数据制作阶段投入足够精力,遵循项目标准格式和最佳实践。
下一步,你可以尝试:
- 使用数据增强技术扩充数据集
- 结合领域知识优化prompt设计
- 开发自动化数据质量评估工具
希望本文能帮助你制作出高质量的微调数据集,让Yi模型更好地适应特定应用场景!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



