写点什么

NL2SQL 实践系列 (2):2024 最新模型实战效果 (Chat2DB-GLM、书生·浦语 2、InternLM2-SQL 等) 以及工业级案例教学

  • 2024-04-19
    浙江
  • 本文字数:9187 字

    阅读完需:约 30 分钟

NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学

SQL 实践系列(2):更多模型使用以及工业级案例

NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL]


NL2SQL基础系列(2):主流大模型与微调方法精选集,Text2SQL经典算法技术回顾七年发展脉络梳理


NL2SQL进阶系列(1):DB-GPT-Hub、SQLcoder、Text2SQL开源应用实践详解


NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解[Text2SQL]


NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]


☆☆NL2SQL进阶系列(4):ConvAI、DIN-SQL、C3-浙大、DAIL-SQL-阿里等16个业界开源应用实践详解[Text2SQL]


☆☆NL2SQL进阶系列(5):论文解读业界前沿方案(DIN-SQL、C3-SQL、DAIL-SQL、SQL-PaLM)、新一代数据集BIRD-SQL解读


NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧


NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学


NL2SQL 任务的目标是将用户对某个数据库的自然语言问题转化为相应的 SQL 查询。随着 LLM 的发展,使用 LLM 进行 NL2SQL 已成为一种新的范式。在这一过程中,如何利用提示工程来发掘 LLM 的 NL2SQL 能力显得尤为重要。

1.SPACE-T 表格问答预训练模型(英文通用领域)-2022.12.12 更新

1.1 SPACE-T 多轮表格知识预训练语言模型介绍

该模型是一个多轮表格知识预训练语言模型,可用于解决下游的多轮 Text-to-SQL 语义解析任务。模型采用基于模板和回译方法生成的全小写英文合成语料进行预训练。


本项目的模型是基于一个多轮 Text-to-SQL 数据集 CoSQL 微调后的下游模型,可针对不同领域数据库和用户直接进行多轮对话,生成相应的 SQL 查询语句。用户可以在对话过程中表达自己对数据库模式的查询要求,并在系统的帮助下生成符合要求的 SQL 查询语句。


  • 模型描述


本模型采用人工构建的多轮 Text-to-SQL 预训练数据进行预训练,采用统一的单个 Transformer 架构作为模型底座。 模型采用半监督的方式在多轮 Text-to-SQL 预训练数据上进行训练,采用 3 个预训练目标:模式状态追踪建模,对话依赖追踪建模和掩码语言建模,最后以多任务学习的方式进行训练。



在下游任务 Text-to-SQL 微调的时候,我们直接利用本模型作为底座,基于常用的下游模型 lgesql 进行微调得到。 具体做法就是将 lgesql 的 ELECTRA 底座替换成本模型, 并修改输入格式,其余保持不变,效果上即可得到显著提升。

1.2 模型使用方式以及适用范围

你可以使用本模型针对任意领域进行对话。 输入用户语句和相应的数据库,模型就能够开始多轮交互,帮助用户生成当前对话相应的 SQL 查询语句。


  • 如何使用


你可以直接通过一个流水线使用模型用于多轮 Text-to-SQL 语义解析任务,在 notebook 中选择 V100 GPU 环境:


  • 代码范例


pip install text2sql_lgesql  -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html#如果使用gpupip install  dgl-cu113 -f https://data.dgl.ai/wheels/repo.html
复制代码


from modelscope.models import Modelfrom modelscope.pipelines import pipelinefrom modelscope.preprocessors import ConversationalTextToSqlPreprocessorfrom modelscope.utils.constant import Tasks
model_id = 'damo/nlp_star_conversational-text-to-sql'test_case = { "database_id": 'employee_hire_evaluation', 'local_db_path':None, "utterance":[ "I'd like to see Shop names.", "Which of these are hiring?", "Which shop is hiring the highest number of employees? | do you want the name of the shop ? | Yes"]}
model = Model.from_pretrained(model_id)preprocessor = ConversationalTextToSqlPreprocessor(model_dir=model.model_dir)pipeline = pipeline( task=Tasks.table_question_answering, model=model, preprocessor=preprocessor)last_sql, history = '', []for item in test_case['utterance']: case = {"utterance": item, "history": history, "last_sql": last_sql, "database_id": test_case['database_id'], 'local_db_path': test_case['local_db_path']} results = pipeline(case) print(results) history.append(item)
复制代码


NOTE: 本项目支持用户使用本地自定义的的数据库,请仿照 db 文件和 tables.json 文件设置数据库格式,并传入正确的地址'local_db_path'。


  • 对话样例



  • 模型局限性以及可能的偏差


本模型基于 CoSQL 数据集 (多轮 Text-to-sql 数据集) 训练,训练数据有限,效果可能存在一定偏差。由于下游任务是都是限定领域的对话,不宜像使用闲聊对话系统一样进行开放域测试。本项目支持用户使用本地自定义的的数据库,但由于训练数据有限,效果可能存在较大偏差,请用户自行评测后决定如何使用.


  • 训练数据介绍


CoSQL 是一个跨领域的多轮 Text-to-SQL 数据,是多轮 Text-to-SQL 最受欢迎的 benchmark,一共包括了 1.5 万个 Text-to-SQL sessions。详见 CoSQL.


  • 数据评估及结果


模型进行多轮 Text-to-SQL 语义解析任务,在 CoSQL 数据集上取得了 SOTA 指标:


  • Task:多轮 Text-to-SQL 解析任务 CoSQL



NOTE: Question Match 表示所有问题的 SQL 查询语句的精确匹配度,Interaction Match 表示所有正确预测的问题的交互率。


  • 相关论文及引用


使用到的模型参考一些论文,相关代码可以参考团队代码仓库

2.OFA 文生 SQL(英文通用领域)-2023.01.06

2.1 OFA 简介

OFA(One-For-All) 是通用多模态预训练模型,使用简单的序列到序列的学习框架统一模态(跨模态、视觉、语言等模态)和任务(如图片生成、视觉定位、图片描述、图片分类、文本生成等),详见我们发表于 ICML 2022 的论文:OFA: Unifying Architectures, Tasks, and Modalities Through a Simple Sequence-to-Sequence Learning Framework,以及我们的官方 Github 仓库 https://github.com/OFA-Sys/OFA



玩转 OFA 只需区区以下数行代码,就是如此轻松!如果你觉得还不够方便,请点击右上角Notebook按钮,我们为你提供了配备好的环境(可选 CPU/GPU),你只需要在 notebook 里输入提供的代码,就可以把 OFA 玩起来了!


from modelscope.pipelines import pipelinefrom modelscope.utils.constant import Tasksfrom modelscope.outputs import OutputKeysofa_pipe = pipeline(    Tasks.text2sql,    model='damo/ofa_text2sql_spider_large_en')
text = 'Show all book categories and the number of books in each category.'database = 'culture_company' # optional, default `culture_company`input = {'text': text, 'database': database}result = ofa_pipe(input)print(result[OutputKeys.TEXT]) # select category, count(*) from book_club group by category
复制代码

2.2 OFA-text2sql 模型效果


  • OFA 模型规模:


2.3 模型训练流程

  • 训练数据介绍


本模型训练数据集是 spider 中的 Text-to-SQL 数据集。


  • 训练流程


finetune 能力请参考 OFA Tutorial 1.4 节。


3. SPACE-T 表格问答预训练模型-(中文通用领域) 2023.2.2

3.1 SPACE-T 表格问答中文大规模预训练模型介绍

中文表格问答(TableQA)模型是一个多轮表格知识预训练语言模型,可用于解决下游的多轮 Text-to-SQL 语义解析任务。该模型并通过海量中文表格数据预训练 (千万级),在中文 Text2SQL 数据集上取得不错的效果。本模型是 SPACE 系列模型的一员,SPACE-T(SPACE-Table 的简称),SPACE 系列的其他模型可参考 SPACE 预训练对话模型。团队其他研究进展可以参考 DAMO-ConvAI


任务简要描述:给定表格(例如基金信息表)的情况下,用户输入基于表格的自然语言问题(例如,XX 公司的基金有哪些风险类型?),模型会将用户的自然语言问题转化成 SQL 查询语句(例如,SELECT 风险类型 FROM 基金信息表 WHERE 公司名称 = XX),并且在该表格对应的数据库中执行该 SQL 语句,从而返回查询结果(例如,“低风险”、“中高风险”);(详细示例见代码范例)


  • 模型描述


中文 Text2SQL 大规模预训练模型采用大规模的中文表格进行预训练,并且在 Text2SQL 数据集上进行微调,使得模型具备理解各种领域的表格知识的基础能力,可用于解决下游的多轮 Text-to-SQL 语义解析任务。


模型结构上,采用统一的 Transformer 架构作为模型底座,对输入的自然语言问题和表格的 schema 结构进行理解。然后,采用 sketch-based 方法分别预测 SQL 语句中 select 子句和 where 子句,从而构成最终的 SQL 语句。模型结构如下图:



  • DEMO 示例


本模型有对应的 DEMO 示例已经上线,但是由于这里的 DEMO 界面较为简单无法展现历史对话,因此 DEMO 只支持单轮问答的结果,如果用户想体验多轮对话的效果,可以通过代码范例里的逻辑进行调用。


另外,SPACE-T 表格问答支持同比、环比、折线 / 柱状图等展示的功能,已经在表格 BI 问答中上线,感兴趣可以跳转到此进行试用和进一步开发。



3.2 模型能力描述

  • 基础能力表格


基础能力指的是模型具备的一些原子能力,可以通过右侧的在线体验直接进行测试这些能力。



  • 组合能力表格


组合能力指的是对基础能力的组合,例如用户提出的问题可能包含模型的多种基础能力,在此情况下,模型也能正确预测。如下表示例:


3.3 快速使用

你可以直接通过一个流水线使用模型用于多轮 Text-to-SQL 语义解析任务:


  • 代码范例


使用 TableQA - 中文 - 通用领域 - base 模型需要安装 modelscope,安装方法在文档中心里可以找到。安装完成后,运行如下代码即可进行模型预测。


import os, jsonfrom transformers import BertTokenizerfrom modelscope.models import Modelfrom modelscope.outputs import OutputKeysfrom modelscope.pipelines import pipelinefrom modelscope.preprocessors import TableQuestionAnsweringPreprocessorfrom modelscope.preprocessors.nlp.space_T_cn.fields.database import Databasefrom modelscope.utils.constant import ModelFile, Tasks
model_id = 'damo/nlp_convai_text2sql_pretrain_cn'test_case = { 'utterance': [['长江流域的小型水库的库容总量是多少?', 'reservoir'], ['那平均值是多少?', 'reservoir'], ['那水库的名称呢?', 'reservoir'], ['换成中型的呢?', 'reservoir']]}
model = Model.from_pretrained(model_id)tokenizer = BertTokenizer( os.path.join(model.model_dir, ModelFile.VOCAB_FILE))db = Database( tokenizer=tokenizer, table_file_path=os.path.join(model.model_dir, 'table.json'), syn_dict_file_path=os.path.join(model.model_dir, 'synonym.txt'), is_use_sqlite=True)preprocessor = TableQuestionAnsweringPreprocessor( model_dir=model.model_dir, db=db)pipelines = [ pipeline( Tasks.table_question_answering, model=model, preprocessor=preprocessor, db=db)]
for pipeline in pipelines: historical_queries = None for question, table_id in test_case['utterance']: output_dict = pipeline({ 'question': question, 'table_id': table_id, 'history_sql': historical_queries })[OutputKeys.OUTPUT] print('question', question) print('sql text:', output_dict[OutputKeys.SQL_STRING]) print('sql query:', output_dict[OutputKeys.SQL_QUERY]) print() historical_queries = output_dict[OutputKeys.HISTORY]
复制代码


  • 训练范例


调用 fine-tuning 流程可以参考下方的代码,依照情况调整超参数中的 batch_size、total_epoches 等。


import os, jsonfrom modelscope.msdatasets import MsDatasetfrom modelscope.trainers.nlp.table_question_answering_trainer import TableQuestionAnsweringTrainerfrom modelscope.utils.constant import DownloadMode
input_dataset = MsDataset.load( 'ChineseText2SQL', download_mode=DownloadMode.FORCE_REDOWNLOAD)train_dataset = []for name in input_dataset['train']._hf_ds.data[1]: train_dataset.append(json.load(open(str(name), 'r')))eval_dataset = []for name in input_dataset['test']._hf_ds.data[1]: eval_dataset.append(json.load(open(str(name), 'r')))print('size of training set', len(train_dataset))print('size of evaluation set', len(eval_dataset))
model_id = 'damo/nlp_convai_text2sql_pretrain_cn'trainer = TableQuestionAnsweringTrainer( model=model_id, train_dataset=train_dataset, eval_dataset=eval_dataset,)trainer.train( batch_size=8, total_epoches=2,)trainer.evaluate( checkpoint_path=os.path.join(trainer.model.model_dir, 'finetuned_model.bin'))
复制代码


  • 对话样例



  • 模型局限性以及可能的偏差


本项目支持用户使用本地自定义的的数据库进行预测,虽然本模型基于千万级且来源于各个领域的中文表格数据进行预训练,但是可能某些非常特殊的表格效果无法达到最优。另外,由于下游任务是都是限定领域的对话,不宜像使用闲聊对话系统一样进行开放域测试。


  • 测试集及评估结果


测试 TableQA - 中文 - 通用领域 - base 模型可以使用通用领域 Text2SQL 训练集中的 testset。评估结果如下(由于 ChineseText2SQL 数据集只提供了 100 条测试数据,因此测试结果并不完全一样):


4.Llama-2-13b-chat 微调-2023.11.06

llama-2-13b-chat 是 CarbonZ 项目组基于 llama2 进行 fine-tuning 的模型,专门用于将自然语言转换为 SQL 查询语言。这个模型在 text-to-sql 语料库上进行了训练和优化,因此能够将自然语言查询有效地转换为对应的 SQL 查询。这使得非技术用户也能够通过自然语言查询来获取他们需要的数据,极大地提升了数据访问的便捷性。


这个模型的主要目标是在垂直行业中进行专业数据代理。通过使用 llama-2-13b-chat,业务人员可以直接使用自然语言来查询数据库,而无需掌握复杂的 SQL 查询语法。这不仅可以提升业务人员的工作效率,也可以减少对 IT 人员的依赖。


例如,销售人员可以通过输入 "展示上个季度所有销售额超过 10000 美元的订单",llama-2-13b-chat 会将这个查询转换为对应的 SQL 查询,如 "SELECT * FROM orders WHERE sales > 10000 AND quarter ='Q2';"。


  • 特性

  • 强大的自然语言处理能力:基于 llama2 的强大语言模型,llama-2-13b-chat 能够理解复杂的自然语言查询,并准确地将其转换为 SQL 查询。

  • 广泛的语料库训练:模型在 text-to-sql 语料库上进行了训练,因此能够处理各种类型的自然语言查询。

  • 行业专用:模型可以适应垂直行业的特殊需求,例如金融、医疗、零售等行业的特定查询。


使用 llama-2-13b-chat 非常简单。你只需要将自然语言查询作为输入,模型将返回对应的 SQL 查询。例如:


query = "展示上个季度所有销售额超过 10000 美元的订单"sql = model.predict(query)print(sql)
复制代码


 git clone https://www.modelscope.cn/CarbonAgent/llama-2-13b-chat.Q4.git
复制代码

5.Model Card for NL2SQL-StarCoder-15B--2024.01.29

NL2SQL-StarCoder-15B 是在基础模型 StarCoder 上通过 QLoRA 对自然语言生成 SQL 任务进行微调的 15B Code-LLM。


  • Requirements

  • python>=3.8

  • pytorch>=2.0.0

  • transformers==4.32.0

  • CUDA 11.4

  • 推理数据格式


推理数据为模型在训练数据格式下拼接的字符串形式,它也是推理时输入 prompt 拼接的方式:


"""<|user|>/* Given the following database schema: */CREATE TABLE "table_name" ("col1" int,......)
/* Write a sql to answer the following question: {问题} */<|assistant|>```sql{输出SQL}```<|end|>"""
复制代码


  • 快速开始


import torchfrom modelscope import snapshot_download, AutoModelForCausalLM, AutoTokenizer,GenerationConfigmodel_dir = snapshot_download("iic/NL2SQL-StarCoder-15B")tokenizer = AutoTokenizer.from_pretrained(model_dir, device_map="auto",                               trust_remote_code=True, torch_dtype=torch.float16)tokenizer.padding_side = "left"tokenizer.pad_token_id = tokenizer.convert_tokens_to_ids("<fim_pad>")tokenizer.eos_token_id = tokenizer.convert_tokens_to_ids("<|endoftext|>")tokenizer.pad_token = "<fim_pad>"tokenizer.eos_token = "<|endoftext|>"
model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True, torch_dtype=torch.float16)model.eval()
text = '<|user|>\n/* Given the following database schema: */\nCREATE TABLE "singer" (\n"Singer_ID" int,\n"Name" text,\n"Country" text,\n"Song_Name" text,\n"Song_release_year" text,\n"Age" int,\n"Is_male" bool,\nPRIMARY KEY ("Singer_ID")\n)\n\n/* Write a sql to answer the following question: Show countries where a singer above age 40 and a singer below 30 are from. */<|end|>\n'inputs = tokenizer(text, return_tensors='pt', padding=True, add_special_tokens=False).to("cuda")outputs = model.generate( inputs=inputs["input_ids"], attention_mask=inputs["attention_mask"], max_new_tokens=512, top_p=0.95, temperature=0.1, do_sample=False, eos_token_id=tokenizer.eos_token_id, pad_token_id=tokenizer.pad_token_id )gen_text = tokenizer.batch_decode(outputs[:, inputs["input_ids"].shape[1]:], skip_special_tokens=True)print(gen_text)
复制代码

6. InternLM2-chat-7B-SQL--2024.03.13

git clone https://www.modelscope.cn/Nobitaxi/InternLM2-chat-7B-SQL.git
复制代码


本模型是基于 InternLM-chat-7B,在 19,5297 条数据上进行 3 个 epoch 的 FineTune 训练出来的关于 Text-to-SQL 领域的模型。本模型根据自然语言问句及数据库表结构生成对应的 SQL。


  • 训练数据介绍


使用 DB-GPT 处理并在 Hugging Face 开源的数据集,经过筛除掉多轮对话数据以及整理格式后得到 19,5297 条数据。


处理后的格式如下:


[  {    "question": "which states border arizona",    "context": "CREATE TABLE mountain (mountain_name, mountain_altitude, state_name, country_name); CREATE TABLE city (city_name, state_name, population, country_name); CREATE TABLE road (road_name, state_name); CREATE TABLE border_info (state_name, border); CREATE TABLE river (river_name, length, traverse, country_name); CREATE TABLE state (state_name, capital, population, area, country_name, density); CREATE TABLE highlow (state_name, highest_point, highest_elevation, lowest_point, lowest_elevation); CREATE TABLE lake (lake_name, area, state_name, country_name)",    "answer": "SELECT border FROM border_info WHERE state_name = 'arizona'"  },  ...  {}]
复制代码

6.1 模型训练流程

本项目使用 xtuner0.1.15, 在 internlm2-chat-7b 上进行微调, 模型地址


  1. 使用 xtuner train 进行训练


    xtuner train ${YOUR_CONFIG} --deepspeed deepseed_zero2
复制代码


  1. 将训练后得到的. pth 模型转换为 HuggingFace 模型: 即: 生成 Adapter 文件


    export MKL_SERVICE_FORCE_INTEL=1    xtuner convert pth_to_hf ${YOUR_CONFIG} ${PTH} ${ADAPTER_PATH}
复制代码


  1. 将 HuggingFace adapter 合并到训练的基座模型中


    xtuner convert merge ${BASE_LLM_PATH} ${ADAPTER_PATH} ${SAVE_PATH} --max-shard-size 2GB
复制代码

6.2 快速使用

编写一个 cli_demo.py 脚本用来简单使用


import torchfrom modelscope import AutoTokenizer, AutoModelForCausalLM

model_name_or_path = "Nobitaxi/InternLM2-chat-7B-SQL"
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True)model = AutoModelForCausalLM.from_pretrained(model_name_or_path, trust_remote_code=True, torch_dtype=torch.bfloat16, device_map='auto')model = model.eval()
system_prompt = """If you are an expert in SQL, please generate a good SQL Query for Question based on the CREATE TABLE statement."""
messages = [(system_prompt, '')]
print("=============Welcome to InternLM2-chat-7b-sql chatbot, type 'exit' to exit.=============")
while True: input_text = input("User >>> ") input_text.replace(' ', '') if input_text == "exit": break response, history = model.chat(tokenizer, input_text, history=messages) messages.append((input_text, response)) print(f"robot >>> {response}")
复制代码


注意:输入中需要包含问句及数据库模式,训练模型时,数据集中的数据库模式用建表语句表示;体验时可以额外添加更多上下文信息以提升模型生成 SQL 的准确率


其他内容, 后续补充~

7.Schema_Query_Align 2024.03.17

  • 微调数据集: Text2SQL - 中文 - 180K


https://modelscope.cn/datasets/JinzhangLi/CDC_AI-Lab_Text2SQL_CN_180K/summary
复制代码


  • 快速开始


pip install transformers -i https://pypi.tuna.tsinghua.edu.cn/simple
复制代码


安装完成后,您可以使用以下代码来使用本模型


from transformers import AutoTokenizer,AutoModelmodel_path="JinzhangLi/CDC_Schema_Query_Align"Tokenizer=AutoTokenizer.from_pretrained(model_path)model=AutoModel.from_pretrained(model_path)Schema="singer{singer id,name,country,song name,song release year,age,is male}"embedding=model(Tokenizer(Schema,return_tensors="pt").input_ids).pooler_output[0].tolist() #1024维向量print(embedding)
复制代码


  • 评测(使用 Cspider-dev 数据集 Query-Schema 对进行测试)



M3E-Large


https://modelscope.cn/models/Jerry0/M3E-large/summary
复制代码


  • 更多内容请参考:


NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学

8. 书生·浦语 2-对话-7B-2024.03.20

8.1 性能评测

8.2 快速使用

9.Chat2DB-GLM 2024.04.09

10.业界 NL2SQL 案例分析

10.1MPP 数据库简介

10.2 xxx 案例

更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。

发布于: 刚刚阅读数: 4
用户头像

本博客将不定期更新关于NLP等领域相关知识 2022-01-06 加入

本博客将不定期更新关于机器学习、强化学习、数据挖掘以及NLP等领域相关知识,以及分享自己学习到的知识技能,感谢大家关注!

评论

发布
暂无评论
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学_text2sql_汀丶人工智能_InfoQ写作社区