基于BERT微调+模板填充快速实现文本转DSL查询语句

前言

Text2SQL是指将自然语言转化为类SQL查询语句,使得用户的查询文本可以直接实现和数据库交互,本文介绍一种以BERT为基础模型,通过模板填充来实现的Text2SQL算法和产品化。


内容摘要
  • Text2SQL任务说明
  • 模板填充的思路
  • 条件列选择子模型搭建(where col)
  • 条件合并类型子模型搭建(and,or)
  • 条件值匹配子模型搭建(col,value)
  • 排序条件子模型搭建
  • limit子模型搭建
  • 整体模型pipeline
  • 基于Streamlit快速产品化

Text2SQL任务说明

本文的任务是将用户的查询语言自动翻译为ElasticSearch的DSL查询语句,然后以DSL语句查询ElasticSearch返回结果。业务场景为将上市公司的标签存储在ElasticSearch中,通过自然语言挑选出对应的股票,实现“一句话选股”,该产品在市面上的APP已经广泛实现,本文是对其的一个简单功能复现。

市面上Text2SQL类似的产品

注意本文需要转化的自然语言任务仅为挑选出企业,并且展示出所需要的列,不设计复杂的聚合和聚合函数,比如groupby,max,sum不在本次的考虑范围内。


模板填充的思路

模板填充生成查询语句的思路类似于完型填空,不论是SQL还是DSL查询语句,任何查询都有固定部分,那把不固定的部分遮蔽掉,单独预测遮蔽掉的关键词即可补全SQL,我们以ElasticSearch的DSL举例,模板填充的形式如下

DSL模板填充

无底色部分代表固定的DSL形式,有底层部分代表可变的关键词部分,不同的颜色代表不同的DSL模块:

  • must:筛选条件的组合形式,must代表且,should代表或
  • termrange:筛选条件的比较类型,term是相等匹配,range是值大小比对
  • col:筛选条件用到的列,以及select需要的列
  • gte:比较符,gte代表大于等于
  • desc:排序类型,desc代表降序
  • size:limit条件,代表最大输出多少数据

因此模板填充的任务就是把可变的关键词预测出来,从而拼接出最终的DSL语句。


条件列选择子模型搭建(where col)

第一步是要预测出条件列,只有先预测出条件列,后续才能进一步完成列的条件匹配和值匹配。我们采用BERT的句子对的方式,将每一列和用户输入的查询语句拼接起来,采用[CLS]位置作为表征,预测二分类是否匹配。

BERT句子对匹配预测

举例如果有100个候选列,则一条查询语句需要预测100条样本,每条样本是一个二分类,最终可以预测出多个列或者一个列,也可以没有列。


条件合并类型子模型搭建(and,or)

条件合并类型预测是预测出有多个条件时的组合类型,且,或,甚至没有,是一个三分类问题。只需要对原始的查询语句使用BERT的[CLS]预测即可

BERT预测条件组合类型


条件值匹配子模型搭建(col,value)

条件值匹配是一个三元组的预测,涉及元素为col列,value值,和比较符,col列是条件列选择子模型搭建(where col)该任务的输出,及条件值匹配是条件列选择的后续模型,由于col列已经被上游任务预测出来了,所以本任务的目标是先抽取出value值,并且搭配比较符做匹配。
在此我们将col列分为real数值列和type类型枚举列,因为这两种情况对应的value值和比较符都不一样。

  • real数值列:需要通过配置提前获得预测出的select列的类型为real,此时比较符设置为“>”,“<”,“=”,“!=”,“>=”,“<=”一共六种情况,value值一定是数字,因此通过正则表达式加中文单位工具转换可以抽取出来

一个使用Python脚本抽取输入中的数字的案例如下

import re
import cn2andef parse(text: str):res = []tmp = re.findall("[\d一二三四五六七八九十百千万亿零.]+", text)for t in tmp:value = ""try:value = cn2an.cn2an(t, "strict")except:try:value = cn2an.cn2an(t, "normal")except:try:value = cn2an.cn2an(t, "smart")except:passif value:value = int(value) if int(value) == value else valueres.append(value)return resif __name__ == '__main__':print(parse("手里有三个苹果,单价0.56元一个,总共一百2十三万元"))# 抽取结果 [3, 0.56, 1, 1230000]
  • type类型列:需要通过配置提前获得预测出的select列的类型为type,此时value值为数据库中该字段的枚举值全集,比如该列为省份,则需要穷举出所有的省份做匹配,比较符为"=“,”!="。

基于以上约定需要对样本进行构造,即穷句出所有情况,以real列为例,所有select列和所有抽取出的value,再叠加所有可能的比较符做二分类预测,同样采用BERT的句子对做表征,例如

构造col,value匹配模型


排序条件子模型搭建

排序模型需要预测出order by的列,并且预测出是升序asc还是倒序desc,同样通过配置提前预知需要排序的所有列,并且将其和升序和倒序拼接在一起输入BERT进行句子对预测,例如

排序模型的BERT样本输入

同样以[CLS]位置来预测二分类是否匹配。


limit子模型搭建

该模块是排序条件模型的下游任务,将条件值匹配抽取到的数字和排序条件列做穷举,同样采用BERT做句子对分类,模型示意图如下

limit模型输入

同样以[CLS]位置来预测二分类是否匹配。


整体模型pipeline

基于以上方案一共有五个BERT模型,分别是where列预测,op组合条件预测,select列和值的匹配,是否有排序条件,limit值预测,五个模型的pipeline流程图如下

整体预测pipeline

在最后一部需要整个5个模型的输出改造成对应查询语句,以ElasticSearch的DSL为例,一个改造实现如下

    def parse_to_dsl(self, op_combine, match, order_op, limit):query = {"query": {"bool": {}},"_source": ["ent_name", "score"],"sort": []}if order_op:label_name = order_op[:-4]order_name = order_op[-4:]label_code = self.name_to_label_code[label_name]query["sort"].append({f"{label_code}": {"order": "desc" if order_name == "降序排名" else "asc"}})query["_source"].append(label_code)else:query["sort"].append({"score": {"order": "desc"}})if limit != -1:query["size"] = limitop_dsl = "must"if op_combine == "or":op_dsl = "should"query["query"]["bool"][op_dsl] = []sub_queries = {}for m in match:cond, op, val = re.split("(=|!=|>=|<=|>|<)", m)label_code = self.name_to_label_code[cond]query["_source"].append(label_code)c_type = self.cols_type[cond]# TODO 子查询,记录命中数sub_query = {"query": {}}if c_type == "real" and op not in ("=", "!="):range_op = {"range": {f"{label_code}": {}}}if op == ">":range_op["range"][f"{label_code}"]["gt"] = valelif op == ">=":range_op["range"][f"{label_code}"]["gte"] = valelif op == "<=":range_op["range"][f"{label_code}"]["lte"] = valelif op == "<":range_op["range"][f"{label_code}"]["lt"] = valquery["query"]["bool"][op_dsl].append(range_op)sub_query["query"] = range_opelif c_type in ("real", "type") and op == "=":term_op = {"term": {f"{label_code}": {"value": val}}}query["query"]["bool"][op_dsl].append(term_op)sub_query["query"] = term_opelif c_type in ("real", "type") and op == "!=":bool_op = {"bool": {"must_not": [{"term": {f"{label_code}": {"value": val}}}]}}query["query"]["bool"][op_dsl].append(bool_op)sub_query["query"] = bool_opsub_queries[m] = json.dumps(sub_query, ensure_ascii=False)return sub_queries, json.dumps(query, ensure_ascii=False)

本质上先定义了一个基础DSL模板,将要填充的槽留空,基于模型的输出解析改造成一个个子查询,再汇总为最终的DSL语句。


基于Streamlit快速产品化

以Streamlit框架为例,快速不属于个一句话选股的页面功能,实现如下

import streamlit as st
import pandas as pdname = st.text_input('请输入您的股票查询条件', max_chars=100, help='最大长度为100字符')if st.button('查询'):parse_cond, df_info, order_op, limit = query(name)style = """<style>.box {border: 1px solid #ddd;padding: 6px 10px;margin-top: 10px;background-color: pink;color:#000;display:inline-block;margin-right:6px;}</style>"""st.markdown(style, unsafe_allow_html=True)conds = []for k, v in parse_cond.items():conds.append("<span class='box'>{}</span>".format(k + "(" + str(v) + ")"))if order_op:conds.append("<span class='box'>{}</span>".format(order_op + f"前{limit}" if limit != -1 else order_op))st.markdown("".join(conds), unsafe_allow_html=True)hit = df_info[0]df = pd.DataFrame(df_info[1]).rename(columns=name_to_label_code)df.insert(0, '企业名称', df.pop('企业名称'))df.insert(1, '综合指数', df.pop('综合指数'))st.write("共计命中:{}条企业".format(hit))st.dataframe(df)

其中query中包装了BERT模型的pipeline,其中streamlit弹出web应用如下

查询页面

如果检索条件,比如筛选出注册资本金大于15亿,属于广东珠海的上市企业,按照指数倒序排列,输入后检索结果如下

Text2SQL结果

Text2SQL不仅输出了最终符合条件的企业,也统计出了相关的子条件,以及子条件命中的企业数,最终符合要求的企业数,从解析的条件来看,模型结果完全正确。

如何系统的去学习大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
    • L1.4.1 知识大模型
    • L1.4.2 生产大模型
    • L1.4.3 模型工程方法论
    • L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
    • L2.1.1 OpenAI API接口
    • L2.1.2 Python接口接入
    • L2.1.3 BOT工具类框架
    • L2.1.4 代码示例
    • L2.2 Prompt框架
    • L2.2.1 什么是Prompt
    • L2.2.2 Prompt框架应用现状
    • L2.2.3 基于GPTAS的Prompt框架
    • L2.2.4 Prompt框架与Thought
    • L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
    • L2.3.1 流水线工程的概念
    • L2.3.2 流水线工程的优点
    • L2.3.3 流水线工程的应用
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
    • L3.1.1 Agent模型框架的设计理念
    • L3.1.2 Agent模型框架的核心组件
    • L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
    • L3.2.1 MetaGPT的基本概念
    • L3.2.2 MetaGPT的工作原理
    • L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
    • L3.3.1 ChatGLM的特点
    • L3.3.2 ChatGLM的开发环境
    • L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
    • L3.4.1 LLAMA的特点
    • L3.4.2 LLAMA的开发环境
    • L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

学习计划:

  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/27593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【免费Web系列】大家好 ,今天是Web课程的第二一天点赞收藏关注,持续更新作品 !

这是Web第一天的课程大家可以传送过去学习 http://t.csdnimg.cn/K547r 员工管理 1. 条件分页查询 1.1 概述 在页面原型中&#xff0c;我们可以看到在查询员工信息列表时&#xff0c;既需要根据条件动态查询&#xff0c;还需要对查询的结果进行分页处理。 那要完成这个页面…

【linux】应用程序访问百度时,操作系统内核网络接口日志

代码合入&#xff1a; 登录 - Gitee.comhttps://gitee.com/r77683962/linux-6.9.0/commit/c639573cc7c4984913d4a89884347e5a30a51eac 启动操作系统运行dmesg的日志像这样&#xff1a; dmesg_log/2024_06_14_00_40_54.txt r77683962/linux-6.9.0 - Gitee.com 注意&#xf…

告别交叉编译 armbian小盒子 做RK3588开发

最近在做RK3588平台的开发 按照官方文档的说明 需要搭建交叉编译环境 然后在宿主机上做开发 使用交叉编译链 编译应用 其实蛮麻烦的 正好手头上有个arm64位的armbian小盒子 黑豹X2 信息如下 RK3588 也是64位的cpu 内存4G EMMC 32G 黑豹X2 用的 RK3566 也是瑞芯微…

后端常见问题解答-位运算实际场景讲解

位运算 在计算机存储的世界中&#xff0c;一切都是二进制的&#xff0c;位运算就是对二进制位进行操作的一种运算。位运算是计算机中的一种常见运算&#xff0c;可以用来提高性能和提升代码的可读性。 位运算有很多种&#xff0c;比如与、或、非、异或等&#xff0c;这些运算…

编程学到什么水平可以去接单呢?

关于编程要学到何种水平才可以去接单&#xff0c;这是一个需要认真思考的问题。 如果没有完整的项目经验&#xff0c;千万不要轻易地去承接外包项目。不要觉得仅仅因为自己能够编写一个计算器程序&#xff0c;就自以为有能力承接工程项目了。 要是没有拥有解决问题的清晰思路以…

springmvc 全局异常处理器配置的三种方式深入底层源码分析原理

文章目录 springmvc 全局异常处理器配置的三种方式&深入底层源码分析原理配置全局异常处理器的三种方式实现接口HandlerExceptionResolver并配置到WebMvcConfigurer注解式配置ExceptionHandlercontroller里方法上定义ExceptionHandler 深入源码分析进入DispatcherServlet执…

SpringBoot3 常用的第三方接口调用十种方式

环境&#xff1a;SpringBoot.3.3.0 简介 在项目中调用第三方接口是日常开发中非常常见的。调用方式的选择通常遵循公司既定的技术栈和架构规范&#xff0c;以确保项目的一致性和可维护性。无论是RESTful API调用、Feign声明式HTTP客户端、Apache HttpClient等调用方式&#x…

经典的带环链表问题(链表补充)

环形链表1 运用快慢指针的方法&#xff0c;fast ,slow从头节点出发&#xff0c;快指针走两步&#xff0c;慢指针走一步&#xff0c;若有环&#xff0c;快指针先进环&#xff0c;后续如果慢指针和快指针相遇&#xff0c;则链表带环。转换成了追击问题。 struct ListNode {int v…

重温react-01

创建react项目 // 第一步 npm install create-react-app -g // 第二步 create-react-app my-app目录介绍 my-app/README.md# 项目第三方依赖包node_modules/package.json# 一般用来存放静态依赖public/index.htmlfavicon.ico# 存放项目源代码&#xff0c;注意只有放在scr目录…

快速提升沟通能力:客服必备的话术技巧

在现在的这个互联网时代&#xff0c;各行业竞争日益激烈&#xff0c;而客服作为连接商家和消费者的桥梁&#xff0c;无疑是一个重要的岗位。可以说客服是一个极具挑战性的岗位&#xff0c;客服每天需要面对来自全国各地的客户&#xff0c;同时还要对不同地区、不同性格、不同需…

SQLServer 借助Navcate做定时备份的脚本

首先创建SQLServer链接&#xff0c;然后在Query标签种创建一个查询 查询内容如下 use ChengYuMES declare ls_time varchar(1000) declare ls_dbname varchar(1000) set ls_time convert(varchar, getdate(), 112) _ replace(convert(varchar, getdate(), 108), :, )-- 需…

LeetCode20.有效的括号

题目描述 分析 我们刚上来的思路可能是&#xff1a;找出这三种括号的个数 如果都是偶数 说明匹配 但是这里还有一个顺序问题 比如 " )( "这样是不匹配的&#xff01; 所以这种思路不可取&#xff01; 我们想 如果遇到左括号&#xff0c;把他读到一个顺序表中&#…

Redis应用:基于Redis实现排行榜、点赞、关注功能

文章目录 1. 环境准备2. 实现排行榜功能2.1 添加用户分数2.2 获取排行榜2.3 获取用户排名2.4 更新用户分数示例代码3. 实现点赞功能3.1 添加点赞3.2 获取点赞数3.3 检查用户是否点赞3.4 取消点赞示例代码4. 实现关注功能4.1 添加关注4.2 获取粉丝列表4.3 获取关注列表4.4 取消关…

【Pycharm】设置双击打开文件

概要 习惯真可怕。很多小伙伴用习惯了VsCode开发&#xff0c;或者其他一些开发工具&#xff0c;然后某些开发工具是单击目录文件就能打开预览的&#xff0c;而换到pycharm后&#xff0c;发现目录是双击才能打开预览&#xff0c;那么这个用起来就特别不习惯。 解决办法 只需一…

高清视频+AI算法,EasyCVR视频智能监控方案打造无死角吸烟行为检测

一、背景与意义 1、吸烟危害&#xff1a;吸烟不仅有害健康&#xff0c;而且在特定场所带来的安全隐患极大。据统计&#xff0c;全年火灾事故中有五分之一系抽烟引起&#xff0c;引发的人员伤亡和财产损失巨大。 2、政策与法规&#xff1a;为了保护公共安全&#xff0c;消除消…

解决方案︱视频孪生智慧高速解决方案

系统概述 在交通强国战略的指导下&#xff0c;我国政府高度重视以数字化为核心的智慧高速公路建设与发展。2023年9月&#xff0c;交通运输部印发了《交通运输部关于推进公路数字化转型加快智慧公路建设发展的意见》&#xff0c;强调到2035年&#xff0c;全面实现公路数字化转型…

java多线程概念

在Java多线程编程中有几个重要的概念&#xff0c;这些概念对于理解和编写正确的多线程应用程序至关重要&#xff1a; 1.线程&#xff08;Thread&#xff09;: 线程是操作系统能够进行运算调度的最小单位&#xff0c;Java通过线程实现并发执行。 2.进程&#xff08;Process&…

助力OTT大屏营销,酷开科技引领产业变革与创新

随着大屏电视产品的迭代&#xff0c;越来越多家庭以增换购等多种形式获得超高清、超大屏的智能电视&#xff0c;大屏的人均拥有量和渗透率进一步增加。在这种情况下&#xff0c;通过OTT应用为载体&#xff0c;将大量内容持续输送到大屏终端&#xff0c;从而形成了电视硬件普及与…

工控机与普通电脑的区别对于工业自动化应用至关重要

商用计算机和工业计算机之间的相似之处可能多于差异之处。工业电脑利用了消费技术领域的许多进步&#xff0c;但增加了工业应用所必需的软件、编程、确定性和连接性。 专业人士表示&#xff1a;“从增加内存到摩尔定律所描述的处理能力的指数级增长&#xff0c;工业控制必将受…

【C++】和【预训练模型】实现【机器学习】【图像分类】的终极指南

目录 &#x1f497;1. 准备工作和环境配置&#x1f495; &#x1f496;安装OpenCV&#x1f495; &#x1f496;安装Dlib&#x1f495; 下载并编译TensorFlow C API&#x1f495; &#x1f497;2. 下载和配置预训练模型&#x1f495; &#x1f496;2.1 下载预训练的ResNet…