一、前言
在数字化浪潮中,数据已成为企业的核心资产,而SQL则是解锁这些资产的关键。但对于非技术用户,SQL的复杂性往往成为难以跨越的障碍,阻碍了他们直接从数据中提取价值。为了解决这一问题,Text2SQL技术应需而生,它允许用户以自然语言的形式与数据库进行交互,极大地降低了数据分析的门槛。
尽管Text2SQL简化了查询过程,它在处理复杂查询和整合外部知识方面仍显不足。为此,RAG2SQL技术应运而生,通过检索增强和生成模型的结合,显著提升了SQL查询的精确度和处理复杂性的能力。
Vanna,一款基于RAG2SQL技术的AI工具,正是在这样的技术背景下诞生。它不仅继承了RAG2SQL的技术优势,更进一步简化了用户与数据库的交互,使得自然语言查询转化为精确SQL代码的过程自动化、智能化。无论是数据分析师、业务专家还是普通用户,Vanna都能助他们轻松洞察数据背后的故事。
本文将深入剖析Vanna的内在机制,展示其如何利用RAG2SQL技术将繁琐的数据库查询转变为简洁的自然语言对话,引领数据分析走向更智能、更高效的未来。Vanna的使命是让数据的价值得到充分释放,推动数据民主化的进程,为每个人带来更加直观、易用的数据分析体验。
二、Text2SQL的挑战
Text-to-SQL任务旨在将自然语言问题转换为等价的SQL查询语句。这个过程涉及到自然语言理解、语义解析、上下文推理和SQL生成等多个环节。传统的基于模式匹配和机器学习的方法在处理复杂和多样化的问题时存在局限性,主要体现在以下几个方面:
- 自然语言的歧义性:相同的问题可以用多种不同的表述方式提出,而不同的问题可能具有相似的表述。这种歧义性使得准确理解用户的问题意图成为一大挑战。
- 查询的复杂性:真实场景中的数据查询往往涉及多个表、复杂的条件筛选和聚合操作。传统的基于模式匹配和机器学习的方法在生成复杂 SQL 查询时缺乏足够的精度。
- 领域适应性:不同领域的数据库模式各不相同,传统方法在适应新的领域时面临挑战,难以实现良好的泛化能力。
- 人机交互的局限性:传统的 Text-to-SQL 系统缺乏对用户意图的深入理解,且缺乏有效的错误反馈机制,这限制了多轮对话和交互式查询的实现。
- SQL 优化问题:虽然 LLMs 能够生成正确的 SQL 查询,但在优化查询效率方面仍有很大提升空间。需要在提示工程中融入数据库原理和优化规则的知识,引导 LLMs 学习执行代价估计和查询重写等优化策略。
- 外键信息的使用问题:如何更好地利用外键信息来提升 Schema Linking 的性能也是一个重要的挑战。这需要在提示模板中显式标注外键关系,或者在模型的 embedding 中编码外键信息。
- 小样本学习能力的拓展:LLMs 在 Text-to-SQL 任务中的小样本学习能力还有待进一步挖掘。通过设计更加高效的 Few-shot Learning 范式,可以降低 LLMs 对标注数据的依赖,提高其在新领域的适应能力。
- 可解释性、公平性和数据安全:发展 LLMs 驱动的 Text-to-SQL 系统,需要在可解释性、公平性和数据安全等方面给予高度重视,确保技术的负责任使用,并避免带来不必要的风险。
三、Vanna 介绍
Vanna,是一款革命性的AI SQL智能体,可以将复杂的SQL查询简化为日常语义对话。在生成式AI的助力下,Vanna 让数据库查询变得前所未有的简单和直观。它是基于 OpenAI 和 Google 提供的大语言模型(LLM)。Vanna 通过预训练模型,结合你的数据库进行微调,可以快速帮你量身打造一个定制化的AI助手。
Vanna 是一个获得 MIT 许可的开源 Python RAG(检索增强生成)框架,用于 SQL 生成和相关功能。GitHub 已经高达 7200 颗星🌟,对于通过语义搜索数据库存在很多业务场景都有非常大的价值,尤其是面向频繁做数据分析和数据统计的情况下,直接通过需求生成数据库SQL查询DB返回结果到前端中。
Vanna的核心优势在于它的用户友好性和学习能力。即使您不是技术专家,也能通过自然语言与Vanna交流业务问题。Vanna将这些问题转化为精准的SQL查询,并快速执行,然后以易于理解的Pandas DataFrame、直观的可视化图表,以及有助于进一步探索的后续问题建议的形式,向您展示结果。
为了确保Vanna能够准确理解并回应您的需求,它需要接受包括SQL示例、数据库文档和数据定义语言(DDL)在内的信息训练。Vanna的智能之处不仅在于其初始的精准度,更在于它能够不断从交互中学习,自我完善。每一次生成的SQL查询都会被用作训练数据,帮助Vanna从错误中学习,逐步提高其性能。
Vanna的工作流程直观而高效,如下图展示的那样,它将复杂的技术过程封装在一个简单的界面之后,让用户体验到无缝的交互。通过持续的学习和优化,Vanna致力于成为您最可靠的数据分析伙伴。
3.1、Vanna 优势
处理和分析大量数据已成为企业和个人不可或缺的能力。选择合适的工具,可以大幅提升我们从数据中获取洞见和价值的效率。这就是 Vanna 应运而生的原因——一个创新的 AI 助手,旨在简化数据交互并增强决策能力。之所以选择 Vanna,因为它具备了以下的优势:
- 精准高效:Vanna 擅长处理复杂的数据集,能够提供高度精确的分析结果。
- 数据驱动:Vanna 的性能与您提供的训练数据密切相关。数据越多,Vanna 处理大型复杂数据集的能力就越强,准确度也就越高。
- 安全可靠:使用 Vanna 时,您的数据库内容始终安全无虞,不会被发送到大型语言模型(LLM)或向量数据库。所有的 SQL 查询执行均在本地环境内完成,确保了数据的私密性。
- 自我进化:Vanna 具备自我学习的能力。在使用 Jupyter 时,您可以选择让 Vanna 自动从成功执行的查询中学习。如果是通过其他接口使用,Vanna 可以引导用户对结果进行反馈,并将正确的查询与 SQL 对应关系保存下来,以提升未来查询的精确度。
- 广泛兼容:Vanna 支持所有 Python 能够连接的 SQL 数据库,具有极高的通用性。
- 灵活定制:Vanna 提供了多种使用方式,您可以选择 Jupyter Notebook 作为前端进行交互,或者通过 Slackbot、Web 应用程序、Streamlit 应用程序或自定义的前端界面,将 Vanna 的强大功能直观地展示给您的最终用户。
四、Vanna 原理
从本质上讲,Vanna 是一个 Python 包,它使用检索增强来帮助您使用 LLMs 为数据库生成准确的 SQL 查询。
Vanna 的核心是一个精心设计的 Python 包,它巧妙地融合了最新的人工智能技术,旨在简化数据库查询的生成过程。从本质上讲,Vanna 是一个 Python 包,它使用检索增强(Retrieval-Augmented Generation)来帮助您使用大型语言模型(LLMs)为数据库生成准确的 SQL 查询。
检索增强是一种结合了检索(即搜索)和生成(即创建)的方法。Vanna 利用这种方法,首先从数据库中检索相关信息,然后增强语言模型的理解能力,使其能够更准确地理解查询的上下文和意图。这种方法的优势在于,它不仅依赖于模型内部的知识,还能够即时从数据中获取最新信息,从而生成更加精确的 SQL 查询。
Vanna 的工作过程分为两个简单步骤 - 在您的数据上训练 RAG“模型”,然后提出问题,这些问题将返回 SQL 查询,这些查询可以设置为在您的数据库上自动运行。
1、训练模型:
首先,您需要在您的数据集上训练一个自定义模型。您使用的数据质量越高、数量越大,模型的性能就越好。
2、提问:
模型训练完成后,您就可以开始用普通话提问了。Vanna 将利用该模型生成 SQL 查询,从您的数据库中检索出您所需的数据。
通过这种方式,Vanna 不仅提高了 SQL 查询的生成效率,还确保了查询的准确性和相关性,为用户提供了一个强大的数据库查询辅助工具。
本质上,任何将文本转换为 SQL 的尝试都必须面对整合数据库领域知识的挑战。Vanna 通过整合上下文数据(元数据、数据定义语言DDL、查询等),这些数据被“训练”并嵌入使用,从而表现出色。
此外,它通过加入一个“分类器”层来提高准确性——将包括过去查询在内的最相关上下文发送到任务中,从而显著提高结果的准确性。
五、Vanna 应用
让我们一步步了解如何利用一个示例数据集开始使用 Vanna。
5.1、安装与设置
安装和设置 Vanna 只需简单四步:
# 1、安装 Vanna
%pip install vanna
import vanna as vn
# 2、登录 Vanna
api_key = vn.get_api_key('my-email@example.com') # 此处替换为您的电子邮件地址
vn.set_api_key(api_key)
# 3、设置模型(示例:使用 'chinook' 公共模型)
vn.set_model('chinook')
# 4、连接数据库(示例:SQLite)
vn.connect_to_sqlite('https://github.com/lerocha/chinook-database/raw/master/ChinookDatabase/DataSources/Chinook_Sqlite.sqlite')
5.2、开始提问
设置完成后,您就可以开始对数据库进行查询了:
# 提问
vn.ask("按销售额排名前五位的艺术家是谁?")
有关如何开始使用 Vanna 的详细指南,请查阅文档。
六、Vanna 训练
为了使模型专门适应您的数据集,您可以手动训练模型。首先,您需要设置模型:
# 登录 Vanna
api_key = vn.get_api_key('my-email@example.com')
vn.set_api_key(api_key)
# 设置您的模型(选择一个唯一的模型名称):
vn.set_model('my-model')
模型可以通过三种方式进行训练:
6.1、SQL 命令
SQL 命令是数据库交互的核心。通过 SQL 命令训练您的 Vanna 模型,有助于它正确理解并生成 SQL 查询。
您可以使用 vn.add_sql(question, sql, tag) 函数将 SQL 命令插入模型的训练数据中,其中:
- question:代表自然语言问题或查询。
- sql:对应回答该问题的 SQL 查询。
- tag(可选):为训练数据提供标签或标记。
# 示例
vn.add_sql(question="员工的平均薪资是多少?",
sql="SELECT AVG(salary) FROM employees")
6.2、DDL (数据定义语言)
DDL 语句用于定义和管理数据库结构,包括创建表、修改架构和定义约束。
通过使用 vn.add_ddl(ddl) 函数将 DDL 语句添加到训练数据中,可以帮助提高您的 Vanna 模型对数据库结构的理解。
# 示例
vn.add_ddl(ddl="CREATE TABLE employees (id INT, name VARCHAR(255), salary INT)")
通过训练 DDL 语句,您的模型将熟悉数据库的结构和架构,从而能够生成与数据库操作相关的 SQL 查询。
6.3、文档
文档提供了数据库中各种元素的上下文和解释,包括表定义或关键指标、业务规则。
可以使用 vn.add_documentation(documentation) 方法将文档添加到训练数据中。
# 示例
vn.add_documentation(documentation="我们组织对销售额的定义是一个商品的折扣价乘以销售数量。")
添加文档使您的模型能够在生成具有相关上下文的 SQL 查询时,提供更具洞察力的响应。
七、分析训练数据
分析训练数据需要评估数据集的质量、数量以及多样性,以确保其满足模型训练需求。这确保了训练数据具备准确性、多样性和时效性。
# 查看训练数据
vn.get_training_data()
Vanna 始终保持用户交互功能,允许用户提问并获得 SQL 查询或响应。
7.1、自动训练
Vanna 提供自动训练功能,目前仅适用于 Snowflake 数据库。自动训练分为三个步骤:
1、连接数据库
连接您想要训练模型的数据库,该数据库将用于生成训练数据。
vn.connect_to_snowflake(
account='my-account',
username='my-username',
password='my-password',
database='my-database'
)
Vanna 会自动分析数据库,收集元数据,为后续训练提供信息。
2. 生成训练计划
Vanna 会根据收集到的数据库元数据生成训练计划,确定训练模型时需要包含的数据库结构和查询内容。训练计划明确了自动训练的范围,即哪些数据库结构和查询信息将会被纳入模型训练。
training_plan = vn.get_training_plan_experimental(
filter_databases=['my-database'], # 可选:过滤数据库
filter_schemas=['public'], # 可选:过滤模式
include_information_schema=False, # 可选:包含系统模式
use_historical_queries=True # 可选:包含历史查询
)
3. 执行训练
Vanna 利用训练计划自动训练模型,将 SQL 查询、数据定义语言 (DDL) 语句以及数据库文档整合到模型的知识库中。这一步骤帮助模型学习数据库的结构和语义,提高模型的理解能力。
# 使用生成的训练计划训练模型
vn.train(plan=training_plan)
7.2、删除无用数据点
训练数据的质量会直接影响模型的训练效果,建议您删除无用的数据点。避免使用敏感信息或过时数据进行模型训练,以免影响模型的表现。
# 删除训练数据(如果需要)
vn.remove_training_data(id='my-training-data-id')
八、连接到数据库
Vanna 能够与多种类型的数据库进行集成,包括但不限于 Snowflake、BigQuery、Postgres 等。要连接到特定类型的数据库,您需要一个 Python 数据库连接器/库来帮助建立与数据库服务器的连接。
# 连接到 Snowflake
# 设置您的 Snowflake 凭据
account = "your-account-url"
username = "your-username"
password = "your-password"
database = "your-database"
# 连接到 Snowflake
vn.connect_to_snowflake(
account=account,
username=username,
password=password,
database=database
)
# 连接到 SQLite
# 指定您 SQLite 数据库文件的 URL
sqlite_url = "sqlite:///path/to/your/database.sqlite"
# 连接到 SQLite
vn.connect_to_sqlite(sqlite_url)
# 连接到 Postgres
# 设置您的 Postgres 凭据
host = "your-host"
dbname = "your-database"
user = "your-username"
password = "your-password"
port = 5432 # Postgres 的默认端口
# 连接到 Postgres
vn.connect_to_postgres(
host=host,
dbname=dbname,
user=user,
password=password,
port=port
)
不同类型的数据库可以满足不同的使用场景。例如,您可以使用 SQLite 进行本地开发和测试,而 Web 应用程序可能更适合使用 Postgres。
Vanna 支持多种数据库,可以满足绝大多数项目的需要。
九、未来规划
在数据分析领域,Vanna 以其独特的愿景和创新路径,正逐步成为 AI 数据分析师的首选工具。Vanna 的目标不仅仅是简化数据分析过程,而是要重新定义整个领域,通过其先进的 AI 技术,提供与人类数据分析师相媲美的准确性、交互性和自主性。
Vanna 的未来规划以三个核心目标为指导:准确性、交互性和自主性。这三个目标共同构成了 Vanna 的发展蓝图,旨在推动数据分析技术的进步,为用户提供前所未有的体验。
1)、准确性是 Vanna 的首要追求。Vanna 致力于通过大型语言模型 (LLM) 掌握 SQL 生成,以实现与经验丰富的数据分析师相媲美的“经验准确性”。Vanna 认识到,SQL 作为最常见的即席数据访问接口,其高 Token 密度使其成为上下文有限 LLM 的理想应用场景。通过存储历史正确的问答对,并利用这些数据来引导 LLM 的响应,Vanna 已经在提高 SQL 生成和数据分析的准确性方面取得了显著进展。
2)、交互性是 Vanna 与用户建立联系的桥梁。Vanna 的 AI 旨在以一种熟悉且协作的方式与用户交互,类似于人类数据分析师与利益相关者之间的互动。Vanna 的 AI 能够请求信息、寻求澄清、提供解释、置信度评分,并建议后续问题,从而确保用户能够获得所需的信息,并与 AI 进行有效的沟通。
3)、自主性是 Vanna 赋予 AI 的关键能力。Vanna 旨在通过简化的入职流程,使 AI 能够立即访问必要的系统和数据源,并根据其数据分析自主执行后续操作,如生成报告、提醒利益相关者或触发工作流。
Vanna 的开源理念和模块化设计是其实现愿景的基石。开源不仅使社区能够为项目做出贡献,还有助于 Vanna 更快地实现目标。模块化设计则确保 Vanna 能够满足任何组织的安全要求,允许用户将 Vanna 集成到其安全团队已经批准的组件中。
十、总结
本文深入探讨了使用 Vanna 的各个方面,从设置和模型训练到连接数据库和利用其特性。简而言之,Vanna 简化了生成 SQL 查询和与数据库交互的过程,使之成为数据专业人士、分析师和开发者的宝贵工具。其适应性和用户友好的特性使其成为那些希望通过 AI 驱动的辅助增强其数据库相关任务的个人的一个诱人选择。
总之,Vanna 的发展比预期快了一个月。这段时间内,用户数量增长了 600%。一些大型企业,包括财富 1000 强公司,已经开始使用 Vanna 进行数据查询。这表明 Vanna 已经成为一个可靠的解决方案,能够处理抽象的数据库交互。
为了提高可访问性和通用性,Vanna 决定开源其框架。此外,他们正在开发一个基于云的 Web 应用程序,方便用户使用并覆盖更广泛的用户群体。Vanna 未来的计划包括整合大语言模型 (LLMs)。这表明该公司致力于跟上人工智能技术的进步,并为用户提供更多选择。
参考资料
[1]. Vanna AI GitHub: https://github.com/vanna-ai/vanna
[2]. Vanna AI Docs: https://vanna.ai/docs/
[3]. Vanna AI SQL Accuracy: https://vanna.ai/blog/ai-sql-accuracy.html