LLaMA-Factory之数据集使用与注册(NL2SQL)

部署运行你感兴趣的模型镜像

LLaMA-Factory数据集使用与注册

一、NL2SQL技术概述

(一)定义与应用场景

NL2SQL(Natural Language to SQL),也叫text2SQL。在数据分析场景中,用户可以用自然语言提出“查询2023年销售额大于100万的产品”,系统将其转换为相应的SQL语句在数据库中查询。

(二)大模型微调的必要性

单纯使用RAG(检索增强生成)技术,大模型很难准确理解如何编写正确的SQL语句。因此,在NL2SQL场景中,需要对大模型进行微调。大模型微调的必备条件包括:有大模型、有对应领域的数据、使用资源或框架。

二、数据集格式详解

(一)Alpaca格式

  1. 格式结构:Alpaca格式适合单轮指令微调,强调指令与响应的直接关系。其数据结构包含以下字段:
    • “instruction”(必填):用户指令,用于引导模型生成特定响应,类似于模型的prompt。
    • “input”(选填):用户输入信息,可补充指令相关的额外内容。
    • “output”(必填):模型的回答。
    • “system”(选填):系统提示词,可用于设置模型的背景信息或特定规则。
    • “history”(选填):用于记录多轮对话历史,但在单轮对话中通常不使用。
  2. 示例
# 定义一个Alpaca格式的示例数据
alpaca_example = {
    "instruction": "写一篇关于苹果的短文",  # 指令:要求模型写一篇关于苹果的短文
    "input": "",  # 这里没有额外输入信息,所以为空字符串
    "output": "苹果是一种常见的水果,富含维生素和营养。它有多种颜色,如红色、绿色和黄色。"  # 模型针对指令给出的回答
}

(二)ShareGPT格式

  1. 格式结构:ShareGPT格式适用于多轮对话微调,能够处理复杂的对话场景。其数据结构主要包含以下部分:
    • “conversations”(必填):对话列表,每个元素包含“from”(对话角色,如“human”表示人类输入,“gpt”表示模型回复)和“value”(对应角色的对话内容)。
    • “system”(选填):系统提示词,作用与Alpaca格式中的“system”类似。
    • “tools”(选填):工具描述信息,在涉及工具调用的场景中使用。
  2. 示例
# 定义一个ShareGPT格式的示例数据
sharegpt_example = {
    "conversations": [  # 对话列表
        {"from": "human", "value": "你知道苹果吗?"},  # 人类提问
        {"from": "gpt", "value": "知道,苹果是一种常见水果。"}  # 模型回答
    ]
}

(三)两种格式对比及应用场景选择

  1. 对比:Alpaca格式结构简单,适用于单轮对话任务;ShareGPT格式能更好地处理多轮对话,支持多种角色和更丰富的对话场景。
  2. 应用场景选择:在简单的问答、文本生成等单轮任务中,优先选择Alpaca格式;在聊天机器人、虚拟助手等需要自然交互和保持对话上下文的多轮对话场景中,ShareGPT格式更为合适。两种格式的数据在LLaMA - Factory中可以混合使用,以增加训练数据的多样性,提升模型的泛化能力和任务适应性。

三、数据集的寻找与选择

(一)国外资源

Hugging Face上有许多相关数据集,如:

  • gretelai/synthetic_text_to_sql
  • lamini/bird_text_to_sql等
    可以根据任务需求和数据集特点进行选择。

(二)其他公开数据集

  1. wikisQL:属于单领域数据集,包含80654个自然语言问题和77840个SQL语句。SQL语句形式简单,不包含排序、分组、子查询等复杂操作。
  2. CoSQL:西安交通大学和微软等提出的跨领域、多轮Text - to - SQL中文数据集,包含5459个多轮问题组成的列表和17940个<query, SQL>二元组。
  3. BIRD - SQL:香港大学和阿里巴巴提出的大规模跨域数据集,包含超过12751个独特的问题SQL、95个大数据库,总大小为33.4GB,涵盖超过37个专业领域。还有BIRD - SQL Mini - Dev,从11个不同数据库中编译了500个高质量的text2SQL对,并支持MySQL和PostgreSQL。

四、数据处理与转换

(一)转换为Alpaca格式

  1. 转换思路:以bird数据为例,将“question”对应Alpaca格式的“instruction”,“evidence”对应“input”,“SQL”对应“output”。
  2. 代码示例
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格式

  1. 转换思路:同样以bird数据为例,将“question”对应“human”的“value”,“SQL”对应“gpt”的“value”,并构建“conversations”列表。
  2. 代码示例
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多模态示例讲解

  1. 多模态支持:ShareGPT格式支持多模态数据集,除了文本对话外,还可以包含图像、视频等信息。
  2. 示例结构
# 定义一个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文件中定义数据集。

  1. 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字段(可选)
        }
    }
}
  1. 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(可自定义,与数据中的角色对应)
        }
    }
}

在这里插入图片描述

(二)文件存放与注意事项

  1. 文件存放:数据集文件需放置在LLaMA - Factory/data目录下。如果使用相对路径,要确保路径准确,与dataset_info.json文件中的配置一致。例如,如果数据集文件存放在data目录下的sub文件夹中,那么在dataset_info.json中配置的文件名应包含sub文件夹路径,如“sub/your_dataset.json”。
  2. 注意事项:在配置dataset_info.json文件时,对于数据集中不存在的字段,不要填写,否则可能导致数据异常。例如,如果数据集中没有“tools”字段,在ShareGPT格式的配置中就不要添加“tools”相关内容。此外,不同版本的LLaMA - Factory可能对配置有不同要求,若遇到问题,可查看对应版本的文档或在相关社区咨询。

六、数据集查看与模型微调准备

(一)启动服务查看数据集

  1. 启动命令:使用以下命令启动LLaMA - Factory服务:
export USE_MODELSCOPE_HUB = 1  # 设置使用ModelScope Hub,可根据实际情况调整
export CUDA_VISIBLE_DEVICES = 0,1  # 指定使用的CUDA设备,可根据硬件配置修改
nohup llamafactory - cli webui > 20241119.10g 2>&1 &  # 启动服务并将日志输出到指定文件
  1. 查看数据集:服务启动后,访问界面http://192.168.110.133:7860/Train标签,可以查看数据集。但目前只能查看第一个数据集的内容。在查看时,若无法正常显示或出现错误,可能是数据集注册有误、文件路径错误或服务启动过程中出现问题,需要逐步排查。

(二)模型微调的考量

  1. 模型选择:在进行模型微调前,需确保数据准备、注册等环节已完成。对于新手,建议优先使用框架进行微调,这样可以熟悉相关参数,便于后续深入学习。在选择基础模型时,既可以选择在NL2SQL领域表现较好的模型(进行专项微调,也可以选择更基础的模型从头开始训练,具体取决于个人需求和目标 。
  2. 数据适配:有提问训练完的模型能否直接适配自己的场景。如果是NL2SQL场景,用这里的数据训练模型通常可行;若不是该场景,则建议寻找适合自身场景的数据集进行微调。同时,若使用LLaMA-Factory,数据格式需为Alpaca或ShareGPT格式,内容可自定义,但要符合格式要求。
  3. 数据集使用:对于为什么要使用特定数据集,是因为这些数据集是针对自然语言转SQL场景进行调研和准备的,能满足该场景下模型微调的需求。如果有其他开源数据集,只要符合LLaMA-Factory支持的格式也可使用 。

七、总结

本笔记全面介绍了LLaMA - Factory框架下数据集的使用与注册流程,涵盖了NL2SQL技术基础、数据集格式、数据处理与转换、数据集注册和模型微调准备等内容。在实际操作中,开发者应根据具体任务需求选择合适的数据集和模型,严格按照流程进行数据处理与注册,为高质量的模型训练奠定基础。

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值