关键要点
- 研究表明,面向数据库场景的大模型交互微调数据集通常包括数据库模式、自然语言查询和对应的SQL查询。
- 证据倾向于认为,数据集应以JSON格式组织,覆盖多种查询类型,并确保高质量和多样性。
- 对于自定义数据库,建议分析模式、收集查询、标注SQL,并参考现有数据集如synthetic_tex_to_sql或sql-create-context。
直接回答
在设计面向数据库场景的大模型交互微调数据集结构时,数据集通常包括以下几个部分:
数据集结构
- 数据库模式:提供表结构、列名和关系,例如以SQL的CREATE TABLE语句形式。
- 自然语言查询:用户的问题,如"纽约的所有客户姓名是什么?"。
- SQL查询:对应的SQL语句,如"SELECT name FROM customers WHERE city = 'New York';"。
数据集通常以JSON格式组织,例如:
json
{
"instruction": "Given the following database schema:\nCREATE TABLE customers (customer_key INT, name VARCHAR, city VARCHAR);\nAnswer the following question:",
"input": "What are the names of all customers in New York?",
"output": "SELECT name FROM customers WHERE city = 'New York';"
}
或者:
json
{
"question": "What are the names of all customers in New York?",
"context": "CREATE TABLE customers (customer_key INT, name VARCHAR, city VARCHAR);",
"answer": "SELECT name FROM customers WHERE city = 'New York';"
}
设计建议
- 确保数据集覆盖SELECT、JOIN、聚合等各种查询类型。
- 对于自定义数据库,建议从现有数据集(如Improving Text-to-SQL with a Fine-Tuned 7B LLM for DB Interactions中提到的synthetic_tex_to_sql,100k样本)开始,并根据需要扩展。
- 使用高效微调方法如QLoRA,适合7B或更大参数的模型。
一个意外的细节是,数据集可以包括样本数据或使用合成数据生成技术来增强多样性,这可能帮助模型更好地适应复杂查询。
详细报告
在设计面向数据库场景的大模型交互微调数据集结构时,特别是针对文本到SQL(text-to-SQL)任务,目标是使模型能够根据给定的数据库模式理解自然语言查询并生成准确的SQL查询。以下是详细的分析和建议,涵盖数据集的组成、特性、设计考虑和相关资源。
数据集结构的组成
微调数据集的核心包括以下几个关键部分:
-
数据库模式(Schema):
-
数据库模式提供生成SQL查询的必要上下文,包括表名、列名、数据类型、主键、外键和表间关系。
-
例如,一个客户管理数据库可能包括"Customer"表,列如"customer_key"、"name"、"city"等,模式信息可能如下:
- 表:Customer
- 列:customer_key (INT, PRIMARY KEY), name (VARCHAR), city (VARCHAR)
-
模式信息可以作为数据集的一部分直接包含,或作为输入的额外上下文提供,通常以SQL的CREATE TABLE语句形式,例如:
sqlCREATE TABLE customers (customer_key INT, name VARCHAR, city VARCHAR);
-
也可以以JSON格式提供,例如:
json{ "tables": [ { "name": "customers", "columns": [ {"name": "customer_key", "type": "INT"}, {"name": "name", "type": "VARCHAR"}, {"name": "city", "type": "VARCHAR"} ] } ] }
-
-
自然语言查询(NLQ):
- 这是用户可能提出的问题或命令,用自然语言表达。例如,"纽约的所有客户姓名是什么?"或"统计每个城市的客户数量"。
- 为了确保模型的泛化能力,NLQ应涵盖各种查询类型,包括检索(SELECT)、聚合(COUNT、SUM)、数据操作(INSERT、UPDATE、DELETE)等复杂场景。
- NLQ的多样性很重要,应包括不同措辞和复杂度的查询,以反映真实用户需求。
-
SQL查询:
- 每个NLQ对应一个准确的SQL查询,用于执行或回答自然语言请求。例如,对应"纽约的所有客户姓名是什么?"的SQL可能是"SELECT name FROM customers WHERE city = 'New York'"。
- SQL查询必须与数据库模式兼容,且无语法错误,确保可执行性。
-
可选:样本数据:
- 虽然不是必需的,但包括数据库的样本数据(如几行记录)可以帮助模型更好地理解查询上下文,特别是在涉及复杂条件或聚合的场景。
数据集的特性
为了确保微调效果,数据集应具备以下特性:
-
多样性:
- 覆盖各种查询类型,从简单的SELECT语句到复杂的JOIN、子查询和聚合操作。
- 应包括不同领域的数据库场景,确保模型在多种上下文下的泛化能力。
- 例如,涵盖客户管理、库存管理、财务报表等不同应用场景。
-
质量:
- 每个NLQ-SQL对必须准确无误,避免歧义或错误。
- 数据集应经过清洗,确保NLQ清晰、SQL可执行,必要时可使用工具验证SQL的正确性。
-
大小:
- 研究表明,较大的数据集通常效果更好,但对于自定义数据库,初始数据集可能较小。
- 例如,synthetic_tex_to_sql数据集包含100k样本,sql-create-context有78.6k样本,均适合文本到SQL任务。
- 如果数据有限,可通过数据增强技术(如NLQ的同义改写)增加多样性。
数据集格式示例
以下是两种常见的数据集格式:
格式类型 | 示例结构 |
---|---|
格式1 | {"instruction": "模式信息\n问题", "input": "NLQ", "output": "SQL"} |
格式2 | {"question": "NLQ", "context": "模式信息", "answer": "SQL"} |
具体示例:
-
格式1:
json{ "instruction": "Given the following database schema:\nCREATE TABLE customers (customer_key INT, name VARCHAR, city VARCHAR);\nAnswer the following question:", "input": "What are the names of all customers in New York?", "output": "SELECT name FROM customers WHERE city = 'New York';" }
-
格式2:
json{ "question": "What are the names of all customers in New York?", "context": "CREATE TABLE customers (customer_key INT, name VARCHAR, city VARCHAR);", "answer": "SELECT name FROM customers WHERE city = 'New York';" }
设计自定义数据库数据集的步骤
对于特定数据库的微调数据集,建议按以下步骤设计:
-
分析数据库:
- 理解目标数据库的模式,包括表结构、关系和常见查询模式。
- 识别用户可能提出的查询类型,例如客户信息检索、库存统计、销售分析等。
-
收集或生成NLQ:
- 从真实用户日志中收集NLQ,或使用生成工具(如基于现有数据集的扩展)创建合成查询。
- 确保NLQ覆盖简单到复杂的各种场景,并考虑不同措辞。
-
标注SQL查询:
- 为每个NLQ手动或半自动生成对应的SQL查询,确保与数据库模式兼容。
- 可使用现有工具辅助生成,并由专家验证准确性。
-
包含模式信息:
- 确保数据集包括或引用数据库模式,例如以JSON格式提供表和列的定义。
- 模式信息可以作为每个数据点的附加字段,或作为单独的模式文件。
-
格式化以适配微调:
- 将数据集组织为适合微调的格式,例如JSON或CSV。
- 参考上述格式示例,确保与微调工具(如Hugging Face Transformers)兼容。
微调技术和评估
-
微调方法:
- 可以使用高效的微调技术如QLoRA(量化低秩适配),特别适合7B或更大参数的模型,减少计算资源需求。
- 这些方法允许在较小数据集上取得良好效果,尤其适合自定义数据库场景。
-
模型评估:
- 在微调过程中,使用验证数据集评估模型性能,常用指标包括:
- 精确匹配准确率(Exact Match Accuracy):生成的SQL是否完全匹配目标SQL。
- 执行准确率(Execution Accuracy):生成的SQL是否产生正确的结果。
- 根据性能调整数据集或微调参数,确保模型泛化能力。
- 在微调过程中,使用验证数据集评估模型性能,常用指标包括:
相关资源和示例
以下是现有数据集的示例,可作为参考:
数据集名称 | 样本数量 | 描述 | 访问链接 |
---|---|---|---|
synthetic_tex_to_sql | 100k | 合成文本到SQL样本,覆盖多种领域,约23M tokens | Hugging Face |
sql-create-context | 78.6k | WikiSQL和Spider数据集的清洗和增强版本 | Hugging Face |
这些数据集提供NLQ-SQL对和模式信息,适合文本到SQL任务的微调。
实际建议
- 如果从头开始,建议参考现有数据集(如synthetic_tex_to_sql或sql-create-context)结构,结合自定义数据库需求调整。
- 对于数据有限的情况,可使用数据增强技术,如NLQ的同义改写或生成更多合成查询。
- 利用Hugging Face平台探索和下载相关数据集,加速设计过程。
额外细节
一个值得注意的细节是,数据集可以包括样本数据或使用合成数据生成技术(如使用GPT-4生成),这可能帮助模型更好地适应复杂查询场景。例如,Generating Synthetic Text2SQL Instruction Dataset to Fine-tune Code LLMs中描述了使用GPT-4生成"业务问题"-"SQL查询"对的方法。
关键引文
- Improving Text-to-SQL with a Fine-Tuned 7B LLM for DB Interactions
- Enhancing Text-to-SQL with a Fine-Tuned 7B LLM for Database Interactions
- 10 Datasets for Fine-Tuning Large Language Models Detailed List
- GitHub - Zjh-819/LLMDataHub: A quick guide (especially) for trending instruction finetuning datasets
- SQL Generation in Text2SQL with TinyLlama's LLM Fine-tuning
- Easily Finetune Llama 2 for Your Text-to-SQL Applications --- LlamaIndex
- How to Fine-Tune LLMs on Custom Datasets | JFrog ML
- Fine-Tuning the LLM Mistral-7b for Text-to-SQL with SQL-Create-Context Dataset | The Deep Hub
- GitHub - mlabonne/llm-datasets: Curated list of datasets and tools for post-training.
- Generating Synthetic Text2SQL Instruction Dataset to Fine-tune Code LLMs