3步搞定Yi微调数据集:从JSONL到模型训练全攻略

3步搞定Yi微调数据集:从JSONL到模型训练全攻略

【免费下载链接】Yi 【免费下载链接】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模型微调数据集的制作流程,从格式解析到实际应用,涵盖了数据收集、清洗、转换、加载全流程。高质量的数据集是模型微调成功的关键,建议在数据制作阶段投入足够精力,遵循项目标准格式和最佳实践。

下一步,你可以尝试:

  1. 使用数据增强技术扩充数据集
  2. 结合领域知识优化prompt设计
  3. 开发自动化数据质量评估工具

希望本文能帮助你制作出高质量的微调数据集,让Yi模型更好地适应特定应用场景!

【免费下载链接】Yi 【免费下载链接】Yi 项目地址: https://gitcode.com/GitHub_Trending/yi/Yi

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值