【Text2SQL 论文】DBCopilot:将 NL 查询扩展到大规模数据库

2024-06-02 16:36

本文主要是介绍【Text2SQL 论文】DBCopilot:将 NL 查询扩展到大规模数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

论文:DBCopilot: Scaling Natural Language Querying to Massive Databases

⭐⭐⭐⭐

Code: DBCopilot | GitHub

一、论文速读

论文认为目前的 Text2SQL 研究大多只关注具有少量 table 的单个数据库上的查询,但在面对大规模数据库和数据仓库的查询时时却力显不足。本文提出的 DBCopilot 能够在大规模数据库上查询模式不可知的 NL question。

论文指出,实现这个的核心是:从能够构建各种 NL question 到海量数据库模型元素的 semantic mapping,从而能够自动识别目标数据库并过滤出最少的相关 tables。但目前的基于 LLM 的方法有两个主要挑战:

  • 由于 token 限制,无法将所有 schema 都输入给 LLM
  • LLM 仍然难以有效利用长上下文中的信息

而在解决可扩展性的问题时,主要有基于 retrieval 的方法和基于 fine-tune 的方法,但是,

  • 基于 retrieval 的方法往往是将 doc 视为检索对象,忽略了 DB 和 DB table 之间的关系;
  • fine-tune LLM 来为其注入 schema 的相关知识是资源密集型的方式,且有时候 LLM 是无法微调的

DBCopilot 的做法如下图所示:

在这里插入图片描述

主要分成两步:

  1. Schema Routing:输入 user question,使用 DSI 技术找到所需要用的 DB 和 DB tables,也就是 DB schema。
  2. SQL Generation:输入 user question、DB schema,通过 prompt LLM 生成 SQL query。

二、问题定义

2.1 Schema-Agnostic NL2SQL

Schema-Agnostic NL2SQL 指的是:只给定 user question 而不给定预期的 SQL query schema(DB 和 DB tables),来生成一个可以在一个数据库集合中的某个 DB 上执行的 SQL。

像之前 WikiSQL 数据集上,都是指定 question 在哪个 DB 上的。

2.2 Schema Linking VS. Schema Routing

在以往的 NL2SQL 中,Schema Linking 的 input 是 question 和 schema,用于寻找 NL question 中提及到的 schema 元素(比如 tables、columns 或者 database value),可以被视作是一个 NL question 和 DB elements 之间的桥梁。

Schema Routing 的 input 只有不知道 schema 的 question,它的输出是一个 indexed or memorized schema。

三、方法

3.1 Schema Routing

本文使用一个轻量级的 seq2seq 模型来作为 router,实现将 NL 识别出对应的 DB schema。

由于 space schema 很大(是 table 和 column 的笛卡尔积)、且 DB schema 可以发生变化,因此本文提出了一个 relation-aware、end-to-end joint retrieval 方法来解决 schema routing 问题

具体做法是,先为 databases 构建一个 schema graph,然后设计一个 schema 序列化算法来将一个 schema 转化为 token-sequence,利用 graph-based contrained decoding 解码算法来让 seq2seq 模型生成 routing 的结果 DB schema。

3.1.1 Schema Graph

schema graph 包含了 databases 的 schema 信息,这个 graph 的 nodes 包含三类:

  • v s v_s vs:一个特殊节点,指代含有所有 databases 的集合
  • database
  • DB table

graph 的 edge 包含两类:

  • Inclusion relation:表示一个 db 是否是一个 db collection 的一部分;或者一个 table 是否属于一个 db
  • Table relation:包含显式的 PRIMARY-FOREIGN 关系和隐式的 FOREIGN-FOREIGN 关系

隐式的 FOREIGN-FOREIGN 关系指的是:A 表和 B 表的某个 column 共同连接到另一个 C 表的 key

由此,任何有效的 SQL query schema 都是这个 schema graph 上的一个 trail(或者叫一个 path)。

3.1.2 Schema Serialization

这个序列化算法将一个 SQL query schema 序列化为一个 token seq,当然也可以将一个 token seq 解码出一个 DB schema。

具体的做法可以参考原论文,这里主要是基于 DFS(深度优先遍历)的思想。

有了这个序列化算法,当我们训练 seq2seq 的 schema router 模型时,由于需要监督它的 training data 是 (NL question, DB schema) pair,其中的 DB schema 就是序列化了的 schema。另外,router 的输出是一个 token seq,也需要反序列化将其转为结构化的 DB schema。

3.1.3 graph-based 的解码算法

在让 schema router 生成 token seq 时,为保证其生成的 schema 的有效性,每一个自回归生成的 step 中,都受到一个动态前缀树的约束,这个 tree 包含了解码后 schema 元素的可能访问节点的名称,如下图所示:

在这里插入图片描述

这样,每个生成 step 的可用 tokens 都可以通过搜索前缀树来获得,前缀就是在最后一个元素分隔符之后生成的 token。同时这里使用 diverse beam search 来生成多个候选序列。

3.1.4 schema router 的训练和推理

我们需要使用 (NL question, DB schema) 这样的 pairs 来作为 training data 来训练 router,但是目前缺少这样的训练资料。所以,本文提出了使用一个训练数据合成方法来生成 question-schema pairs。

这个训练数据合成方法具体来说就是:茨贝格 schema graph 中采样出一批合法的 schema,然后对每一个 schem 生成一个 pseudo-question,如下图所示:

在这里插入图片描述

具体的这个模型的训练可以参考原论文。

由此就可以得到用于训练 schema router 的 question-schema pairs

之后,我们就可以训练 Schema Router 了。训练数据集是 { ( N i , S i ) } \{(N_i, S_i)\} {(Ni,Si)},也就是 quetsion-schema pairs,模型的训练损失函数如下:

在这里插入图片描述

训练出来之后,就可以使用 graph-based 的解码算法来做推理了。

3.2 SQL Generation

通过将 NL2SQL 任务解耦为 schema routing 和 SQL generation 两个部分,DB Copilot 可以与现在的 LLM-advanced NL2SQL 的解决方案进行融合,无论是 in-context prompt engineering 方法或者特定的 NL2SQL LLM。

前面的 schema router 可以为 NL 生成来自多个 db 的多个 schemas,这里探索了 3 种 prompt 策略来为 LLM 选择和合并这些不同的 DB schema:

  1. Best Schema Prompting:从 schema router 种选择生成的最高概率的 schema 来 instruct LLM
    • 实验发现这种方式是最优的
  2. Multiple Schema Prompting:将 beam search 得到的多个 table schemas 简单连接起来一起用来 instruct LLM。
  3. Multiple Schema COT Prompting:使用多个 candidate schemas 通过 COT 来 instruct LLM

四、实验

论文在 Spider、Bird、Fiben 数据集上对 schema retrieval 和 NL2SQL 两个任务上进行实验对比,DBCopilot 有不错的表现。

这里 NL2SQL 任务并没有与其他 SOTA 模型做实验对比

五、总结

本文提出了 DBCopilot 模型,给出了一种将 NL 查询扩展到大规模数据库的思路,通过 LLM 协作来解决模式无关的 NL2SQL 任务。

总之,DBCopilot 突破了 NL2SQL 的界限,使得研究人员能够更好地执行数据可访问性的策略。

这篇关于【Text2SQL 论文】DBCopilot:将 NL 查询扩展到大规模数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1024504

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路