TEXT2SQL工具vanna本地化安装和应用

TEXT2SQL工具vanna本地化安装和应用

Vanna和Text2SQL

TEXT2SQL即文本转SQL,是利用RAG和LLM来实现输入一段文本,系统自动生成SQL,甚至把数据结果用图表的方式展现出来,以下是一些典型的应用实例:

复制代码
企业数据分析:企业内部的业务分析师或非技术员工可以通过自然语言提问,如"上个季度销售额最高的五个产品是什么?"Text2SQL系统能够自动将此类问题转换为SQL查询,从数据库中提取所需信息,无需手动编写SQL代码,大大提升了数据分析的效率和易用性。

智能客服系统:在客户服务场景中,Text2SQL可以帮助客服机器人理解用户的问题,比如查询订单状态、退换货政策等,并自动执行数据库查询以提供准确的答案,从而提升客服响应速度和服务质量。

个人助理与智能家居:在智能家居或个人助理应用中,用户可以通过语音或文本提出请求,如"明天早上7点提醒我开会"或"显示最近一周的电费消耗情况",Text2SQL技术能够解析这些请求并转换成数据库查询指令,与家庭自动化系统或个人日程管理系统交互,实现智能化控制和信息反馈。

电子商务平台:电商平台可以利用Text2SQL快速处理用户的商品搜索请求,如"红色高跟鞋尺码37且价格低于500元",系统自动构建SQL查询,从商品数据库中筛选出符合条件的商品列表。

金融行业报告生成:在金融分析领域,分析师可以提出复杂的需求,如"统计过去一年内公司A的日均交易量并对比行业平均值",Text2SQL能够帮助自动生成相应的SQL查询,从海量金融数据中提取所需信息,辅助决策制定。

健康医疗信息查询:在医疗信息系统中,医生或研究人员可以通过自然语言查询患者病历、药物信息或疾病统计数据,Text2SQL能够将这些查询转换为SQL,快速检索电子病历系统或医学数据库中的相关记录。

这些场景展示了Text2SQL如何作为自然语言处理和数据库交互的桥梁,简化数据查询流程,提高数据获取的效率和灵活性。随着自然语言处理技术的进步,Text2SQL的应用将会越来越广泛,为跨领域用户提供更加便捷的数据访问方式。

环境安装和数据准备

此处使用私有化的ollama的环境和本地的向量数据库chromaDB和词向量嵌入模型all-MiniLM-L6-v2来搭建本地化环境,并连接到mysql数据库,进行数据分析。

这里使用的是centos7 ,并有一块11G显存的GeForce GTX 1080 Ti,本文编制的时候,使用的是vanna 0.5.4版本。

conda虚拟环境安装

此处默认已经安装了conda环境,创建虚拟环境:

复制代码
conda create -n vanna -y python=3.9

激活环境

复制代码
conda activate vanna

安装包,当然ipykernel可以不安装,看需要

复制代码
pip install 'vanna[chromadb,ollama,mysql]'
pip install ipykernel

数据准备

在待连接的mysql数据库的,demodb数据库中新建表和记录,当然可以在不同数据库里面创建表,并插入不同的数据,根据实际情况可以调整SQL,并调整后续步骤的python代码中连接数据库的内容。

复制代码
CREATE TABLE IF NOT EXISTS vuser (
    `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;


INSERT INTO vuser (`id`, username, email, age, gender, city) VALUES
(1, '张三', 'zhangsan@example.com', 30, '男', '北京'),
(2, '李四', 'lisi@example.com', 25, '女', '上海'),
(3, '王五', 'wangwu@example.com', 40, '男', '广州'),
(4, '赵六', 'zhaoliu@example.com', 35, '女', '深圳'),
(5, '小明', 'xiaoming@example.com', 28, '男', '成都'),
(6, '小红', 'xiaohong@example.com', 45, '女', '重庆'),
(7, '小华', 'xiaohua@example.com', 32, '男', '天津'),
(8, '小丽', 'xiaoli@example.com', 27, '女', '南京'),
(9, '小李', 'xiaoli2@example.com', 38, '男', '武汉'),
(10, '小美', 'xiaomei@example.com', 33, '女', '西安');

ollama环境准备

ollama安装和运行

注:使用root或者有sudo权限的用户

复制代码
curl -fsSL https://ollama.com/install.sh | sh
service ollama stop

默认是绑定在127.0.0.1的IP,若需要绑定到指定IP,那么采用如下:

复制代码
export OLLAMA_HOST=xx.xx.xx.71:11434
nohup ollama serve &    

这样就绑定到某个非127.0.0.1的IP上了,方便其他服务器访问。

ollama下载模型
复制代码
这里使用qwen的7b模型,根据实际情况,下载还是比较快的。


ollama run qwen:7b

下载后会自动进入命令行聊天交互界面,可以测试下,最后可以输入/bye退出聊天。

测试下API方式正常使用
复制代码
curl http://xx.xx.xx.71:11434/api/chat -d '{
"model": "qwen:7b",
"messages": [
{ "role": "user", "content": "什么是股票?" }
]
}'

chromaDB的默认的embedding模型准备

当然这个模型在后续的VANNA脚本运行起来的时候会自动下载,但是可能有时候快有时候慢,在魔搭上传了一个模型

https://www.modelscope.cn/models//all-MiniLM-L6-v2/summary (80MB+),下载onnx.tar.gz后,直接放到$HOME/.cache/chroma/onnx_models/all-MiniLM-L6-v2/onnx目录下,解压开来即可。


到这里环境就基本准备好了,可以跑脚本,启动下服务了。

vanna脚本跑起来

这里连接的ollama模型名称,地址根据需要进行修改,还有连接的用于生成SQL数据分析的MYSQL数据库连接和库名等根据需要修改。

这里的脚本chroma使用的local的模型,运行了以下脚本后,会在运行的目录下生成chroma.sqlite3文件,存放训练的数据,别删了,删了那训练数据就没了,要重新来。

比如保存成testv.py

复制代码
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': 'qwen:7b','ollama_host':'http://xx.xx.xx.71:11434'})





vn.connect_to_mysql(host='xx.xx.xx.101', dbname='demodb', user='root', password='99099a', port=3306)

# The information schema query may need some tweaking depending on your database. This is a good starting point.
df_information_schema = vn.run_sql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS")

# This will break up the information schema into bite-sized chunks that can be referenced by the LLM
plan = vn.get_training_plan_generic(df_information_schema)


vn.train(ddl="""CREATE TABLE IF NOT EXISTS vuser (
    `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;
""")

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

直接在以上创建的vanna虚拟环境中运行起来。

复制代码
python testv.py

如果前面嵌入模型没准备好,那么在问答的时候,第一次会下载模型,类似如下:

这样,就可以访问8084端口,进入页面,开始和系统交互了。

注意:如果没有训练数据,那么点击Trainning Data,界面会提示错误。

这个是在代码里面添加了DDL语句,直接显示在界面了。

交互实例:
如果结果是正确的,那么点击 Were the results correct下的YES按钮,那么系统会将问答的过程加入到训练的数据中,类似如下:

统计+图表分析
点击结果正确,就可以将问答又加入到库中

也可以通过"Add training data"自行添加。


完结,有啥问题也可以留言沟通


展望:如果这玩意能够生成ETL代码,搞定这事,就更好了,解放思路了,有搞头!

相关推荐
Rick19932 分钟前
Redis查询为什么快
数据库·redis·缓存
fly spider4 分钟前
MySQL索引篇
android·数据库·mysql
oradh16 分钟前
Oracle数据库表存储基本概述
数据库·oracle·oracle基础·oracle入门·oracle表存储
为什么不问问神奇的海螺呢丶27 分钟前
Oracle Golden Gate 19c 微服务版 (19.1.0.0.4) 静默安装
数据库·微服务·oracle
NineData28 分钟前
使用NineData实现MySQL异地多活场景
运维·数据库·mysql
森叶37 分钟前
逻辑仲裁者:实现多事件关联匹配与事务原子化后执行逻辑的技术方案
数据库·oracle
Navicat中国1 小时前
北京理工大学推荐 Navicat | 高校教育行业应用案例
数据库·navicat·高校·教育版
素玥1 小时前
实训7 json文件数据用python导入数据库
数据库·python·json
Rick19931 小时前
Redis 底层架构图
数据库·redis·缓存
ZC跨境爬虫1 小时前
海南大学交友平台开发实战 day9(头像上传存入 SQLite+BLOB 存储 + 前后端联调避坑全记录)
前端·数据库·python·sqlite