由 MotherDuck 和 Numbers Station 共同开发的 70 亿参数文本到 SQL 模型。

7b

24.9K 9 个月前

自述文件

duckdb-nsql model

DuckDB-NSQL 是一个专门为 SQL 生成任务设计的 70 亿参数文本到 SQL 模型。

此模型基于 Meta 的原始 Llama-2 7B 模型,并在通用 SQL 查询数据集上进一步预训练,然后在由 DuckDB 文本到 SQL 对组成的 数据集上微调。

使用方法

示例提示

Provided this schema:

CREATE TABLE taxi (
    VendorID bigint,
    tpep_pickup_datetime timestamp,
    tpep_dropoff_datetime timestamp,
    passenger_count double,
    trip_distance double,
    fare_amount double,
    extra double,
    tip_amount double,
    tolls_amount double,
    improvement_surcharge double,
    total_amount double,
);

Give me taxis with more than 2 passengers

示例输出

SELECT * FROM taxi WHERE passenger_count > 2

设置系统提示

此模型期望系统提示中的 schema 作为输入。

/set system """Here is the database schema that the SQL query will run on:
CREATE TABLE taxi (
    VendorID bigint,
    tpep_pickup_datetime timestamp,
    tpep_dropoff_datetime timestamp,
    passenger_count double,
    trip_distance double,
    fare_amount double,
    extra double,
    tip_amount double,
    tolls_amount double,
    improvement_surcharge double,
    total_amount double,
);"""

一旦 schema 在系统提示中提供,模型将在后续响应中使用它。

对于以下提示

get all columns ending with _amount from taxi table

模型将输出类似于以下内容

SELECT COLUMNS('.*_amount') FROM taxi;

API 示例

$ curl https://127.0.0.1:11434/api/generate -d '{
    "model": "duckdb-nsql:7b-q4_0",
    "system": "Here is the database schema that the SQL query will run on: CREATE TABLE taxi (VendorID bigint, tpep_pickup_datetime timestamp, tpep_dropoff_datetime timestamp, passenger_count double, trip_distance double, fare_amount double, extra double, tip_amount double, tolls_amount double, improvement_surcharge double, total_amount double,);",
    "prompt": "get all columns ending with _amount from taxi table"
}'

Python 库示例

pip install ollama
import ollama

r = ollama.generate(
    model='duckdb-nsql:7b-q4_0',
    system='''Here is the database schema that the SQL query will run on:
CREATE TABLE taxi (
    VendorID bigint,
    tpep_pickup_datetime timestamp,
    tpep_dropoff_datetime timestamp,
    passenger_count double,
    trip_distance double,
    fare_amount double,
    extra double,
    tip_amount double,
    tolls_amount double,
    improvement_surcharge double,
    total_amount double,
);''',
    prompt='get all columns ending with _amount from taxi table',
)

print(r['response'])

训练数据

20 万个 DuckDB 文本到 SQL 对,使用 Mixtral-8x7B-Instruct-v0.1 合成生成,并由 DuckDB v0.9.2 文档指导。还包括来自 NSText2SQL 的文本到 SQL 对,使用 sqlglot 转换为 DuckDB SQL。

训练流程

DuckDB-NSQL 使用交叉熵损失进行训练,以最大程度地提高顺序输入的可能性。对于在文本到 SQL 对上的微调,我们仅计算 SQL 部分对的损失。模型使用 80GB A100 进行训练,利用数据和模型并行化。我们微调了 10 个 epoch。

预期用途和局限性

该模型专为从给定的表 schema 和自然语言提示生成文本到 SQL 任务而设计。该模型在以下定义的提示格式和输出中表现最佳。与现有的文本到 SQL 模型不同,SQL 生成不受限于 SELECT 语句,而是可以生成任何有效的 DuckDB SQL 语句,包括针对官方 DuckDB 扩展的语句。

参考资料

Hugging Face