LLaMA-Factory数据集使用与注册
一、NL2SQL技术概述
(一)定义与应用场景
NL2SQL(Natural Language to SQL),也叫text2SQL。在数据分析场景中,用户可以用自然语言提出“查询2023年销售额大于100万的产品”,系统将其转换为相应的SQL语句在数据库中查询。
(二)大模型微调的必要性
单纯使用RAG(检索增强生成)技术,大模型很难准确理解如何编写正确的SQL语句。因此,在NL2SQL场景中,需要对大模型进行微调。大模型微调的必备条件包括:有大模型、有对应领域的数据、使用资源或框架。
二、数据集格式详解
(一)Alpaca格式
- 格式结构:Alpaca格式适合单轮指令微调,强调指令与响应的直接关系。其数据结构包含以下字段:
- “instruction”(必填):用户指令,用于引导模型生成特定响应,类似于模型的prompt。
- “input”(选填):用户输入信息,可补充指令相关的额外内容。
- “output”(必填):模型的回答。
- “system”(选填):系统提示词,可用于设置模型的背景信息或特定规则。
- “history”(选填):用于记录多轮对话历史,但在单轮对话中通常不使用。
- 示例:
# 定义一个Alpaca格式的示例数据
alpaca_example = {
"instruction": "写一篇关于苹果的短文", # 指令:要求模型写一篇关于苹果的短文
"input": "", # 这里没有额外输入信息,所以为空字符串
"output": "苹果是一种常见的水果,富含维生素和营养。它有多种颜色,如红色、绿色和黄色。" # 模型针对指令给出的回答
}
(二)ShareGPT格式
- 格式结构:ShareGPT格式适用于多轮对话微调,能够处理复杂的对话场景。其数据结构主要包含以下部分:
- “conversations”(必填):对话列表,每个元素包含“from”(对话角色,如“human”表示人类输入,“gpt”表示模型回复)和“value”(对应角色的对话内容)。
- “system”(选填):系统提示词,作用与Alpaca格式中的“system”类似。
- “tools”(选填):工具描述信息,在涉及工具调用的场景中使用。
- 示例:
# 定义一个ShareGPT格式的示例数据
sharegpt_example = {
"conversations": [ # 对话列表
{"from": "human", "value": "你知道苹果吗?"}, # 人类提问
{"from": "gpt", "value": "知道,苹果是一种常见水果。"} # 模型回答
]
}
(三)两种格式对比及应用场景选择
- 对比:Alpaca格式结构简单,适用于单轮对话任务;ShareGPT格式能更好地处理多轮对话,支持多种角色和更丰富的对话场景。
- 应用场景选择:在简单的问答、文本生成等单轮任务中,优先选择Alpaca格式;在聊天机器人、虚拟助手等需要自然交互和保持对话上下文的多轮对话场景中,ShareGPT格式更为合适。两种格式的数据在LLaMA - Factory中可以混合使用,以增加训练数据的多样性,提升模型的泛化能力和任务适应性。
三、数据集的寻找与选择
(一)国外资源
Hugging Face上有许多相关数据集,如:
- gretelai/synthetic_text_to_sql
- lamini/bird_text_to_sql等
可以根据任务需求和数据集特点进行选择。
(二)其他公开数据集
- wikisQL:属于单领域数据集,包含80654个自然语言问题和77840个SQL语句。SQL语句形式简单,不包含排序、分组、子查询等复杂操作。
- CoSQL:西安交通大学和微软等提出的跨领域、多轮Text - to - SQL中文数据集,包含5459个多轮问题组成的列表和17940个<query, SQL>二元组。
- BIRD - SQL:香港大学和阿里巴巴提出的大规模跨域数据集,包含超过12751个独特的问题SQL、95个大数据库,总大小为33.4GB,涵盖超过37个专业领域。还有BIRD - SQL Mini - Dev,从11个不同数据库中编译了500个高质量的text2SQL对,并支持MySQL和PostgreSQL。
四、数据处理与转换
(一)转换为Alpaca格式
- 转换思路:以bird数据为例,将“question”对应Alpaca格式的“instruction”,“evidence”对应“input”,“SQL”对应“output”。
- 代码示例:
import json # 导入json模块,用于处理JSON数据格式
import argparse # 导入argparse模块,用于解析命令行参数
def convert_to_alpaca_format(input_file, output_file):
# 打开输入的JSON文件,以只读模式读取数据
with open(input_file, 'r') as file:
data = json.load(file)
alpaca_format = [] # 初始化一个空列表,用于存储转换后的Alpaca格式数据
for entry in data:
# 从原始数据的每个条目中提取相应信息,构建Alpaca格式的条目
alpaca_entry = {
"instruction": entry["question"], # 将原始数据中的question作为instruction
"input": entry.get("evidence", ""), # 获取evidence作为input,如果没有evidence则设为空字符串
"output": entry["SQL"] # 将原始数据中的SQL作为output
}
alpaca_format.append(alpaca_entry) # 将构建好的Alpaca格式条目添加到列表中
# 打开输出的JSON文件,以写入模式将转换后的数据写入文件
with open(output_file, 'w') as output_file_handle:
# 将Alpaca格式数据写入文件,使用indent=4进行缩进格式化,使文件内容更易读
json.dump(alpaca_format, output_file_handle, indent=4)
if __name__ == "__main__":
# 创建一个ArgumentParser对象,用于定义和解析命令行参数
parser = argparse.ArgumentParser(description="Convert data to Alpaca format.")
# 添加一个名为input_file的命令行参数,指定为字符串类型,用于接收输入JSON文件的路径,并提供帮助信息
parser.add_argument("input_file", type=str, help="Path to the input JSON file.")
# 添加一个名为output_file的命令行参数,指定为字符串类型,用于接收输出JSON文件的路径,并提供帮助信息
parser.add_argument("output_file", type=str, help="Path to the output JSON file.")
args = parser.parse_args() # 解析命令行参数
# 调用convert_to_alpaca_format函数,传入解析后的输入和输出文件路径参数,执行数据转换
convert_to_alpaca_format(args.input_file, args.output_file)
(二)转换为ShareGPT格式
- 转换思路:同样以bird数据为例,将“question”对应“human”的“value”,“SQL”对应“gpt”的“value”,并构建“conversations”列表。
- 代码示例:
import json # 导入json模块,用于处理JSON数据格式
import argparse # 导入argparse模块,用于解析命令行参数
def convert_to_sharegpt_format(input_file, output_file):
# 打开输入的JSON文件,以只读模式读取数据
with open(input_file, 'r') as file:
data = json.load(file)
sharegpt_format = [] # 初始化一个空列表,用于存储转换后的ShareGPT格式数据
for entry in data:
# 构建一个包含人类提问和模型回答的对话列表
conversation = [
{"from": "human", "value": entry["question"]}, # 将原始数据中的question作为人类的提问
{"from": "gpt", "value": entry["SQL"]} # 将原始数据中的SQL作为模型的回答
]
# 将构建好的对话列表作为一个条目添加到ShareGPT格式数据列表中
sharegpt_format.append({"conversations": conversation})
# 打开输出的JSON文件,以写入模式将转换后的数据写入文件
with open(output_file, 'w') as output_file_handle:
# 将ShareGPT格式数据写入文件,使用indent=4进行缩进格式化,使文件内容更易读
json.dump(sharegpt_format, output_file_handle, indent=4)
if __name__ == "__main__":
# 创建一个ArgumentParser对象,用于定义和解析命令行参数
parser = argparse.ArgumentParser(description="Convert data to ShareGPT format.")
# 添加一个名为input_file的命令行参数,指定为字符串类型,用于接收输入JSON文件的路径,并提供帮助信息
parser.add_argument("input_file", type=str, help="Path to the input JSON file.")
# 添加一个名为output_file的命令行参数,指定为字符串类型,用于接收输出JSON文件的路径,并提供帮助信息
parser.add_argument("output_file", type=str, help="Path to the output JSON file.")
args = parser.parse_args() # 解析命令行参数
# 调用convert_to_sharegpt_format函数,传入解析后的输入和输出文件路径参数,执行数据转换
convert_to_sharegpt_format(args.input_file, args.output_file)
(三)ShareGPT多模态示例讲解
- 多模态支持:ShareGPT格式支持多模态数据集,除了文本对话外,还可以包含图像、视频等信息。
- 示例结构:
# 定义一个ShareGPT多模态示例数据
sharegpt_multimodal_example = {
"conversations": [ # 对话列表
{"from": "human", "value": "<image>描述这张图片中的水果"}, # 人类提问,包含图像相关指令
{"from": "gpt", "value": "这张图片中的水果是苹果"} # 模型回答
],
"images": ["image_path.jpg"], # 图像路径列表,指定相关图像的路径
"system": "你是一个图像识别助手" # 系统提示词,设定模型的角色
}
在这个示例中,“conversations”列表记录了对话内容,“images”字段指定了相关图像的路径。当模型处理这样的数据时,不仅要理解文本指令,还可能需要结合图像信息生成更准确的回复。在实际应用中,多模态数据可以让模型学习到更丰富的信息,提升其在复杂任务中的表现。例如,在图像问答系统中,用户可以通过文本询问关于图像内容的问题,模型结合图像和文本信息进行回答。
五、数据集注册
(一)注册文件配置
在LLaMA - Factory/data/dataset_info.json文件中定义数据集。
- Alpaca格式配置:
{
"alpaca_dev": {
"file_name": "alpaca_dev.json", // 指定Alpaca格式数据集的文件名
"columns": {
"prompt": "instruction", // 将prompt映射到instruction字段
"query": "input", // 将query映射到input字段
"response": "output", // 将response映射到output字段
"system": "system", // 将system映射到system字段(可选)
"history": "history" // 将history映射到history字段(可选)
}
}
}
- ShareGPT格式配置:
{
"sharegpt_cosql_train": {
"file_name": "sharegpt_cosql_train.json", // 指定ShareGPT格式数据集的文件名
"formatting": "sharegpt", // 明确数据集格式为ShareGPT
"columns": {
"messages": "conversations", // 将messages映射到conversations字段
"system": "system", // 将system映射到system字段(可选)
"tools": "tools" // 将tools映射到tools字段(可选)
},
"tags": {
"role_tag": "from", // 角色标签映射到from字段
"content_tag": "value", // 内容标签映射到value字段
"user_tag": "user", // 用户标签映射到user(可自定义,与数据中的角色对应)
"assistant_tag": "assistant" // 助手标签映射到assistant(可自定义,与数据中的角色对应)
}
}
}

(二)文件存放与注意事项
- 文件存放:数据集文件需放置在LLaMA - Factory/data目录下。如果使用相对路径,要确保路径准确,与dataset_info.json文件中的配置一致。例如,如果数据集文件存放在data目录下的sub文件夹中,那么在dataset_info.json中配置的文件名应包含sub文件夹路径,如“sub/your_dataset.json”。
- 注意事项:在配置dataset_info.json文件时,对于数据集中不存在的字段,不要填写,否则可能导致数据异常。例如,如果数据集中没有“tools”字段,在ShareGPT格式的配置中就不要添加“tools”相关内容。此外,不同版本的LLaMA - Factory可能对配置有不同要求,若遇到问题,可查看对应版本的文档或在相关社区咨询。
六、数据集查看与模型微调准备
(一)启动服务查看数据集
- 启动命令:使用以下命令启动LLaMA - Factory服务:
export USE_MODELSCOPE_HUB = 1 # 设置使用ModelScope Hub,可根据实际情况调整
export CUDA_VISIBLE_DEVICES = 0,1 # 指定使用的CUDA设备,可根据硬件配置修改
nohup llamafactory - cli webui > 20241119.10g 2>&1 & # 启动服务并将日志输出到指定文件
- 查看数据集:服务启动后,访问界面http://192.168.110.133:7860/Train标签,可以查看数据集。但目前只能查看第一个数据集的内容。在查看时,若无法正常显示或出现错误,可能是数据集注册有误、文件路径错误或服务启动过程中出现问题,需要逐步排查。
(二)模型微调的考量
- 模型选择:在进行模型微调前,需确保数据准备、注册等环节已完成。对于新手,建议优先使用框架进行微调,这样可以熟悉相关参数,便于后续深入学习。在选择基础模型时,既可以选择在NL2SQL领域表现较好的模型(进行专项微调,也可以选择更基础的模型从头开始训练,具体取决于个人需求和目标 。
- 数据适配:有提问训练完的模型能否直接适配自己的场景。如果是NL2SQL场景,用这里的数据训练模型通常可行;若不是该场景,则建议寻找适合自身场景的数据集进行微调。同时,若使用LLaMA-Factory,数据格式需为Alpaca或ShareGPT格式,内容可自定义,但要符合格式要求。
- 数据集使用:对于为什么要使用特定数据集,是因为这些数据集是针对自然语言转SQL场景进行调研和准备的,能满足该场景下模型微调的需求。如果有其他开源数据集,只要符合LLaMA-Factory支持的格式也可使用 。
七、总结
本笔记全面介绍了LLaMA - Factory框架下数据集的使用与注册流程,涵盖了NL2SQL技术基础、数据集格式、数据处理与转换、数据集注册和模型微调准备等内容。在实际操作中,开发者应根据具体任务需求选择合适的数据集和模型,严格按照流程进行数据处理与注册,为高质量的模型训练奠定基础。
1432

被折叠的 条评论
为什么被折叠?



