欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 【LLaMA-Factory 实战系列】一、数据准备篇 - 从文本到多模态的完整流程

【LLaMA-Factory 实战系列】一、数据准备篇 - 从文本到多模态的完整流程

2025/6/25 22:30:41 来源:https://blog.csdn.net/weixin_45921929/article/details/148780662  浏览:    关键词:【LLaMA-Factory 实战系列】一、数据准备篇 - 从文本到多模态的完整流程

【LLaMA-Factory 实战系列】一、数据准备篇 - 从文本到多模态的完整流程

  • 1. 引言
  • 2. LLaMA-Factory 数据格式概述
    • 2.1 Alpaca 格式
    • 2.2 ShareGPT 格式
  • 3. 文本数据准备
    • 3.1 Alpaca 格式示例
    • 3.2 ShareGPT 格式示例
    • 3.3 预训练数据格式
  • 4. 多模态数据准备
    • 4.1 图像数据准备
    • 4.2 视频数据准备
    • 4.3 音频数据准备
  • 5. 多模态实战案例:Pokemon 数据集处理
    • 5.1 完整代码(包含下载与转换)
    • 5.2 结果示例
  • 6. 数据集配置与注册
    • 6.1 什么是 dataset_info.json
    • 6.2 配置参数详解
    • 6.3 配置示例详解
  • 7. 最佳实践与注意事项
    • 7.1 数据质量检查
    • 7.2 多模态数据准备要点
    • 7.3 性能优化
    • 7.4 常见问题与解决方案
  • 8. 总结

1. 引言

在大模型训练中,数据准备是最关键的步骤之一。俗话说 “Garbage in, garbage out”,数据的质量直接决定了模型的性能上限。本文将详细介绍如何为 LLaMA-Factory 准备训练数据,包括文本数据和多模态数据的处理方法。


2. LLaMA-Factory 数据格式概述

LLaMA-Factory 支持两种主要的数据格式:

2.1 Alpaca 格式

  • 结构简单,适合单轮对话
  • 支持 instructioninputoutput 字段
  • 适用于指令微调任务

2.2 ShareGPT 格式

  • 支持多轮对话
  • 角色更丰富(human、gpt、system、function、observation)
  • 适合复杂对话场景和多模态任务

3. 文本数据准备

3.1 Alpaca 格式示例

[{"instruction": "请解释什么是机器学习","input": "","output": "机器学习是人工智能的一个分支,它使计算机能够从数据中学习并改进性能,而无需明确编程。","system": "你是一个专业的AI助手","history": [["你好", "你好!有什么可以帮助你的吗?"]]}
]

3.2 ShareGPT 格式示例

[{"conversations": [{"from": "human","value": "什么是深度学习?"},{"from": "gpt","value": "深度学习是机器学习的一个子领域,使用多层神经网络来学习数据的复杂模式。"}],"system": "你是一个专业的AI助手"}
]

3.3 预训练数据格式

[{"text": "这是一段用于预训练的文本内容"},{"text": "另一段文本内容"}
]

4. 多模态数据准备

4.1 图像数据准备

数据格式示例

[{"conversations": [{"from": "human","value": "描述这张图片<image>"},{"from": "gpt","value": "这是一只可爱的小猫,正在阳光下睡觉。"}],"images": ["path/to/cat_image.jpg"]}
]

关键要点

  • <image> 标记的数量必须与 images 列表中的图片数量一致
  • 图片路径可以是相对路径或绝对路径
  • 支持常见格式:jpg、png、webp 等

4.2 视频数据准备

[{"conversations": [{"from": "human","value": "<video>这个视频中发生了什么?"},{"from": "gpt","value": "视频展示了一个人在公园里慢跑的场景。"}],"videos": ["path/to/running_video.mp4"]}
]

4.3 音频数据准备

[{"conversations": [{"from": "human","value": "<audio>请转录这段音频"},{"from": "gpt","value": "音频内容是:今天天气真好,适合出去散步。"}],"audios": ["path/to/audio_file.wav"]}
]

5. 多模态实战案例:Pokemon 数据集处理

5.1 完整代码(包含下载与转换)

import os
import json
from datasets import load_dataset
from PIL import Image
from tqdm import tqdm# 设置镜像加速
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"def convert_pokemon_dataset(output_dir="pokemon_sharegpt"):os.makedirs(output_dir, exist_ok=True)images_dir = os.path.join(output_dir, "images")os.makedirs(images_dir, exist_ok=True)ds = load_dataset("BUAADreamer/pokemon-gpt4-1k", split="train")sharegpt_data = []for idx, item in enumerate(tqdm(ds, desc="处理数据")):entry = {"conversations": [],"system": "You are a helpful assistant.","images": [f"images/pokemon_{idx:04d}.png"]}# 保存图片if "images" in item and item["images"]:image = item["images"][0]if isinstance(image, Image.Image):image.save(os.path.join(images_dir, f"pokemon_{idx:04d}.png"))# 转换对话if "messages" in item:for i, msg in enumerate(item["messages"]):role = msg.get("role", "")content = msg.get("content", "")if role == "user":from_role = "human"if i == 0:content += "<image>"elif role == "assistant":from_role = "gpt"else:continueentry["conversations"].append({"from": from_role,"value": content})sharegpt_data.append(entry)output_path = os.path.join(output_dir, "pokemon_sharegpt.json")with open(output_path, "w", encoding="utf-8") as f:json.dump(sharegpt_data, f, ensure_ascii=False, indent=2)print(f"✅ 数据转换完成,已保存至: {output_path}")if __name__ == "__main__":convert_pokemon_dataset()

5.2 结果示例

代码运行成功后,会在pokemon_sharegpt文件夹下生成一个images文件夹,以及一个pokemon_sharegpt.json的文件,json内容如下

{"conversations": [{"from": "human","value": "Provide caption for the image in one sentence. Be detailed but precise.<image>"},{"from": "gpt","value": "A cheerful Bulbasaur ready for its next Pokémon adventure."}],"system": "You are a helpful assistant.","images": ["images/pokemon_0000.png"]
}

对应图片如下:
在这里插入图片描述


6. 数据集配置与注册

6.1 什么是 dataset_info.json

dataset_info.json 是 LLaMA-Factory 用于管理和加载数据集的核心配置文件。所有自定义数据集都必须在这个文件中注册后才能使用。该文件应放置在 dataset_dir 目录下(后续可以放置在 pokemon_sharegpt文件夹下)。

配置文件的基本结构

{"数据集名称1": {// 数据集配置},"数据集名称2": {// 数据集配置}
}

6.2 配置参数详解

基础参数

参数名类型必填说明示例
file_namestring是*本地数据集文件路径"data/train.json"
hf_hub_urlstringHugging Face Hub 仓库名称"tatsu-lab/alpaca"
ms_hub_urlstringModelScope Hub 仓库名称"modelscope/alpaca"
formattingstring数据格式,默认为 alpaca"alpaca""sharegpt"
rankingboolean是否为偏好数据集truefalse
subsetstring数据集子集名称"train"
splitstring数据集分割,默认为 train"train", "test", "validation"
num_samplesinteger限制使用的样本数量10000

注:如果指定了 hf_hub_urlms_hub_url,则可以不填 file_name

columns参数(字段映射)

columns 用于将数据集中的字段名映射到 LLaMA-Factory 标准字段名:

标准字段说明Alpaca 默认值ShareGPT 默认值
prompt用户指令"instruction"-
query用户输入(补充)"input"-
response模型回复"output"-
messages对话消息列表-"conversations"
system系统提示词"system""system"
history历史对话"history"-
images图片路径列表"images""images"
videos视频路径列表"videos""videos"
audios音频路径列表"audios""audios"
tools工具描述"tools""tools"
chosen偏好数据集中的优选回复"chosen""chosen"
rejected偏好数据集中的劣选回复"rejected""rejected"
kto_tagKTO 训练的标签"kto_tag""kto_tag"

tags参数(ShareGPT 格式专用)

tags 用于定义 ShareGPT 格式中的标签名称:

参数说明默认值
role_tag角色标识字段名"from"
content_tag内容字段名"value"
user_tag用户角色标识"human"
assistant_tag助手角色标识"gpt"
observation_tag工具返回结果标识"observation"
function_tag函数调用标识"function_call"
system_tag系统消息标识"system"

6.3 配置示例详解

示例 1:基础文本数据集

{"my_text_dataset": {"file_name": "data/my_dataset.json","formatting": "sharegpt","columns": {"messages": "conversations","system": "system_prompt"}}
}

示例 2:多模态图像数据集

{"pokemon_multimodal": {"file_name": "pokemon_sharegpt/pokemon_sharegpt.json","formatting": "sharegpt","columns": {"messages": "conversations","system": "system","images": "image_paths"}}
}

示例 3:完整的高级配置

{"advanced_dataset": {"hf_hub_url": "BUAADreamer/pokemon-gpt4-1k","ms_hub_url": "modelscope/pokemon-gpt4","file_name": "data/pokemon.json","formatting": "sharegpt","ranking": false,"subset": "default","split": "train","num_samples": 5000,"columns": {"messages": "chats","system": "sys_prompt","images": "img_list","tools": "functions"},"tags": {"role_tag": "role","content_tag": "content","user_tag": "user","assistant_tag": "assistant"}}
}

示例 4:偏好数据集(用于 DPO/RLHF)

{"preference_dataset": {"file_name": "data/preferences.json","formatting": "alpaca","ranking": true,"columns": {"prompt": "question","query": "context","chosen": "better_answer","rejected": "worse_answer"}}
}

7. 最佳实践与注意事项

7.1 数据质量检查

def validate_dataset(json_path):"""验证数据集格式是否正确"""with open(json_path, 'r', encoding='utf-8') as f:data = json.load(f)issues = []for idx, item in enumerate(data):if 'conversations' not in item:issues.append(f"第 {idx} 条缺少 conversations 字段")if len(item['conversations']) % 2 != 0:issues.append(f"第 {idx} 条对话轮次为奇数")if 'images' in item:for img_path in item['images']:if not os.path.exists(img_path):issues.append(f"第 {idx} 条的图片不存在: {img_path}")return issues

7.2 多模态数据准备要点

  • 数据结构:多模态需包含图片/音频/视频路径字段
  • 标记符号:使用 <image><video><audio> 插入媒体位置
  • 统一格式:将图片转换为 PNG,使用统一命名
  • 路径管理:使用相对路径,确保可移植性
  • 数据增强:适当增强图像质量

7.3 性能优化

def process_large_dataset(dataset, batch_size=100):total = len(dataset)for i in range(0, total, batch_size):batch = dataset[i:i+batch_size]process_batch(batch)if i % 1000 == 0:save_checkpoint(i)

7.4 常见问题与解决方案

问题解决方案
图片加载失败检查路径正确性,确保图片格式支持
内存溢出使用流式处理,避免一次性加载所有数据
格式不匹配使用验证脚本检查结构
编码错误统一使用 UTF-8 编码

8. 总结

准备高质量的训练数据是大模型成功的关键。本文介绍了:

  • LLaMA-Factory 支持的数据格式:Alpaca 和 ShareGPT
  • 文本与多模态数据的准备方式
  • Pokemon 多模态数据集的完整处理流程
  • 如何配置和注册自定义数据集

尽可能保证:

  • 数据格式正确
  • 内容质量高
  • 标注准确
  • 适合你的训练目标

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词