写点什么

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

  • 2024-04-16
    浙江
  • 本文字数:7310 字

    阅读完需:约 24 分钟

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 会自主调用这些自设计的接口,构建一个工作流程来满足用户的意图。在没有人类协助的情况下,它能够熟练地将来自不同来源、不同格式的原始数据转化为人性化的输出,如图形、表格和文本。


  • 主要贡献

  • 设计了一个通用系统 DataCopilot,它将不同领域的数据源和多样化的用户需求连接起来,通过将 LLM 集成到整个流程中,减少了繁琐的劳动和专业知识。

  • Data-Copilot 可以自主管理、处理、分析、预测和可视化数据。当接收到请求时,它将原始数据转化为最符合用户意图的信息性结果。

  • 作为设计者和调度者,Data-Copilot 包含两个阶段:离线接口设计 (设计者) 和在线接口调度(调度者)。

  • 构建了中国金融市场的 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 函数(如日期函数、字符串函数等)上的能力。



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


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

2.3 模型推理

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


import torchfrom transformers import AutoTokenizer, AutoModelForCausalLM, pipelinemodel_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)
复制代码


  • 硬件要求



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 vannafrom vanna.remote import VannaDefaultvn = 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_Chatfrom 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


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

发布于: 刚刚阅读数: 2
用户头像

本博客将不定期更新关于NLP等领域相关知识 2022-01-06 加入

本博客将不定期更新关于机器学习、强化学习、数据挖掘以及NLP等领域相关知识,以及分享自己学习到的知识技能,感谢大家关注!

评论

发布
暂无评论
NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]_大模型_汀丶人工智能_InfoQ写作社区