vanna+deepseekV3+streamlit本地化部署

1、vanna介绍

1.1、基本介绍

vanna是一个基于 MIT 许可的开源 Python RAG(检索增强生成)框架,专注于 SQL 生成和相关功能。它利用大型语言模型(LLM)和检索增强生成技术,将自然语言输入转换为 SQL 查询,允许用户通过自然语言与数据库交互,无需精通 SQL 语法即可提取数据中的有价值信息。Vanna 的核心目标是简化数据库交互,降低数据查询的技术门槛,适用于数据分析师、业务专家以及普通用户。

1.2、工作原理

Vanna 的工作流程主要分为以下步骤:

  • 训练 RAG 模型
    基于用户的数据库模式(DDL)、元数据、文档和示例 SQL 查询,训练一个 RAG 模型,用于理解数据库结构和用户意图。
  • 语义检索
    用户提出自然语言问题后,Vanna 通过向量数据库进行语义检索,匹配相关信息。
  • 生成 SQL 查询
    结合检索到的上下文,利用 LLM 生成对应的 SQL 查询。
  • 执行与反馈
    在数据库中执行生成的 SQL 查询,并以表格或图表形式展示结果。同时,Vanna 支持自我学习,用户反馈和成功查询可进一步优化模型。

1.3、优点

  • 开源与可定制
    • 作为 MIT 许可的开源框架,Vanna 允许用户根据需求进行定制和集成,适应不同业务场景。
    • GitHub 星标已超 7200,社区活跃,持续优化潜力大。
  • 数据可视化
    查询结果以易于理解的表格、Pandas DataFrame 直观的可视化图表呈现,帮助用户快速获取洞察。

2、vanna+deepseekV3+mysql+streamlit本地化部署

2.1、创建conda环境,安装依赖

  • 创建conda环境
conda create -n vanna-learn python=3.10
conda activate vanna-learn
  • 安装依赖包
pip3 install 'vanna[chromadb,mysql]'
pip3 install openai
pip3 install streamlit

2.2、Mysql数据准备

  • 创建数据库
CREATE SCHEMA `test_vn` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • 创建表
CREATE TABLE `user` (
  `id` SERIAL COMMENT '用户ID',
  `name` varchar(64) DEFAULT NULL COMMENT '姓名',
  `age` INT(10) NULL DEFAULT NULL COMMENT '年龄',
  `gender` enum('MALE','FEMALE') NULL DEFAULT NULL COMMENT '性别',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  • 插入测试数据
drop procedure if exists insert_emp; 
delimiter ;;
create procedure insert_emp()        
begin
  declare i int;                    
  set i=1;                          
  while(i<=1000)do                 
    insert into user(name,age,gender) values(CONCAT('tacy',i), FLOOR(RAND() * 100) + 1, IF(i % 3 = 0 , 'FEMALE', 'MALE')); 
    set i=i+1;                       
  end while;
end;;
delimiter ;
call insert_emp();

2.3、新建pycharm项目

在这里插入图片描述

2.4、封装deepseek大模型

新建deepseek_chat,py

from vanna.base import VannaBase
from openai import OpenAI

class DeepSeekChat(VannaBase):
    def __init__(self, config=None):
        if config is None:
            raise ValueError(
                "For DeepSeek, config must be provided with an api_key and model"
            )
        if "api_key" not in config:
            raise ValueError("config must contain a DeepSeek api_key")

        if "model" not in config:
            raise ValueError("config must contain a DeepSeek model")

        api_key = config["api_key"]
        model = config["model"]
        self.model = model
        self.client = OpenAI(api_key=api_key, base_url="https://api.deepseek.com/v1")

    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 generate_sql(self, question: str, **kwargs) -> str:
        # 使用父类的 generate_sql
        sql = super().generate_sql(question, **kwargs)

        # 替换 "\_" 为 "_"
        sql = sql.replace("\\_", "_")

        return sql

    def submit_prompt(self, prompt, **kwargs) -> str:
        chat_response = self.client.chat.completions.create(
            model=self.model,
            messages=prompt,
        )

        return chat_response.choices[0].message.content

2.5、定义MyVanna

新建my_vanna,py

from vanna.chromadb import ChromaDB_VectorStore
from deepseek_chat import DeepSeekChat

class MyVanna(ChromaDB_VectorStore, DeepSeekChat):
    def __init__(self, config=None):
        ChromaDB_VectorStore.__init__(self, config=config)
        DeepSeekChat.__init__(self, config=config)

2.6、构建streamlit的app

新建app.py

  1. 实例化MyVanna
import streamlit as st
from my_vanna import MyVanna
import os
# DEEPSEEK_API_KEY在环境变量中设置
vn = MyVanna({'api_key': os.getenv('DEEPSEEK_API_KEY'), 'model': "deepseek-chat"})
  1. 连接数据库MYSQL
vn.connect_to_mysql(host='localhost', port=3306, dbname='test_vn', user='root', password='password')
  1. train
  • ddl表数据: 有多张表,分多个ddl,分次调用train()
DDL_USER="""
CREATE TABLE `user` (
  `id` SERIAL COMMENT '用户ID',
  `name` varchar(64) DEFAULT NULL COMMENT '姓名',
  `age` INT(10) NULL DEFAULT NULL COMMENT '年龄',
  `gender` enum('MALE','FEMALE') NULL DEFAULT NULL COMMENT '性别',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
"""
vn.train(ddl=DDL_USER)
  • documentation
vn.train(documentation='"即将失业的人"是指age>=35岁,也就是大于35岁的人会面临就业危机')
  • 存储sql到向量数据库
# 只传sql,让大模型根据SQL构造一个question
vn.train(sql='select name from user where age between 35 and 60')

# question-sql
vn.train(question='tacy18的年龄', sql='select age from user where name="tacy18"')
  1. 编写stream lit页面
st.header("你好,我是你的图表AI助理")
my_question = st.text_input("请问你要查询什么数据?")
if st.button("发送"):
    if my_question:
    	# 大模型根据自然语言描述的问题生成SQL
        sql = vn.generate_sql(my_question)
        # 执行SQL获取数据
        df = vn.run_sql(sql)
        # 调用大模型生成绘制图表的代码
        code = vn.generate_plotly_code(question=my_question, sql=sql, df=df)
        # 绘制图表
        fig = vn.get_plotly_figure(plotly_code=code, df=df)
        # 显示结果
        st.plotly_chart(fig, use_container_width=True)
  1. 启动应用
streamlit run app.py

2.7、app演示

在这里插入图片描述

<think>好的,我现在需要帮助用户了解如何在本地环境中部署Vanna。首先,我得回忆一下用户提供的引用内容,特别是引用[2]中提到的本地部署vanna对接数据库的步骤。根据用户的问题,他们可能需要详细的步骤指南,包括安装、配置和基本使用。 首先,我应该检查系统级指令,确保所有数学公式都正确使用$...$或$$...$$格式,但这个问题可能不涉及数学表达式,所以可能不需要处理这部分。然后,确保用中文回答,结构清晰,分步骤说明。 接下来,根据引用[2],本地部署vanna需要对目录进行分析,所以可能需要先安装必要的依赖,比如Python环境、vanna库以及数据库驱动。用户可能需要知道如何安装这些组件,比如使用pip安装vanna和相应的数据库适配器,如psycopg2用于PostgreSQL。 然后,配置Vanna可能涉及设置数据库连接,用户需要创建Vanna实例并连接到数据库。这部分需要详细说明如何初始化模型,设置API密钥(如果有的话),以及配置数据库连接参数。 之后,可能需要训练模型,让Vanna理解自然语言到SQL的转换。引用中提到需要训练数据,比如DDL语句、文档或现有查询,所以需要指导用户如何收集和输入这些数据到Vanna中。 最后,用户可能需要验证部署是否成功,例如通过自然语言提问生成SQL并执行查询。这里需要提供一个简单的示例,比如用户输入问题,Vanna生成SQL,然后执行并返回结果。 还需要确保回答中引用相关的引用内容,比如在步骤末尾添加[^2]等。同时,生成相关问题,比如如何优化Vanna的准确性、处理复杂查询或整合到现有系统等。 需要检查是否有遗漏的步骤,比如是否需要额外的配置或依赖,比如设置环境变量或处理权限问题。可能还需要提到如何处理常见的错误,比如连接失败或训练数据不足的情况。 另外,参考用户提供的示例回答结构,比如快速排序的示例,可能需要用类似的格式,分步骤说明,代码块用正确的语法高亮,比如Python代码。同时,确保语言简洁,避免技术术语过多,适合非技术人员理解。 总结步骤应该是:安装依赖、配置Vanna、训练模型、使用示例。每个步骤需要详细但不过于复杂,确保用户能逐步跟随操作。同时,注意引用来源,确保信息准确可靠。</think>### 本地部署 Vanna 的步骤指南 #### 1. **环境准备** - 安装 Python(推荐 3.8+ 版本)和包管理工具 `pip`。 - 创建虚拟环境(可选但建议): ```bash python -m venv vanna-env source vanna-env/bin/activate # Linux/macOS vanna-env\Scripts\activate # Windows ``` - 安装 Vanna 和相关依赖: ```bash pip install vanna psycopg2-binary # 以 PostgreSQL 为例,其他数据库需替换驱动(如 pymysql) ``` #### 2. **初始化 Vanna 实例** - 创建 Python 脚本(如 `vanna_demo.py`),配置 Vanna 并连接数据库: ```python from vanna.local import LocalContext_OpenAI # 初始化模型(使用本地模式或 OpenAI API) vn = LocalContext_OpenAI( config={&#39;api_key&#39;: &#39;YOUR_OPENAI_KEY&#39;} # 若使用本地模式可忽略 API 密钥 ) # 连接数据库(以 PostgreSQL 为例) vn.connect_to_postgres( host=&#39;localhost&#39;, dbname=&#39;your_database&#39;, user=&#39;your_user&#39;, password=&#39;your_password&#39;, port=5432 ) ``` #### 3. **训练模型** - **方式 1:导入数据库 DDL 语句** 提供表结构定义文件(如 `schema.sql`): ```python vn.train(ddl=""" CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(100), department VARCHAR(50) ); """) ``` - **方式 2:加载现有 SQL 查询** 添加历史查询示例以增强模型理解: ```python vn.train(sql="SELECT name, department FROM employees WHERE id = 1001;") ``` - **方式 3:使用文档训练(可选)** 上传业务文档(如 CSV 或 Markdown)补充语义信息: ```python vn.train(documentation="部门表包含员工 ID、姓名和所属部门字段") ``` #### 4. **验证部署** - 通过自然语言生成 SQL 并执行: ```python question = "列出技术部的所有员工姓名" sql = vn.generate_sql(question) # 生成 SQL print("生成的 SQL:", sql) result = vn.run_sql(sql) # 执行查询 print("查询结果:", result) ``` - 输出示例: ``` 生成的 SQL: SELECT name FROM employees WHERE department = &#39;技术部&#39; 查询结果: [(&#39;张三&#39;,), (&#39;李四&#39;,)] ``` #### 5. **扩展配置(可选)** - **自定义提示模板**:调整 `vn.train` 中的提示词优化 SQL 生成逻辑。 - **接入其他数据库**:修改 `connect_to_postgres` 为 MySQL/Snowflake 等方法。 - **日志与调试**:启用 `vn.log=true` 查看生成过程的中间步骤[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值