深度学习系列75:sql大模型工具vanna

1. 概述

vanna是一个可以将自然语言转为sql的工具。简单的demo如下:

复制代码
!pip install vanna
import vanna
from vanna.remote import VannaDefault
vn = VannaDefault(model='chinook', api_key=vanna.get_api_key('my-email@example.com'))
vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite')
vn.ask("What are the top 10 albums by sales?")

执行下面的代码运行图形界面

复制代码
from vanna.flask import VannaFlaskApp
VannaFlaskApp(vn).run()

2. 配置

数据库可以是任何数据库,比如mysql如下:

复制代码
import pandas as pd
import psycopg2

def run_sql(sql):
    conn = psycopg2.connect(
        host="localhost",
        database="my_database",
        user="my_user",
        password="my_password"
    )
    return pd.read_sql(sql, conn)

vn.run_sql = run_sql
vn.run_sql_is_set = True

向量数据库稍微麻烦一些,目前支持的包括:

参考代码如下:

复制代码
from vanna.chromadb.chromadb_vector import ChromaDB_VectorStore
class MyVanna(ChromaDB_VectorStore):
    def __init__(self, config=None):
        ChromaDB_VectorStore.__init__(self, config=config)

vn = MyVanna(config={'path': '/path/to/chromadb'})

3. 训练

训练数据可以是:DDL、documentation、sql以及Question-SQL Pairs

复制代码
vn.train(ddl="CREATE TABLE my_table (id INT, name TEXT)")
vn.train(documentation="Our business defines XYZ as ABC")
vn.train(sql="SELECT col1, col2, col3 FROM my_table")

可以设置auto_train = True

4. 询问

复制代码
vn.ask("What are the top 10 customers by sales?")

它包含下列几个函数:

复制代码
vn.generate_sql
vn.run_sql
vn.generate_plotly_code
vn.get_plotly_figure

visualize=False

5. 启用服务

参考https://github.com/vanna-ai/vanna-flask,将LLM、embedding、vectorStore都改造成自己的代码。

首先是LLM,改造框架为:

复制代码
from vanna.base import VannaBase
class MyLLM(VannaBase):
    def __init__(self,config=None):
        VannaBase.__init__(self, config=config)
        ...
   def system_message(self, message: str) -> any:
        return {"role": "system", "content": message}

    def user_message(self, message: str) -> any:
        return {"role": "user", "content": message}

    def assistant_message(self, message: str) -> any:
        return {"role": "assistant", "content": message}

    def submit_prompt(self, prompt, **kwargs) -> str:
    	...

然后是embedding,需要定义encode_documents和encode_queries两个函数,例如:

复制代码
class BgeM3:
    def __init__(self, url):
        self.url = url
    def encode_documents(self, docs):
        ....
    def encode_queries(self, queries):
        ....

接下来是vectorStore,我们使用milvus,它会自动调用config中的embedding_function,我们把它定义成上面的BegM3即可:

复制代码
class MyVanna(Milvus_VectorStore, QwenLLM):
    def __init__(self, config=None):
        Milvus_VectorStore.__init__(self, config=config)
        QwenLLM.__init__(self, config=config)

vn = MyVanna(config={'milvus_client': MilvusClient(...),'embedding_function':BgeM3(...)})

然后定义连接的数据库,可以换成任意的其他数据库:

复制代码
def run_sql(sql: str) -> pd.DataFrame:
    cnx = mysql.connector.connect(...)
    cursor = cnx.cursor()
    cursor.execute(sql)
    result = cursor.fetchall()
    columns = cursor.column_names
    df = pd.DataFrame(result, columns=columns)
    return df
    
vn.run_sql = run_sql
vn.run_sql_is_set = True 

接着执行python app.py即可启用服务,访问localhost:5000可以打开页面:

同时也可以调用接口:

复制代码
import requests
response = requests.get(url+'/api/v0/get_training_data',headers={'Content-Type':'application/json'})
response.json()

所有可用的接口清单可以参考app.py

相关推荐
武子康26 分钟前
调查研究-151 Slack vs Jira:区别、使用指南与团队选择方法
人工智能·科技·深度学习·ai·职场和发展·jira·slack
z小猫不吃鱼3 小时前
05 Transformer Encoder 详解:BERT 为什么使用 Encoder?
深度学习·bert·transformer
钓了猫的鱼儿5 小时前
基于深度学习+AI的卷心菜目标检测与预警系统(Python源码+数据集+UI可视化界面+YOLOv11训练结果)
人工智能·深度学习·目标检测
汽车仪器仪表相关领域5 小时前
南华 NHA-604/605 汽车排放气体测试仪:国六b全适配高精度便携检测设备
大数据·人工智能·功能测试·深度学习·安全·fpga开发·压力测试
CV实验室6 小时前
Remote Sensing 29个SITS基准数据集综述:多模态遥感分类的新起点
人工智能·深度学习·计算机视觉·音视频
手写码匠8 小时前
华为云Flexus+DeepSeek征文|基于华为云Flexus X实例 + Dify + DeepSeek 构建企业级智能知识库问答系统实战
人工智能·深度学习·算法·aigc
lqqjuly8 小时前
语音识别:隐马尔可夫模型、深度学习与序列转导
人工智能·深度学习·语音识别
动物园猫8 小时前
铁路障碍物目标检测数据集分享(适用于YOLO系列深度学习分类检测任务)
深度学习·yolo·目标检测
万粉变现经纪人9 小时前
2026最新CSDN博客质量分v6.0深度解读:从评分机制到80+实战提分指南
数据库·人工智能·深度学习·csdn·csdn博客·csdn博客质量分6.0·博客质量分