NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]

本文涉及的产品
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]

NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]

NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL]

NL2SQL基础系列(2):主流大模型与微调方法精选集,Text2SQL经典算法技术回顾七年发展脉络梳理

NL2SQL进阶系列(1):DB-GPT-Hub、SQLcoder、Text2SQL开源应用实践详解

NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解[Text2SQL]

NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]

☆☆NL2SQL进阶系列(4):ConvAI、DIN-SQL、C3-浙大、DAIL-SQL-阿里等16个业界开源应用实践详解[Text2SQL]

☆☆NL2SQL进阶系列(5):论文解读业界前沿方案(DIN-SQL、C3-SQL、DAIL-SQL、SQL-PaLM)、新一代数据集BIRD-SQL解读

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学

NL2SQL任务的目标是将用户对某个数据库的自然语言问题转化为相应的SQL查询。随着LLM的发展,使用LLM进行NL2SQL已成为一种新的范式。在这一过程中,如何利用提示工程来发掘LLM的NL2SQL能力显得尤为重要。

1.Data-Copilot

链接:https://github.com/zwq2018/Data-Copilot

demo链接:https://huggingface.co/spaces/zwq2018/Data-Copilot

论文链接:https://arxiv.org/pdf/2306.07209.pdf

1.1 相关介绍

摘要:

金融、气象、能源等各行各业每天都会生成大量的异构数据。人们急切需要一个工具来有效地管理、处理和展示这些数据。DataCopilot 通过部署大语言模型 (LLMs) 来自主地管理和处理海量数据,即它连接不同领域(股票、基金、公司、经济和实时新闻)的丰富数据,满足多样化的用户查询, 计算, 预测, 可视化等需求。只需要输入文字告诉 DataCopilot 你想看啥数据,无需繁琐的操作,无需自己编写代码, DataCopilot 自主地将原始数据转化为最符合用户意图的可视化结果,因为它可以自主地帮你找数据, 处理数据, 分析数据, 画图, 无需人类协助。

许多研究已经探索了 LLMs 的潜力。例如 Sheet-Copilot、Visual ChatGPT、Audio GPT 利用 LLMs 调用视觉,语音等领域工具进行数据分析、视频编辑和语音转换。从数据科学的角度来看,表格、可视化和音频都可以被视为一种形式的数据,所有这些任务都可以被看作是与数据相关的任务. 因此,一个问题出现了:在通用数据的背景下,LLMs 能否构建自动化的数据科学工作流来处理各种与数据相关的任务?为了实现这一目标,需要解决几个挑战:

(1)从数据角度看:直接使用 LLMs 读取和处理海量数据不仅不切实际,而且存在数据泄露的潜在风险。

(2)从模型角度看:LLMs 不擅长处理数值计算,可能没有合适的可调用外部工具来满足多样化的用户需求,从而限制了 LLMs 的利用率。

(3)从任务角度看:尽管 LLMs 展示了强大的少样本能力,但许多与数据相关的任务是复杂的,需要结合多个操作,如数据检索、计算和表格操作,并且结果需要以图像、表格和文本等多种格式呈现,这些都超出了当前 LLMs 的能力。

Data-Copilot 是一个基于 LLM 的系统,用于处理与数据相关的任务,连接了数十亿条数据和多样化的用户需求。它独立设计接口工具,以高效地管理、调用、处理和可视化数据。在接收到复杂请求时,Data-Copilot 会自主调用这些自设计的接口,构建一个工作流程来满足用户的意图。在没有人类协助的情况下,它能够熟练地将来自不同来源、不同格式的原始数据转化为人性化的输出,如图形、表格和文本。

  • 主要贡献

    1. 设计了一个通用系统 DataCopilot,它将不同领域的数据源和多样化的用户需求连接起来,通过将 LLM 集成到整个流程中,减少了繁琐的劳动和专业知识。
    2. Data-Copilot 可以自主管理、处理、分析、预测和可视化数据。当接收到请求时,它将原始数据转化为最符合用户意图的信息性结果。
    3. 作为设计者和调度者,Data-Copilot 包含两个阶段:离线接口设计 (设计者) 和在线接口调度(调度者)。
    4. 构建了中国金融市场的 Data-Copilot Demo
  • 主要方法

Data-Copilot 是一个通用的大语言模型系统,具有接口设计和接口调度两个主要阶段。

接口设计:我们设计了一个 self-request 的过程,使 LLM 能够自主地从少量种子请求生成足够的请求。然后,LLM 根据生成的请求进行迭代式的设计和优化接口。这些接口使用自然语言描述,使它们易于扩展和在不同平台之间转移。

接口调度:在接收到用户请求后,LLM 根据自设计的接口描述和 in context demonstration 来规划和调用接口工具, 部署一个满足用户需求的工作流,并以多种形式呈现结果给用户。

总体而言,Data-Copilot 通过自动生成请求和自主设计接口的方式,实现了高度自动化的数据处理和可视化,满足用户的需求并以多种形式向用户展示结果。

1 - 接口设计

如图所示, 首先要实现数据管理,第一步需要接口工具。

Data-Copilot 会自己设计了大量接口作为数据管理的工具,其中接口是由自然语言(功能描述)和代码(实现)组成的模块,负责数据获取、处理等任务。

  1. 首先,LLM 通过一些种子请求并自主生成大量请求 (explore data by self-request)。
  2. 然后,LLM 为这些请求设计相应的接口(interface definition: 只包括描述和参数),并在每次迭代中逐步优化接口设计 (interface merge)。
  3. 最后,我们利用 LLM 强大的代码生成能力为接口库中的每个接口生成具体的代码 (interface implementation)。

这个过程将接口的设计与具体的实现分离开来,创建了一套多功能的接口工具,可以满足大多数请求。

2 - 接口调度

在前一个阶段,我们获取了用于数据获取、处理和可视化的各种通用接口工具。每个接口都有清晰明确的功能描述。如图 2 所示的两个示例,Data-Copilot 通过实时请求中的规划和调用不同的接口,形成了从数据到多种形式结果的工作流程。

  1. Data-Copilot 首先进行意图分析来准确理解用户的请求。
  2. 一旦准确理解了用户的意图,Data-Copilot 将规划一个合理的工作流程来处理用户的请求。我们指示 LLM 生成一个固定格式的 JSON,代表调度的每个步骤,例如 step={"arg":"","function":"", "output":"","description":""}。

在接口描述和示例的指导下,Data-Copilot 在每个步骤内以顺序或并行的方式精心安排接口的调度。

如下图例子:

今年一季度上证 50 指数的所有成分股的净利润增长率同比是多少
Data-Copilot 自主设计了工作流如下:

针对这个复杂的问题,Data-Copilot 采用了 loop_rank 这个接口来实现多次循环查询

最后该工作流并执行后结果如下:横坐标是每只成分股的股票名字,纵坐标是一季度的净利润同比增长率

1.2 如何使用

在Spaces中打开 它可以访问中国股票、基金和一些经济数据。但由于gpt3.5的输入令牌长度只有4k,目前的数据访问量仍然相对较小。未来,Data-Copilot将支持更多来自国外金融市场的数据。

步骤1:输入你的Openai或Openai-Azure密钥,请尽量使用Openai的付费API。如果你打算使用Azure的服务,请记得除了密钥外,还要输入api-base和engine。
步骤2:点击“确定”按钮提交
步骤3:在文本框中输入你想要查询的请求,或者直接从示例框中选择一个问题,它会自动出现在文本框中。
步骤4:点击“开始”按钮提交请求
步骤5:Data-Copilot将在“解决步骤”中显示中间调度过程,并在最后呈现文本(摘要和结果)、图像和表格。

1.3 效果展示

用户问题: 预测下面四个季度的中国季度 GDP
部署工作流:获取历史 GDP 数据 ----> 采用线性回归模型预测未来 -----> 输出表格

我想看看最近三年宁德时代和贵州茅台的市盈率

部署工作流

用户问题: 基金经理周海栋管理的基金今年的收益率怎么样

成都银行过去一年的KDJ指标

迭代界面设计的一个简单示例,包括接口定义和接口合并。

界面调度阶段的提示和演示设计

2. Chat2DB

Chat2DB是一个人工智能的数据管理、开发和分析工具。其核心是AIGC(人工智能生成代码)能力。它可以将自然语言转换为SQL,将SQL转换为自然语言,还可以自动生成报表,大大提高人员效率。通过一个产品,可以实现数据管理、数据开发和数据分析的功能。即使那些不懂SQL的人也可以使用快速查询业务数据和生成报告的功能。

当你使用Chat2DB时,你会发现它的AI功能非常强大。当你做任何操作时,它都会给你一些建议。这些建议都是基于Chat2DB的AI模型进行分析的。这会帮助你把工作做得更好。当你在做数据库开发时,他会帮你直接用自然语言生成SQL,给你SQL优化建议,帮你分析SQL的性能,帮你分析SQL的执行计划,还可以帮你快速生成SQL测试数据,生成系统。代码等等。当你做数据分析的时候,他可以直接帮你生成报告,帮你分析数据,帮你生成数据报告等等。

官方链接:https://github.com/chat2db/Chat2DB/blob/main/README_CN.md

手册链接:https://docs.chat2db-ai.com/docs/start-guide/getting-started

2.1 Chat2DB-GLM

Chat2DB-GLM是Chat2DB开源项目的组成部分,旨在提供一个高效的途径,将自然语言查询转换为结构化的SQL语句。此次开源的Chat2DB-SQL-7B模型,拥有7B参数,基于CodeLlama进行了精心微调。这一模型专为自然语言转SQL任务设计,支持多种SQL语言,并且具有高达16k的上下文长度处理能力。

Chat2DB-SQL-7B模型支持广泛的SQL语言,包括但不限于Mysql、Postgres、Sqlite,以及其他通用的SQL语言。这一跨语言支持能力确保了模型的广泛适用性和灵活性。

2.2 模型效果

Chat2DB-SQL-7B模型在多个语言和SQL关键部分上都展现出了优异的性能。以下是模型在不同的SQL关键部分的表现概览,以通用SQL为例,基于spider数据集进行的评测结果展示了模型在处理SQL各个关键部分和各类SQL函数(如日期函数、字符串函数等)上的能力。

语言 select where group order function total
Generic SQL 91.5 83.7 80.5 98.2 96.2 77.3

Chat2DB-SQL-7B主要针对语言MySql、PostgreSQL和通用SQL进行了微调。尽管对于其他SQL语言,此模型仍可提供基本的转换能力,但在处理特定语言的特殊函数(如日期函数、字符串函数等)时,可能会出现误差。随着数据集的变化,模型的性能也可能会有所不同。

请注意,此模型主要供学术研究和学习目的使用。虽然我们努力确保模型输出的准确性,但不保证其在生产环境中的表现。使用此模型所产生的任何潜在损失,本项目及其贡献者概不负责。我们鼓励用户在使用模型时,应谨慎评估其在特定用例中的适用性。

2.3 模型推理

您可以通过transformers加载模型,参考如下样例代码段使用Chat2DB-SQL-7B模型,模型表现会随着prompt不同而有所不同,请尽量使用以下样例中的prompt范式。以下代码块中的model_path可以替换成你的本地模型路径。

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
model_path = "Chat2DB/Chat2DB-SQL-7B" # 此处可换成模型的本地路径
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto",trust_remote_code=True, torch_dtype=torch.float16,use_cache=True)
pipe = pipeline(  "text-generation",model=model,tokenizer=tokenizer,return_full_text=False,max_new_tokens=100)
prompt = "### Database Schema\n\n['CREATE TABLE \"stadium\" (\\n\"Stadium_ID\" int,\\n\"Location\" text,\\n\"Name\" text,\\n\"Capacity\" int,\\n\"Highest\" int,\\n\"Lowest\" int,\\n\"Average\" int,\\nPRIMARY KEY (\"Stadium_ID\")\\n);', 'CREATE TABLE \"singer\" (\\n\"Singer_ID\" int,\\n\"Name\" text,\\n\"Country\" text,\\n\"Song_Name\" text,\\n\"Song_release_year\" text,\\n\"Age\" int,\\n\"Is_male\" bool,\\nPRIMARY KEY (\"Singer_ID\")\\n);', 'CREATE TABLE \"concert\" (\\n\"concert_ID\" int,\\n\"concert_Name\" text,\\n\"Theme\" text,\\n\"Stadium_ID\" text,\\n\"Year\" text,\\nPRIMARY KEY (\"concert_ID\"),\\nFOREIGN KEY (\"Stadium_ID\") REFERENCES \"stadium\"(\"Stadium_ID\")\\n);', 'CREATE TABLE \"singer_in_concert\" (\\n\"concert_ID\" int,\\n\"Singer_ID\" text,\\nPRIMARY KEY (\"concert_ID\",\"Singer_ID\"),\\nFOREIGN KEY (\"concert_ID\") REFERENCES \"concert\"(\"concert_ID\"),\\nFOREIGN KEY (\"Singer_ID\") REFERENCES \"singer\"(\"Singer_ID\")\\n);']\n\n\n### Task \n\n基于提供的database schema信息,How many singers do we have?[SQL]\n"
response = pipe(prompt)[0]["generated_text"]
print(response)
  • 硬件要求
模型 最低GPU显存(推理) 最低GPU显存(高效参数微调)
Chat2DB-SQL-7B 14GB 20GB

3.Vanna Text2SQL优化框架

  • 基于Python语言。可通过PyPi包vanna在自己项目中直接使用

  • RAG框架。很多人了解RAG最典型的应用是私有知识库问答,通过Prompt注入私有知识以提高LLM回答的准确性。但RAG本身是一种Prompt增强方案,完全可以用于其他LLM应用场景。比如之前我们介绍过的在构建Tools Agent时,利用RAG方案可以减少注入到Prompt中的APIs信息的数量,以减少上下文窗口的占用,节约Tokens。Vanna则是通过RAG方案对输入LLM的Prompt进行优化,以最大限度提高自然语言转换SQL的准确率,提高数据分析结果的可信度。

3.1 Vanna 工作原理

官方链接:https://github.com/vanna-ai/vanna

借助 LLM 实现一个最简单的、基于 Text2SQL 的数据库对话机器人本身原理是比较简单的:

这里的关键在于:如果不在大模型层进行优化(比如针对 SQL 进行微调),那么唯一的优化手段只有 Prompt,在之前文章中提到的一些技术研究报告很多都是基于 Prompt 优化,但都相对较复杂。Vanna 则是借助了相对简单也更易理解的 RAG 方法,通过检索增强来构建 Prompt,以提高 SQL 生成的准确率:

来源:Vanna.ai 官方图片

‍从这张图可以了解到,Vanna 的关键原理为:

借助数据库的 DDL 语句、元数据(数据库内关于自身数据的描述信息)、相关文档说明、参考样例 SQL 等训练一个 RAG 的 “模型”(embedding + 向量库);并在收到用户自然语言描述的问题时,从 RAG 模型中通过语义检索出相关的内容,进而组装进入 Prompt,然后交给 LLM 生成 SQL。

因此,使用 Vanna 的基本步骤分为两步:

第一步:在你的数据上训练一个 RAG“模型”

把 DDL/Schemas 描述、文档、参考 SQL 等交给 Vanna 训练一个用于 RAG 检索的 “模型”(向量库)。

Vanna 的 RAG 模型训练,支持以下几种方式:

1. DDL 语句

DDL 有助于 Vanna 了解你的数据库表结构信息。

vn.train(ddl="CREATE TABLE my_table (id INT, name TEXT)")

2. 文档内容

可以是你的企业、应用、数据库相关的任何文档内容,只要有助于 Vanna 正确生成 SQL 即可,比如对你行业特有名词的解释、特殊指标的计算方式等。

vn.train(documentation="Our business defines XYZ as ABC")

3. SQL 或者 SQL 问答对

即 SQL 的样例,这显然有助于大模型学习针对您数据库的知识,特别是有助于理解提出问题的上下文,可以大大提高 sql 生成正确性。

vn.train(question="What is the average age of our customers?",sql="SELECT AVG(age) FROM customers")

4. 训练计划(plan)

这是 vanna 提供的一种针对大型数据库自动训练的简易方法。借助 RDBMS 本身的数据库内元数据信息来训练 RAG model,从而了解到库内的表结构、列名、关系、备注等有用信息。

df_information_schema=vn.run_sql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS")
plan=vn.get_training_plan_generic(df_information_schema)
vn.train(plan=plan)

第二步:提出 “问题”,获得回答

RAG 模型训练完成后,可以用自然语言直接提问。Vanna 会利用 RAG 与 LLM 生成 SQL,并自动运行后返回结果。

3.2 vanna 的扩展与定制化

从上述的 vanna 原理介绍可以知道,其相关的三个主要基础设施为:

  • Database,即需要进行查询的关系型数据库

  • VectorDB,即需要存放 RAG“模型” 的向量库

  • LLM,即需要使用的大语言模型,用来执行 Text2SQL 任务

Vanna 的设计具备了很好的扩展性与个性化能力,能够支持任意数据库、向量数据库与大模型。

【自定义 LLM 与向量库】

默认情况下,Vanna 支持使用其在线 LLM 服务(对接 OpenAI)与向量库,可以无需对这两个进行任何设置,即可使用。因此使用 Vanna 最简单的原型只需要五行代码:

import vanna
from vanna.remote import VannaDefault
vn = VannaDefault(model='model_name', api_key='api_key')
vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite')
vn.ask("What are the top 10 albums by sales?")

注意使用 Vanna.AI 的在线 LLM 与向量库服务,需要首先到 https://vanna.ai/ 去申请账号,具体请参考下一部分实测。

如果需要使用自己本地的 LLM 或者向量库,比如使用自己的 OpenAI 账号与 ChromaDB 向量库,则可以扩展出自己的 Vanna 对象,并传入个性化配置即可。

from vanna.openai.openai_chat import OpenAI_Chat
from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore

class MyVanna(ChromaDB_VectorStore, OpenAI_Chat):
    def __init__(self, config=None):
        ChromaDB_VectorStore.__init__(self, config=config)
        OpenAI_Chat.__init__(self, config=config)

vn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})

当然这里的 OpenAI_Chat 和 ChromaDB_VectorStore 是 Vanna 已经内置支持的 LLM 和 VectorDB。如果你需要支持没有内置支持的 LLM 和 vectorDB,则需要首先扩展出自己的 LLM 类与 VectorDB 类,实现必要的方法(具体可参考官方文档),然后再扩展出自己的 Vanna 对象

【自定义关系型数据库】

Vanna 默认支持 Postgres,SQL Server,Duck DB,SQLite 等关系型数据库,可直接对这一类数据库进行自动访问,实现数据对话机器人。但如果需要连接自己企业的其他数据库,比如企业内部的 Mysql 或者 Oracle,自需要定义一个个性化的 run_sql 方法,并返回一个 Pandas Dataframe 即可。具体可参考下方的实测代码。

  • 参考链接

Vanna:10分钟快速构建基于大模型与RAG的SQL数据库对话机器人 :https://mp.weixin.qq.com/s/-dQYHcK_Ji_jNydgBJxEGw

更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。

相关实践学习
MySQL基础-学生管理系统数据库设计
本场景介绍如何使用DMS工具连接RDS,并使用DMS图形化工具创建数据库表。
相关文章
|
29天前
|
SQL 监控 安全
Flask 框架防止 SQL 注入攻击的方法
通过综合运用以上多种措施,Flask 框架可以有效地降低 SQL 注入攻击的风险,保障应用的安全稳定运行。同时,持续的安全评估和改进也是确保应用长期安全的重要环节。
146 71
|
24天前
|
SQL 存储 人工智能
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
92 7
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
|
9天前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
32 11
|
27天前
|
SQL 安全 Java
除了Flask框架,还有哪些框架能防止SQL注入攻击?
这些框架都在安全方面有着较好的表现,通过它们的内置机制和安全特性,可以有效地降低 SQL 注入攻击的风险。然而,无论使用哪个框架,开发者都需要具备良好的安全意识,正确配置和使用框架提供的安全功能,以确保应用的安全可靠。同时,持续关注安全更新和漏洞修复也是非常重要的。
39 7
|
29天前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
3月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
5月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
135 13
|
5月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
5月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
74 6
|
5月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
471 1