vanna+deepseekV3+streamlit本地化部署

文章目录

  • 1、vanna介绍
    • 1.1、基本介绍
    • 1.2、工作原理
    • 1.3、优点
  • 2、vanna+deepseekV3+mysql+streamlit本地化部署
    • 2.1、创建conda环境,安装依赖
    • 2.2、Mysql数据准备
    • 2.3、新建pycharm项目
    • 2.4、封装deepseek大模型
    • 2.5、定义MyVanna
    • 2.6、构建streamlit的app
    • 2.7、app演示

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()        
begindeclare 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 OpenAIclass 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 = modelself.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_sqlsql = super().generate_sql(question, **kwargs)# 替换 "\_" 为 "_"sql = sql.replace("\\_", "_")return sqldef 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 DeepSeekChatclass 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:# 大模型根据自然语言描述的问题生成SQLsql = 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演示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32216.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LangChain接入阿里云百炼deepseek】

这是目录 前言阿里云百炼注册账号使用代码执行结果 前言 大模型爆火&#xff0c;现在很多教程在教怎么使用大模型来训练Agent智能体&#xff0c;但是大部分教程都是使用的OpenAI。 最近阿里云推出DeepSeek-R1满血版&#xff0c;新用户可享100万免费Token额度。 今天就教大家怎…

【优选算法】二分法(总结套路模板)

目录 1. 题目一 &#xff1a;二分查找 解题思路&#xff1a; 模板总结&#xff08;简单版&#xff0c;不适用所有情况&#xff09; 代码实现&#xff1a; 2. 题目二 解题思路&#xff1a; 模板总结&#xff08;几乎万能&#xff09; 代码实现&#xff1a; 3. 题目…

Qt开源控件库(qt-material-widgets)的编译及使用

项目简介 qt-material-widgets是一个基于 Qt 小部件的 Material Design 规范实现。 项目地址 项目地址&#xff1a;qt-material-widgets 本地构建环境 Win11 家庭中文版 VS2019 Qt5.15.2 (MSVC2019) 本地构建流程 克隆后的目录结构如图&#xff1a; 直接使用Qt Crea…

游戏引擎学习第147天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾 具体来说&#xff0c;我们通过隐式计算来解决问题&#xff0c;而不是像数字微分分析器那样逐步增加数据。我们已经涵盖了这个部分&#xff0c;并计划继续处理音量问题。不过&#xff0c;实际上我们现在不需要继续处理…

uni-app打包成H5使用相对路径

网上找了一圈&#xff0c;没用&#xff0c;各种试&#xff0c;终于给试出来了&#xff0c;主要是网络上的没有第二步&#xff0c;只有第一步&#xff0c;导致打包之后请求的路径没有带上域名 运行的基础路径设置为./ config.js文件里面的baseUrl路径改成空字符&#xff0c;千万…

知识社区:打破传统知识传播的壁垒

知识社区的诞生 当今&#xff0c;知识库的上传与下载已无法满足现代用户对知识获取的多样化需求。随着信息量的爆炸式增长和用户需求的日益复杂化&#xff0c;传统的、静态的知识库显得力不从心。用户渴望能够实时互动、即时反馈、多维度探索知识的平台。正是在这样的背景下&am…

洛谷 P5534 【XR-3】等差数列 python

这题不用向下取整//就会错&#xff0c;不太能理解为什么...感觉对结果好像没什么影响啊 a1, a2, n map(int,input().split()) d a2 - a1 an a1 d * (n-1) s (a1an)*n//2 print(s)

机器人路径规划、轨迹优化系列课程

机器人路径规划、轨迹优化课程-第一讲-轨迹规划导论_哔哩哔哩_bilibili 机器人路径规划、轨迹优化课程-第二讲-Dijkstra算法原理讲解_哔哩哔哩_bilibili 机器人路径规划、轨迹优化课程-第四讲-A*算法原理和代码讲解_哔哩哔哩_bilibili 机器人路径规划、轨迹优化课程-第五讲-…

qemu-kvm源码解析-内存虚拟化

内存虚拟化介绍 宿主机上的程序地址转换时为 HVA&#xff08;宿主机虚拟地址&#xff09;--MMU-->HPA(宿主机物理地址) 而宿主机上的虚拟机面临两层转化需求: GVP(虚拟机虚拟地址)--MMU-->GPA(虚拟机物理地址) GPA(虚拟机物理地址)--VMM-->HPA(宿主机物理地址) 虚…

WireShark自动抓包

背景 异常流量检测是当前保护网络空间安全的重要检测方法。 对流量的研究&#xff0c;首先需要在系统中进行抓包&#xff0c;并对包进行分析。 这里对WireShark自动抓包进行简要介绍。 操作步骤 1、选择“捕获”>“选项”。 2、在Input下&#xff0c;选择要抓包的网络接…

【CSS3】练气篇

目录 CSS 基本概念CSS 的定义CSS 的作用CSS 语法 CSS 引入方式内部样式表外部样式表行内样式表 选择器基础选择器标签选择器类选择器id 选择器通配符选择器 画盒子文字控制属性字体大小字体粗细字体倾斜行高字体族font 复合属性文本缩进文本对齐文本修饰线文字颜色 CSS 基本概念…

Trae AI IDEA安装与使用

文章目录 背景第一步、下载安装第二步、登录与使用优势异常处理 背景 最近比较热的 Trae 开发工具&#xff0c;在本地下载使用&#xff0c;记录下来。 第一步、下载安装 下载地址&#xff1a;【Trae中文版下载地址】&#xff0c;下载的安装文件名为&#xff1a;【Trae CN-Se…

【Godot4.4】写入和读取ZIP文件

概述 Godot提供了ZIPPacker类型来读写ZIP压缩包文件。本文是简单的写入和读取文件操作测试笔记。 写入纯文本文件 extends Buttonfunc _ready():write_zip_file("1.zip",func(zip_packer):write_txt_file_to_zippack(zip_packer,"1.txt","hhhhh&qu…

SpringBoot基础Kafka示例

这里将生产者和消费者放在一个应用中 使用的Boot3.4.3 引入Kafka依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId> </dependency>yml配置 spring:application:name: kafka-1#kafka…

µCOS-III从入门到精通 第十三章(事件标志组)

参考教程&#xff1a;【正点原子】手把手教你学UCOS-III实时操作系统_哔哩哔哩_bilibili 一、事件标志组简介 1、概述 &#xff08;1&#xff09;事件标志位是一个“位”&#xff0c;用来表示事件是否发生。 &#xff08;2&#xff09;事件标志组是一组事件标志位的集合&am…

LiveGBS流媒体平台GB/T28181常见问题-视频流安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口流地址校验

LiveGBS流媒体平台GB/T28181常见问题频流安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口流地址校验&#xff1f; 1、安全控制1.1、HTTP接口鉴权1.2、流地址鉴权 2、401 Unauthorized2.1、携带token调用接口2.1.1、获取鉴权token2.1.2、调用其它接口2.1.…

短视频下载去水印,用什么工具好?

去除视频和图片水印是许多用户的需求&#xff0c;尤其是在分享或保存内容时。以下是6款超好用的工具&#xff0c;帮助你轻松去除水印&#xff0c;享受纯净的视觉体验&#xff1a; 1. 易下载去水印小程序 特点&#xff1a; 操作简单&#xff0c;支持抖音、快手、小红书、哔哩哔哩…

Java Collection(3)——BinaryTree(二叉树)

前言 1.掌握树的基本概念 2.掌握二叉树概念及特性 3.掌握二叉树的基本操作 后面的优先级队列(大根堆&#xff0c;小根堆)也是基于二叉树实现的&#xff0c;所以理解好二叉树至关重要 1.树形结构 1.1描述 树是一种非线性的数据结构&#xff0c;它是由不为零个有限结点组成一…

[Echarts]图例换行时icon对齐标题

当前效果 目标效果 让图例中的“点”和标题同一行 代码 const data [{value: 100,name: 未标注},{value: 100,name: 已标注},{value: 100,name: 标注中} ];option {tooltip: {backgroundColor: #fff,extraCssText: box-shadow: 0px 0px 10px 0px rgba(0,0,0,0.15);,backgro…

Scala编程_实现Rational的基本操作

在Scala中实现一个简单的有理数&#xff08;Rational&#xff09;类&#xff0c;并对其进行加法、比较等基本操作. 有理数的定义 有理数是可以表示为两个整数的比值的数&#xff0c;通常形式为 n / d&#xff0c;其中 n 是分子&#xff0c;d 是分母。为了确保我们的有理数始终…