模型描述
STAR 模型是一个多轮表格知识预训练语言模型,可用于解决下游的多轮Text-to-SQ语义解析任务。模型采用基于模板和回译方法生成的合成语料进行预训练。模型采用全小写英文语料进行训练和使用。
本项目的模型是 STAR 基于一个多轮Text-to-SQL数据集 CoSQL 微调后的下游模型,称作 nlp_star_conversational-text-to-sql,可针对不同领域数据库和用户直接进行多轮对话,生成相应的SQL查询语句。用户可以在对话过程中表达自己对数据库模式的查询要求,并在系统的帮助下生成符合要求的SQL查询语句。
STAR采用人工构建的高质量且大规模的多轮Text-to-SQL预训练数据进行预训练,采用统一的单个Transformer架构作为模型底座。 模型采用半监督的方式在多轮Text-to-SQL预训练数据上进行训练,采用3个预训练目标:模式状态追踪建模,对话依赖追踪建模和掩码语言建模,最后以多任务学习的方式进行训练。
在下游任务Text-to-SQL微调的时候,我们直接利用 STAR 作为底座,基于一个大家常用的下游模型 lgesql 进行微调得到。 具体做法就是将 lgesql 的 ELECTRA 底座替换成 STAR, 并修改输入格式,其余保持不变,效果上即可得到显著提升。
ModelScope使用
MdoelScope作为一个Maas平台,有着和Huggingface类似的功能和界面,还提供了在线开发的环境,能够轻松体验和复现SOTA的结果。详细的信息可以查看ModelScope使用简介。可以用以下的两种方法来使用ModelScope:
(1)使用ModelScope提供的远程环境,在Notebook中进行开发:
在ModelScope中注册后进入个人中心,在我的Notebook中使用GPU环境打开Notebook
(2)下载modelscope工具包,在本地环境开发:
安装modelscope(python>=3.7): pip install modelscope -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
(注:如需节省空间,可在modelscop后加入[NLP],只下载自然语言处理相关工具)
STAR模型使用
你可以直接通过一个流水线使用模型用于多轮Text-to-SQL语义解析任务:
from modelscope.models import Model
from modelscope.pipelines import pipeline
from modelscope.preprocessors import ConversationalTextToSqlPreprocessor
from 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.conversational_text_to_sql,
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)
last_sql = results['text']
history.append(item)
NOTE:本项目支持用户使用本地自定义的的数据库,请仿照db文件和tables.json文件设置数据库格式,并传入正确的地址'local_db_path'。
对话样例
user utterance (输入) |
system response (输出) |
I'd like to see Shop names. |
SELECT shop.Name FROM shop |
Which of these are hiring? |
SELECT shop.Name FROM shop JOIN hiring |
Which shop is hiring the highest number of employees? | do you want the name of the shop ? | Yes |
SELECT shop.Name FROM hiring JOIN shop GROUP BY hiring.Shop_ID ORDER BY COUNT(*) DESC LIMIT 1 |
最后
就这么简单,只需要几十行代码,我们就在ModelScope上模拟了多轮表格问答的效果,ModelScope的整体使用体验还是挺不错的~