你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益:
- 了解大厂经验
- 拥有和大厂相匹配的技术等
希望看什么,评论或者私信告诉我!
文章目录
- 一、背景
- [二、NL2SQL 的实现方式](#二、NL2SQL 的实现方式)
-
- [2.1 Vanna](#2.1 Vanna)
- [2.2 DAIL-SQL](#2.2 DAIL-SQL)
- [2.3 其他的实现方式](#2.3 其他的实现方式)
- [2.4 总结](#2.4 总结)
- 三、实现样例
- [四、 text2sql 测试集介绍](#四、 text2sql 测试集介绍)
-
- [4.1. **WikiSQL**](#4.1. WikiSQL)
- [4.2. **Spider**](#4.2. Spider)
- [4.3. **BIRD**](#4.3. BIRD)
- [五、EM 和 EX 介绍](#五、EM 和 EX 介绍)
- 七、总结
一、背景
关注 NL2SQL 也有一段时间了,刚好公司最近也要做 NL2SQL,我也刚好看了几个 NL2SQL 的开源项目以及 论文,所以现在总结一下。
二、NL2SQL 的实现方式
2.1 Vanna
先说一下目前比较火的开源项目 Vanna 的实现方式:RAG + LLM
这是它的整体架构和实现方式:
我也翻了一下它的源码,它内部实现特别暴力,通过用户的 question,将 schemal、doc 以及 sql 全部查出来,拼接 prompt 然后给大模型。
这是 vanna 源码的生成 sql 的逻辑
txt
Uses the LLM to generate a SQL query that answers a question. It runs the following methods:
- [`get_similar_question_sql`][vanna.base.base.VannaBase.get_similar_question_sql]
- [`get_related_ddl`][vanna.base.base.VannaBase.get_related_ddl]
- [`get_related_documentation`][vanna.base.base.VannaBase.get_related_documentation]
- [`get_sql_prompt`][vanna.base.base.VannaBase.get_sql_prompt]
- [`submit_prompt`][vanna.base.base.VannaBase.submit_prompt]
我自己基于 muilt-agent 开发了类似的功能,few-shot 的正确率确实要高一些
2.2 DAIL-SQL
DaIL-SQL 曾经的王者,在 Spider EX 正确率 86.6 %,我读了它的论文 ,它的核心在于 prompt :在 schemal 上增加了 相似问题和对应SQL,从而提高正确性
2.3 其他的实现方式
目前这一块在学术界不断的创新,每隔一段时间就会有新的方式出来来刷新之前的最好成绩,感兴趣的可以看一下 Awesome-Text2SQL
2.4 总结
目前我了解到的所有的实现方式都逃不过:RAG +LLM,目前可以优化的点无非就是
- RAG 想办法提高 RAG 数据的正确率
- 元数据,元数据有问题,RAG的正确率再高也无济于事
- prompt,通过优化 prompt,比如 MCS-SQL 利用多个提示和多项选择来生成文本到 SQL
- LLM 目前的初步结论是参数越多效果越好
三、实现样例
有一个张 a
sql
CREATE TABLE aa (
`all_dau` BIGINT COMMENT 'DAU',
`long_dau` BIGINT COMMENT '长DAU',
`short_dau` BIGINT COMMENT '短DAU',
`date` INT COMMENT '分区')
PARTITIONED BY (date)
我现在要查询表 a 最近 7 天 长DAU 和是多少? 应该怎么做。
- 将 表 a 相关的元数据,本例子就是 DDL 写入到向量数据库
- 根据用户提问查询 RAG 得到表 a 相关的信息
- 拼接 prompt
- 发给大模型
比如,拼接 prompt 为
txt
CREATE TABLE aa (
`all_dau` BIGINT COMMENT 'DAU',
`long_dau` BIGINT COMMENT '长DAU',
`short_dau` BIGINT COMMENT '短DAU',
`date` INT COMMENT '分区')
PARTITIONED BY (date)
要查询表 a 最近 7 天 长DAU 和是多少?返回对应的SQL
发给大模型,大模型返回结果为
txt
要查询表 `aa` 中最近 7 天的长 DAU (`long_dau`) 数量,您可以使用以下的 SQL 查询语句,假设 `date` 列存储的是日期的整数表示(例如 UNIX 时间戳或特定的日期编码):
```sql
SELECT SUM(long_dau) AS total_long_dau
FROM aa
WHERE date >= CURDATE() - INTERVAL 7 DAY;
这里,我们使用了 SUM
函数来计算 long_dau
的总和,并且使用 WHERE
子句来过滤出最近 7 天的数据。CURDATE()
函数返回当前日期,然后通过 INTERVAL 7 DAY
添加 7 天的间隔,然后使用 -
操作符来得到 7 天前的日期。这样,您就可以得到最近 7 天的长 DAU 的总和。
四、 text2sql 测试集介绍
是的,WikiSQL、Spider 和 BIRD 是常用的 Text-to-SQL 测试集,它们用于评估模型在自然语言查询到结构化查询语言(SQL)转换方面的能力。以下是它们的简要介绍:
4.1. WikiSQL
-
概述:
- WikiSQL 是一个大规模的 Text-to-SQL 数据集,包含了由自然语言查询生成的 SQL 查询。数据集来自维基百科中的表格。
-
特点:
- 包含 80,000 条自然语言查询和相应的 SQL 查询。用户可以通过简单地询问表格中的信息来生成 SQL。
- 确保多样性,通过多种问题类型测试模型的灵活性。
4.2. Spider
-
概述:
- Spider 是一个大规模的、跨数据库的 Text-to-SQL 数据集,旨在测试模型在不同数据库架构下的泛化能力。
-
特点:
- 包含 10,000 多个自然语言查询与 SQL 查询配对,涉及 200 多种不同的数据库结构。
- 支持复杂的 SQL 查询,如嵌套查询和联合查询。
- 设计以提高模型的实际应用能力,更接近真实世界的使用场景。
4.3. BIRD
-
概述:
- BIRD 是一个专注于信息抽取的 Text-to-SQL 数据集,主要来源于真实的数据库和自然语言问题。
-
特点:
- 旨在评估模型的鲁棒性,特别是在面对模糊或含糊的问题时。
- 提供多样化的问题类型和复杂的 SQL 逻辑,挑战模型的理解和推理能力。
这些测试集为评估和推动 Text-to-SQL 模型的发展提供了标准化的基准,帮助研究人员在自然语言理解和数据库查询方面进行有效比较。通过这些挑战,模型能够逐步提高在实际应用中的准确性和效率。
五、EM 和 EX 介绍
这里以 Spider Exact Match (EM) 和 Spider Exact Execution (EX) 为例介绍:
在 Text-to-SQL 测试集领域,Spider Exact Match (EM) 和 Spider Exact Execution (EX) 是两种评估模型性能的指标,它们都与 Spider 数据集相关,但评估的侧重点有所不同。
联系:
两者都是用来评估 Text-to-SQL 模型性能的指标。它们都需要模型根据输入的文本描述生成相应的 SQL 查询语句。这两个指标都是在 Spider 数据集上使用的,关注模型的查询生成能力与真实数据库执行结果的一致性。
区别:
- Spider Exact Match (EM):主要关注生成的 SQL 查询是否与数据集中提供的标准查询语句完全匹配。它评估模型是否能够准确生成与参考查询语句结构、语法和语义完全一致的 SQL 代码。如果生成的 SQL 查询与参考查询完全一致,则被认为是正确的。这种评估更侧重于模型的查询生成能力。
- Spider Exact Execution (EX):更关注生成的 SQL 查询在实际数据库上的执行结果是否与预期结果一致。它不仅检查查询语句的语法和结构,还检查查询的执行结果是否正确。这意味着模型不仅要生成结构正确的查询语句,还要保证这些查询能够在数据库上返回正确的结果。这种评估方式更全面地考虑了模型的性能,包括查询生成能力和数据库执行能力。
简而言之,EM 主要关注查询语句本身的准确性,而 EX 则更关注查询在实际数据库上的执行结果的准确性。在实际应用中,可以根据需求选择合适的评估指标。
七、总结
本文对Text2SQL的实现方式、测试集和评估指标进行了介绍和总结,全面了解了Text2SQL技术的相关内容,对于从事Text2SQL的研究者具有一定的参考意义。