赞
踩
在NL2SQL(自然语言转SQL)中存在着两个经典的子任务:
1、基于有限的数据库结构,当用户进行提问(Query)时如何找到问题中涉及的数据库表;
2、是基于找到的数据库表结构(Schema)和用户提问(Query)构造合适的提问模板(Prompt),使用训练好的text2sql模型或者经过微调(fine-tune)后的大语言模型(LLM)
因此分析任务1,事实上这可以被泛化为一个基本问题,那么就是如何通过模型构建用户提问Query和数据库结构Schema之间的联系,而在事实上,当前大语言模型的流行,离不开检索增强生成(RAG)技术的演进,也就是目前流行的知识库问答技术。
事实上RAG技术就是构造一个知识库,使用embedding模型,对用户提问(Query)进行向量化(Query-embedding),将每一个知识文本段也通过向量化技术存储到向量库中,通过向量化后的用户提问对知识文本段进行召回,并进行排序,因此用户提问Query和数据库结构(Schema)之间的关系,可以泛化为RAG问题。
通过巨量的用户提问(Query),用户提问对应的数据库结构(Schema)对一个预训练的embedding模型进行fine-tune成为了一个可以考虑的实现路径,因此,基于前期的180k中文NL2SQL数据集的基础上进行筛选和整合(Text2SQL-中文-180K · 数据集 (modelscope.cn))得到微调数据集,基于uniem库,使用基线模型m3e-large(m3e-large · 模型库 (modelscope.cn))进行微调,现在我们微调后模型已经进行了开源,我们的模型使用单卡A800 80G上经历10个小时,4个epoch的微调,具体代码和数据集,微调后的模型如下:
相比较基线模型m3e-large,在Cspider-dev数据集中进行测试,我们的模型和m3e-large在top10,top5,top3,top2,top1的精度汇报如下:
微调代码如下:
- import json
- from datasets import load_dataset
- from uniem.finetuner import FineTuner
-
- dataset=load_dataset("json",data_files="../Source_data/m3e_fine_tune_data.json")
- dataset=dataset["train"]
- dataset=dataset.train_test_split(test_size=0.1,seed=42)
- dataset["validation"]=dataset.pop("test")
- finetuner = FineTuner.from_pretrained("../model_dir/m3e-large", dataset=dataset)
- fintuned_model = finetuner.run(epochs=4,batch_size=16)
微调数据集:
Text2SQL-中文-180K · 数据集 (modelscope.cn)https://www.modelscope.cn/datasets/JinzhangLi/CDC_AI-Lab_Text2SQL_CN_180K/summary 微调后模型:Schema_Query_Align · 模型库 (modelscope.cn)
https://www.modelscope.cn/models/JinzhangLi/CDC_Schema_Query_Align/summary
在未来我们将准备推出一下两个版本的Schema-Query-Align model,分别有:
1、基于对比学习(Contrast Loss)和孪生网络思想,使用两个m3e-large模型分别对数据库结构Schema和用户提问Query进行表征学习,通过计算余弦度量和Contract Loss更新网络
2、使用大模型(LLM)的前n层中的[EOS]位置标记的向量作为输出,利用大模型充分预训练的特性,使用QLoRa技术对模型进行微调使其具有Query表征能力,对指定的输入(数据库结构Schema)具有表征能力
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。