TEXT2SQL工具vanna本地化安装和应用
- Vanna和Text2SQL
- 环境安装和数据准备
-
- conda虚拟环境安装
- 数据准备
- ollama环境准备
-
- ollama安装和运行
- ollama下载模型
- 测试下API方式正常使用
- chromaDB的默认的embedding模型准备
- 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/wengad/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代码,搞定这事,就更好了,解放思路了,有搞头!