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

news2025/2/22 18:08:16
前言

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 cn2an


def 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:
                    pass
        if value:
            value = int(value) if int(value) == value else value
            res.append(value)
    return res

if __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"] = limit
        op_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"] = val
                elif op == ">=":
                    range_op["range"][f"{label_code}"]["gte"] = val
                elif op == "<=":
                    range_op["range"][f"{label_code}"]["lte"] = val
                elif op == "<":
                    range_op["range"][f"{label_code}"]["lt"] = val
                query["query"]["bool"][op_dsl].append(range_op)
                sub_query["query"] = range_op
            elif 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_op
            elif 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_op
            sub_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 pd


name = 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.coloradmin.cn/o/1824541.html

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

相关文章

SOFTS: 时间序列预测的最新模型以及Python使用示例

近年来&#xff0c;深度学习一直在时间序列预测中追赶着提升树模型&#xff0c;其中新的架构已经逐渐为最先进的性能设定了新的标准。 这一切都始于2020年的N-BEATS&#xff0c;然后是2022年的NHITS。2023年&#xff0c;PatchTST和TSMixer被提出&#xff0c;最近的iTransforme…

【编程技巧】降低程序复杂度:控制逻辑与业务逻辑分离

为什么要降低代码复杂度 好的项目都是迭代出来的&#xff0c;所以代码肯定是会被人维护的 降低代码复杂度就是为了降低下一个维护人的维护成本&#xff0c;更简单地理解跟修改代码 代码组成 代码逻辑 控制逻辑 业务逻辑 控制逻辑 控制业务逻辑的代码 例如&#xff1a;加缓存…

计算机网络(7) 错误检测

一.校验和 使用补码计算校验和是一种常见的错误检测方法&#xff0c;应用于网络协议如IP和TCP。补码是二进制数的一种表示方法&#xff0c;可以有效地处理符号位和进位。下面是如何利用补码计算校验和的详细步骤和算数例子。 ### 计算步骤 1. **将数据分块**&#xff1a;将数…

七个备受欢迎的IntelliJ IDEA实用插件

有了Lombok插件&#xff0c;IntelliJ就能完全理解Lombok注解&#xff0c;使它们能如预期般工作&#xff0c;防止出现错误&#xff0c;并改善IDE的自动完成功能。 作为IntelliJ IDEA的常用用户&#xff0c;会非常喜欢使用它&#xff0c;但我们必须承认&#xff0c;有时这个IDE&…

Linux---系统的初步学习【 项目二 管理Linux文件和目录】

项目二 管理Linux文件和目录 2.1项目知识准备 ​ 文件是存储在计算机上的数据集合。在Windows系统中&#xff0c;我们理解的文件可以是文本文档、图片、程序、音乐、视频等。在Linux中&#xff0c;一切皆文件&#xff0c;也就是除了Windows中所理解的文件&#xff0c;目录、字…

AI模型部署:Triton Inference Server部署ChatGLM3-6B实践

前言 内容摘要 本篇先将搭建基础Triton设置模块&#xff0c;将ChatGLM3-6B部署为服务跑通&#xff0c;再加入动态批处理和模型预热来提升服务的性能和效率&#xff0c;包括以下几个模块 Docker镜像环境准备模型基础配置config.pbtxt自定义Python后端model.py模型服务加载卸载…

人工智能历史与现状

1 人工智能历史与现状 1.1 人工智能的概念和起源 1.1.1 人工智能的概念 人工智能 (Artificial Intelligence ,AI)是一门研究如何使计算机 能够模拟人类智能行为的科学和技术,目标在于开发能够感知、理解、 学习、推理、决策和解决问题的智能机器。人工智能的概念主要包含 以…

Stable Diffusion本地化部署详细攻略

一、硬件要求 内存&#xff1a;至少16GB 硬盘&#xff1a;至少60GB以上的磁盘空间&#xff0c;推荐SSD固态硬盘 显卡&#xff1a;推荐NVIDIA显卡 显存&#xff1a;至少4GB Stabl Diffusion因为是在本地部署&#xff0c;对显卡的要求比较高&#xff0c;如果经济能力可以的话…

如何打造电力全域知识中心:知识库融合知识图谱

前言 随着人工智能技术的进步&#xff0c;智能化成为产业转型升级的关键抓手&#xff0c;国家电网在“十四五”发展规划中提出加快公司数字化转型进程、推进能源互联网企业建设的要求。知识管理能力建设作为强化企如何打造电力全域知识中心&#xff1a;知识库融合知识图谱业运…

荣耀笔记本IP地址查看方法详解:轻松掌握网络配置技巧

在数字化时代的浪潮中&#xff0c;笔记本电脑已经成为我们生活和工作中不可或缺的重要工具。对于荣耀笔记本用户而言&#xff0c;掌握基本的网络配置技巧显得尤为重要。其中&#xff0c;查看IP地址是连接网络、配置设备、排除故障等场景下的关键步骤。本文将详细介绍荣耀笔记本…

Python 全栈系列252 一些小计划

说明 最近整体进展还比较顺利&#xff0c;不过也因为这样&#xff0c;好几个线头怎么继续平衡和推进需要稍微捋一下。 内容 按重要|紧急方法来看&#xff0c;线头1是重要且紧急的&#xff0c;QTV200也算重要且紧急&#xff0c;其他都算是重要不紧急。 线头1: 数据清洗 虽然…

电子行业实施MES管理系统的时机是什么

随着信息技术的飞速发展&#xff0c;MES生产管理系统逐渐成为电子企业实现自动化生产和信息化管理的必备工具。那么&#xff0c;何时是电子企业实施MES管理系统的最佳时机呢&#xff1f; 1.生产过程中出现了问题&#xff0c;需要优化和改进。 2.企业需要提高产品交付和响应速…

5月产品更新 | 10大更新汇总,快来看看你的需求上线了吗?

5月&#xff0c;Smartbi从客户需求出发&#xff0c;并结合企业在数据分析、处理等方面遇到的问题&#xff0c;对数据模型、数据指标等数十项功能进行了优化升级。 Smartbi用户可以在官网下载下载PC端&#xff0c;更新后便可以使用相关功能&#xff0c;也可以在体验中心体验相关…

第二十三节:带你梳理Vue2:Vue插槽的认识和基本使用

前言: 通过上一节的学习,我们知道了如何将数据从父组件中传递到子组件中, 除了除了将数据作为props传入到组件中,Vue还允许传入HTML, Vue 实现了一套内容分发的 API&#xff0c;这套 API 的设计灵感源自 Web Components 规范草案&#xff0c;将 <slot> 元素作为承载分发…

Rust 实战丨并发构建倒排索引

引言 继上篇 Rust 实战丨倒排索引&#xff0c;本篇我们将参考《Rust 程序设计&#xff08;第二版&#xff09;》中并发编程篇章来实现高并发构建倒排索引。 本篇主要分为以下几个部分&#xff1a; 功能展示&#xff1a;展示我们最终实现的 2 个工具的效果&#xff08;构建索…

linux系统宝塔服务器temp文件夹里总是被上传病毒php脚本

目录 简介 上传过程 修复上传漏洞 tmp文件夹总是被上传病毒文件如下图: 简介 服务器时不时的会发送短信说你服务器有病毒, 找到了这个tmp文件, 删除了之后又有了。 确实是有很多人就这么无聊, 每天都攻击你的服务器。 找了很久的原因, 网上也提供了一大堆方法,…

力扣 面试题17.04.消失的数字

数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 示例 1&#xff1a; 输入&#xff1a;[3,0,1] 输出&#xff1a;2 示例 2&#xff1a; 输入&#xff1a;[9,6,4,2,3,5,7,0,1] 输出&#x…

【qt】平面CAD(计算机辅助设计 )项目 上

CAD 一.前言二.界面设计三.提升类四.接受槽函数五.实现图形action1.矩形2.椭圆3.圆形4.三角形5.梯形6.直线7.文本 六.总结 一.前言 用我们上节课刚刚学过的GraphicsView架构来绘制一个可以交互的CAD项目! 效果图: 二.界面设计 添加2个工具栏 需要蔬菜的dd我! 添加action: …

Vue 若依框架常见问题

获取当前用户id或其它信息 user.js import { login, logout, getInfo } from /api/login import { getToken, setToken, removeToken } from /utils/authconst user {state: {token: getToken(),id: ,name: ,avatar: ,roles: [],permissions: [], shop: [] // 店铺列表},mu…

Zig标准库:最全数据结构深度解析(1)

最近新闻看到17岁中专女生拿下阿里全球数学竞赛第12名。咱们学习标准库中的数据结构是和学习数学是一脉相承的&#xff0c;结构体很多&#xff0c;也非常枯燥&#xff0c;但是不能全面解读过一遍&#xff0c;你很难写出合理的代码。所以&#xff0c;这一章节我们开始深度解析Zi…