改版通知

巨人肩膀网站已全新改版。若您仍依赖旧站功能或数据,欢迎联系我们,我们会协助处理。联系我们

一个能让你和数据库对话的软件,文本直接生成SQL和分析图表,Star 10K+!

oP3us6Af1G1D4v7c7iIPkM-piUzQ2024年8月13日694 浏览

作为一个IT估计没有人不知道SQL。在日常工作中,我们也有很多地方都需要SQL操作,比如:

  • 数据查询:从数据库中查询特定信息,验证数据库数据和前端数据是否一致;
  • 数据分析:采用SQL生成数据统计报告,分析业务趋势和关键业务指标;
  • 数据清洗:对数据库中的数据进行清洗,比如去重、修正错误数据等;
  • 数据备份:通过SQL定期备份数据库中的数据,保证数据安全;
  • 性能监控:监控数据库的性能,使用SQL来分析慢查询和性能瓶颈;
  • 自动化脚本:编写SQL脚本自动化常规任务,提高工作效率。

几乎所有需要在数据库操作数据的场景都可能用到SQL。尤其步入了大数据时代,自助式BI或者自助式数据分析场景随处可见,SQL的应用场景也越来越广泛。乃至我见过某些公司招聘财务人员时,招聘要求里面都写需要掌握SQL,以便对一些财务数据进行分析整理。

但是SQL有一套严格的语法规则,而且不同的数据库SQL有可能有不同的特点和函数,语法上也有差异,这个无疑给很多想学习SQL的人带来了困难。所以,今天给大家介绍的是一个无需编写SQL,只需通过文本描述你的需求即可,就能直接帮你生成SQL和数据分析图表能力的软件-Vanna


01

Vanna 介绍

一个开源的、高度可定制的AI SQL代理(MIT开源协议),可以将用户的自然语言问题转换为有效的SQL查询和数据分析图表,为用户提供了快速获取数据洞察的能力,降低了SQL使用的技术门槛。

图片

🏠  项目信息

#github地址
https://github.com/vanna-ai/vanna
#项目官网
https://vanna.ai/

20e946c00d732fc9ebfba752595a9039_640_wx_fmt=png&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1.webp

🚀功能特性

  • 自然语言查询:用户可以使用自然语言提出问题,Vanna将其转换为SQL查询,无需用户具备深入的SQL知识。
  • 高准确性:Vanna对于提供的训练数据有很好的准确性,能够生成正确且高效的SQL查询。
  • 数据安全性:Vanna在设计时重视数据安全,避免将数据库内容发送到外部服务。
  • 自我学习能力:随着用户使用的频率,Vanna会通过收集更多的数据和查询不断学习和改进。
  • 可定制性:采用MIT开源协议,企业根据特定的需求进行定制,包括使用不同的数据库、语言模型和前端界面等。
  • 多数据库支持:Vanna不局限于单一的数据库,它可以生成适用于任何SQL数据库的查询。
  • 简单易用:Vanna的用户界面简洁明了,易于上手,无需技术背景,也能快速使用。


🛠 原理架构

Vanna 的工作原理分为两个简单的步骤 - 在数据上训练 RAG“模型”,然后提出问题,这些问题将返回可在数据库上运行的 SQL 语句。

图片

02

Vanna 安装和使用


Vanna的部署本文采用了本地Ollama模型,使用ChromaDB本地向量库,接入MYSQL数据。

1. 安装 Vanna 和依赖

安装 Vanna 包及其所需的 ChromaDB、Ollama 和 MySQL 依赖。

pip install 'vanna[chromadb,ollama,mysql]'

2. 导入模块并设置 Vanna 类

在Python 脚本中,导入模块

from vanna.ollama import Ollama
from vanna.chromadb import ChromaDB_VectorStore
class MyVanna(ChromaDB_VectorStore, Ollama):
   def __init__(self, config=None):
        ChromaDB_VectorStore.__init__(self, config=config)
        Ollama.__init__(self, config=config)
 vn = MyVanna(config={'model': 'mistral'})

3. 连接到 MySQL 数据库

使用 Vanna 实例连接到 MySQL 数据库(按照实际情况修改连接信息):

vn.connect_to_mysql(host='xxxxx', dbname='xxxxx', user='xxxxxxx', password='xxxxxxx', port=3306)

4. 训练模型

训练模型通常只需要执行一次,但是后续想添加更多的训练数据,需要再次进行执行:

# 从 INFORMATION_SCHEMA 获取数据库的元数据
df_information_schema = vn.run_sql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS")
# 将信息架构分解为适合 LLM 引用的小片段
plan = vn.get_training_plan_generic(df_information_schema)
# 如果计划合适,取消下面代码的注释并运行以训练模型
# vn.train(plan=plan)

5. 添加训练数据(可选)

添加训练数据,例如 DDL 语句、业务术语文档或现有的 SQL 查询:

vn.train(ddl="""CREATE TABLE IF NOT EXISTS my_table (...)""")
vn.train(documentation="Business definition of some term")
vn.train(sql="SELECT * FROM my_table WHERE name = 'John Doe'")

6. 检查训练数据

检查 Vanna 能够引用的训练数据:

training_data = vn.get_training_data()

7. 提问生成 SQL

使用 Vanna 提问,根据最相关的训练数据片段并生成 SQL:

query = vn.ask(question="Your question here")

8. 启动用户界面(可选)

使用 Flask 启动 Vanna 的用户界面:

from vanna.flask import VannaFlaskApp
app = VannaFlaskApp(vn)
app.run()

图片

03

效果预览

询问销售额排名前 10 位的客户是哪些?

vn.ask("What are the top 10 customers by sales?")
自动转换为以下SQL:
SELECT c.c_name as customer_name,
         sum(l.l_extendedprice * (1 - l.l_discount)) as total_sales
FROM snowflake_sample_data.tpch_sf1.lineitem l join snowflake_sample_data.tpch_sf1.orders o
         ON l.l_orderkey = o.o_orderkey join snowflake_sample_data.tpch_sf1.customer c
         ON o.o_custkey = c.c_custkey
GROUP BY customer_name
ORDER BY total_sales desc limit 10;
         

SQL查询会获得以下数据:

图片

自动的 Plotly 图表:

图片

04

最后

Vanna本质是检索增强生成(RAG)和大型语言模型(LLMs)结合的一种面向SQL的场景,使用户能够以自然语言与数据库进行交互,从而生成SQL查询和可视化图表。而且采用了 MIT license 开源协议,方便企业二次开发和集成到自己的系统中。如果你和你的团队也感兴趣的,不妨实践下吧!