Vanna 利用自然语言生成SQL 和 数据分析报表
产品介绍
Vanna是一个为用户提供更便捷地与SQL数据库交互的工具。它通过允许用户使用自然语言来查询数据库,然后将这些语言转换成SQL语句,从而实现数据库信息的查询和获取。
官网地址:https://top.aibase.com/tool/vanna-ai
项目地址:https://github.com/vanna-ai/vanna
在线体验
注册KEY
在官网主页,点击“Get Started for Free”,按照提示输入邮箱地址
然后到你的邮箱,贴入6位验证码
验证成功后,你就可以免费体验 Vanna 了
复制这段代码,贴到notebook即可直接运行
!pip install vanna
from vanna.remote import VannaDefault
vn = VannaDefault(model='chinook', api_key='略')
vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite')
vn.ask('What are the top 10 artists by sales?')
from vanna.flask import VannaFlaskApp
VannaFlaskApp(vn).run()
点击 next 后,会让你创建一个独一无二的模型名
创建成功后就跳到付费页面了。Vanna默认使用的是GPT-3.5-Turbo(Vanna是免费使用的,但GPT3.5需要付费才能使用)
下载并运行vanna
在github中搜索vanna
下载这两个项目
- vanna-ai/vanna:这个是核心应用程序
- vanna-ai/vanna-streamlit:这个是用来做界面交互的
requirements.txt 的内容如下,我们需要先安装这里面的依赖
pip install -r requirements.txt
依赖安装好后,如果你有 VANNA_API_KEY 和 GCP_PROJECT_ID,可以在该目录下新建一个 test.env
VANNA_API_KEY= ...
GCP_PROJECT_ID= ....
在 app.py 的首行添加如下设置,加载环境变量
from dotenv import load_dotenv
load_dotenv(dotenv_path="test.env")
使用streamlit命令,执行app.py程序
streamlit run .\app.py
私有化部署
如果你想免费运行,那么就需要私有化部署大模型了
部署LLMs(例如:chatglm3)
首先,下载chatglm3和模型到本地,这部就不赘述了
chatglm3代码的下载地址如下:https://github.com/THUDM/ChatGLM3
模型可以去huggingface下载,或者魔塔社区。其中
- ChatGLM3-6B:这个是对话模型(实验中,建议下载这个)
- ChatGLM3-6B-Base:这个是模型的基座,用与微调/全量调试
- ChatGLM3-6B-32K:用于长上下文场景
在chatglm3目录中,找到openai_api_demo文件夹,后台执行api_server.py,启动服务
然后执行启动命令
python3 api_server.py > output.log 2>&1 &
这个命令是在Unix-like操作系统中使用的,用于启动一个Python脚本api_server.py,并将该脚本的输出重定向到文件output.log中。同时,如果有错误发生,错误信息也会被重定向到output.log中。最后,使用&符号将这个进程放到后台运行。
拆分开来解释:
- python3 api_server.py: 这部分是调用Python解释器执行脚本api_server.py。python3是Python 3的解释器命令,而api_server.py是你要运行的Python脚本。
- output.log: 这是一种重定向操作,它将标准输出(通常是终端或控制台)的内容重定向到文件output.log中。这意味着脚本执行的输出信息,如日志消息和打印输出,将不会在屏幕上显示,而是被写入到output.log文件中。
- 2>&1: 这是一种特殊的重定向操作,它将标准错误(通常也显示在控制台上,与标准输出相同)重定向到标准输出。在这个上下文中,标准输出已经被重定向到了output.log,因此这个命令实际上是将标准错误也重定向到output.log中,这样所有的输出和错误信息都会被收集在同一个文件里。
- &: 这个符号将命令放入后台执行。这意味着在执行这个命令的终端窗口中,Python脚本将在后台运行,允许用户继续使用终端进行其他操作。
作用就是启动一个Python脚本,并将它的输出和错误信息都记录到一个文件中,同时让这个脚本在后台运行。这样做的好处是可以在不影响用户操作的情况下运行长时间运行的脚本,同时方便地收集脚本执行的日志信息。
启动后执行下面命令,查看日志的持续输出
tail -f output.log
自定义Vanna代码
新建一个MyVanna.py文件,贴入以下内容
#使用OpenAI API接口或者 OpenAI兼容本地大模型
from vanna.openai.openai_chat import OpenAI_Chat
from openai import OpenAI
from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore
import dynamic
# 接入OpenAI兼容本地大模型
class MyVanna(ChromaDB_VectorStore, OpenAI_Chat):
def __init__(self, config=None):
ChromaDB_VectorStore.__init__(self, config={"path":"Chroma_123"})
#OneAPI包装本地LLM后外露的OpenAI兼容接口
client = OpenAI(
api_key="sk-*********",
base_url="https://192.168.0.22/v1",
)
OpenAI_Chat.__init__(self, client=client, config={"model": "chatglm3-6b"})
def set_model(self, model:str):
pass
def set_api_key(self, value: str):
pass
def connect_to_bigquery(self, project_id: str):
pass
vn = MyVanna()
vn.connect_to_sqlite('D://Downloads/Chinook.sqlite')
vn.train(ddl="""
-- sqlite Employee definition
CREATE TABLE Employee
(
EmployeeId INTEGER NOT NULL,
LastName NVARCHAR(20) NOT NULL,
FirstName NVARCHAR(20) NOT NULL,
Title NVARCHAR(30),
ReportsTo INTEGER,
BirthDate DATETIME,
HireDate DATETIME,
Address NVARCHAR(70),
City NVARCHAR(40),
State NVARCHAR(40),
Country NVARCHAR(40),
PostalCode NVARCHAR(10),
Phone NVARCHAR(24),
Fax NVARCHAR(24),
Email NVARCHAR(60),
CONSTRAINT PK_Employee PRIMARY KEY (EmployeeId),
FOREIGN KEY (ReportsTo) REFERENCES Employee (EmployeeId)
ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE INDEX IFK_EmployeeReportsTo ON Employee (ReportsTo);
""")
vn.train(ddl="""
-- sqlite Customer definition
CREATE TABLE Customer
(
CustomerId INTEGER NOT NULL,
FirstName NVARCHAR(40) NOT NULL,
LastName NVARCHAR(20) NOT NULL,
Company NVARCHAR(80),
Address NVARCHAR(70),
City NVARCHAR(40),
State NVARCHAR(40),
Country NVARCHAR(40),
PostalCode NVARCHAR(10),
Phone NVARCHAR(24),
Fax NVARCHAR(24),
Email NVARCHAR(60) NOT NULL,
SupportRepId INTEGER,
CONSTRAINT PK_Customer PRIMARY KEY (CustomerId),
FOREIGN KEY (SupportRepId) REFERENCES Employee (EmployeeId)
ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE INDEX IFK_CustomerSupportRepId ON Customer (SupportRepId);
""")
vn.train(ddl="""
CREATE TABLE IF NOT EXISTS users (
id INT PRIMARY KEY COMMENT '用户ID',
username VARCHAR(50) COMMENT '用户名',
email VARCHAR(100) COMMENT '电子邮件',
age INT COMMENT '年龄',
gender VARCHAR(10) COMMENT '性别(男/女)',
city VARCHAR(50) COMMENT '城市'
) COMMENT='用户信息表' CHARACTER SET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
""")
向量数据库使用默认的:Chromadb(这个是Vanna官方支持的向量库,很多代码都已经预置了。如果你需要换成其他库,那么就需要重写代码了)
LLMs使用chatglm3模拟出的openai接口(由于是私有化部署的,不校验sk-key,因此可以随便写)
运行后的界面如下
下面输入自然语言,就会生成sql了
- 点赞
- 收藏
- 关注作者
评论(0)