Vanna 利用自然语言生成SQL 和 数据分析报表

举报
福州司马懿 发表于 2024/04/22 11:11:49 2024/04/22
【摘要】 产品介绍Vanna是一个为用户提供更便捷地与SQL数据库交互的工具。它通过允许用户使用自然语言来查询数据库,然后将这些语言转换成SQL语句,从而实现数据库信息的查询和获取。官网地址:https://top.aibase.com/tool/vanna-ai项目地址:https://github.com/vanna-ai/vanna 在线体验 注册KEY在官网主页,点击“Get Started...

产品介绍

Vanna是一个为用户提供更便捷地与SQL数据库交互的工具。它通过允许用户使用自然语言来查询数据库,然后将这些语言转换成SQL语句,从而实现数据库信息的查询和获取。

官网地址:https://top.aibase.com/tool/vanna-ai

图片.png

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

图片.png

在线体验

注册KEY

在官网主页,点击“Get Started for Free”,按照提示输入邮箱地址

图片.png

然后到你的邮箱,贴入6位验证码

图片.png

验证成功后,你就可以免费体验 Vanna 了

图片.png

复制这段代码,贴到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 后,会让你创建一个独一无二的模型名

图片.png

创建成功后就跳到付费页面了。Vanna默认使用的是GPT-3.5-Turbo(Vanna是免费使用的,但GPT3.5需要付费才能使用)

图片.png

下载并运行vanna

在github中搜索vanna

图片.png

下载这两个项目

  1. vanna-ai/vanna:这个是核心应用程序
  2. vanna-ai/vanna-streamlit:这个是用来做界面交互的

图片.png

requirements.txt 的内容如下,我们需要先安装这里面的依赖

pip install -r requirements.txt

图片.png

依赖安装好后,如果你有 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")

图片.png

使用streamlit命令,执行app.py程序

streamlit run .\app.py

图片.png

图片.png

私有化部署

如果你想免费运行,那么就需要私有化部署大模型了

部署LLMs(例如:chatglm3)

首先,下载chatglm3和模型到本地,这部就不赘述了

chatglm3代码的下载地址如下:https://github.com/THUDM/ChatGLM3

图片.png

模型可以去huggingface下载,或者魔塔社区。其中

  • ChatGLM3-6B:这个是对话模型(实验中,建议下载这个)
  • ChatGLM3-6B-Base:这个是模型的基座,用与微调/全量调试
  • ChatGLM3-6B-32K:用于长上下文场景

图片.png

在chatglm3目录中,找到openai_api_demo文件夹,后台执行api_server.py,启动服务

图片.png

然后执行启动命令

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脚本,并将它的输出和错误信息都记录到一个文件中,同时让这个脚本在后台运行。这样做的好处是可以在不影响用户操作的情况下运行长时间运行的脚本,同时方便地收集脚本执行的日志信息。

图片.png

启动后执行下面命令,查看日志的持续输出

tail -f output.log

图片.png

自定义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,因此可以随便写)

运行后的界面如下

图片.png

下面输入自然语言,就会生成sql了

图片.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。