【大模型系列篇】Vanna-ai基于检索增强(RAG)的sql生成框架

简介

Vanna是基于检索增强(RAG)的sql生成框架

        Vanna 使用一种称为 LLM(大型语言模型)的生成式人工智能。简而言之,这些模型是在大量数据(包括一堆在线可用的 SQL 查询)上进行训练的,并通过预测响应提示中最有可能的下一个单词或“标记”来工作。Vanna 优化了提示(通过向量数据库使用嵌入搜索)并微调 LLM 模型以生成更好的 SQL。Vanna 可以使用和试验许多不同的LLM,以获得最准确的结果。

        Vanna借助了相对简单也更易理解的RAG方法,通过检索增强来构建Prompt,以提高SQL生成的准确率。从本质上讲,Vanna 是一个 Python 包,它使用检索增强来帮助您使用 LLM 为数据库生成准确的 SQL 查询。

        事先用向量数据库将待查询数据库的建表语句、文档、常用SQL及其自然语言查询问题存储起来。在用户发起查询请求时,会先从向量数据库中检索出相关的建表语句、文档、SQL问答对放入到prompt里(DDL和文档作为上下文、SQL问答对作为few-shot样例),LLM根据prompt生成查询SQL并执行,框架会进一步将查询结果使用plotly可视化出来或用LLM生成后续问题。如果用户反馈LLM生成的结果是正确的,可以将这一问答对存储到向量数据库,可以使得以后的生成结果更准确。

优势

  • 易用性:Vanna 允许非技术用户通过自然语言与数据库交互,无需编写复杂的 SQL 查询。

  • 灵活性:它可以处理多种类型的数据库和查询,适用于不同的应用场景。

  • 准确性:Vanna 的能力与你提供的训练数据相关,更多的训练数据意味着在大型和复杂的数据集上有更好的准确性。

  • 安全性:你的数据库内容不会直接发送给 LLM,SQL 执行发生在你的本地环境中。

  • 自我学习:你可以选择在成功执行的查询上“自动训练”,或让界面提示用户对结果提供反馈,使未来的结果更加准确。

劣势

  • 准确性:生成的 SQL 查询可能不完全准确,可能需要人工干预来修正。

  • 性能:对于大型数据库,生成 SQL 查询可能会有些缓慢。

  • 依赖数据库结构:Vanna 需要事先知道数据库的结构信息,包括表名、字段名等。这意味着我们需要先将数据库结构信息导入到 Vanna 中,才能正确地生成 SQL 查询语句。

  • 复杂查询生成能力有限:对于一些非常复杂的查询语句,如果自然语言描述不够明确或存在歧义,可能导致 Vanna 无法正确生成 SQL 语句。

Vanna的关键原理

借助数据库的DDL语句、元数据(数据库内关于自身数据的描述信息)、相关文档说明、参考样例SQL等训练一个RAG的“模型”(embedding+向量库);

并在收到用户自然语言描述的问题时,从RAG模型中通过语义检索出相关的内容,进而组装进入Prompt,然后交给LLM生成SQL。

Vanna 的工作过程分为两个简单步骤 :

  1. 在给定的数据上训练 RAG“模型”-本质上是基于文档(建表语句、相关sql查询、表或者字段的comment)作为资料,进行Embedding后存入向量库。

  2. 然后提出问题,基于这些问题去向量库检索相关信息,这些问题传给大模型返回 SQL 查询,这些查询可以设置为在您的数据库上自动运行。

具体步骤包括:

训练:根据您的数据训练 RAG“模型”,或者说根据数据结构构建向量库。用户可以使用 DDL 语句、文档或样例 SQL 查询对 Vanna 进行训练,让它掌握数据库的结构、业务术语和查询模式。Vanna 会将训练数据转化为向量嵌入,存储在向量数据库中,并建立元数据索引,以便于后续检索。

问问题:问Vanna关于数据的各种问题,如"上个月销量最大的5个商品"

检索:Vanna对问题的处理与其他RAG系统一样,检索对应的DDL 语句、文档或样例 SQL。

生成 SQL: Vanna 利用LLM(例如 GPT-4),结合上下文信息,将自然语言问题转化为精准的 SQL 查询语句。

执行 & 展示:数据库收到 Vanna 生成的 SQL 查询后,就会执行查询。Vanna 会将查询结果整理成易于理解的格式,例如表格或图表,呈现给用户。

训练

Vanna的RAG模型训练,支持以下几种方式:

1. DDL语句

DDL有助于Vanna了解你的数据库表结构信息。

vn.train(ddl="""CREATE TABLE IF NOT EXISTS my-table (id INT PRIMARY KEY,name VARCHAR(100),age INT)
""")

2. 文档内容

可以是你的企业、应用、数据库相关的任何文档内容,只要有助于Vanna正确生成SQL即可,比如对你行业特有名词的解释、特殊指标的计算方式等。

vn.train(documentation="Our business defines XYZ as ABC")

3. SQL或者SQL问答对

即SQL的样例,这显然有助于大模型学习针对您数据库的知识,特别是有助于理解提出问题的上下文,可以大大提高sql生成正确性。

vn.train(question="What is the average age of our customers?",sql="SELECT AVG(age) FROM customers")

4. 训练计划(plan)

这是vanna提供的一种针对大型数据库自动训练的简易方法。借助RDBMS本身的数据库内元数据信息来训练RAG model,从而了解到库内的表结构、列名、关系、备注等有用信息。

df_information_schema=vn.run_sql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS")
plan=vn.get_training_plan_generic(df_information_schema)
vn.train(plan=plan)

提问

vn.ask("What are the top 10 customers by sales?")

你会得到 SQL

SELECT c.c_name as customer_name, sum(l.l_extendedprice * (1 - l.l_discount)) as total_sales 
FROM snowflake_sample_data.tpch_sf1.lineitem l join snowflake_sample_data.tpch_sf1.orders o ON l.l_orderkey = o.o_orderkey join snowflake_sample_data.tpch_sf1.customer c ON o.o_custkey = c.c_custkey 
GROUP BY customer_name 
ORDER BY total_sales desc limit 10;

如果已连接到数据库,将获得类似以下内容的查询结果:

也可以通过Plotly chart进行绘图:

Vanna三个主要基础设施

  • Database,即需要进行查询的关系型数据库

  • VectorDB,即需要存放RAG“模型”的向量库

  • LLM,即需要使用的大语言模型,用来执行Text2SQL任务

配置LLM和向量数据库

默认情况下,Vanna支持使用其在线LLM服务(对接OpenAI)与向量库,可以无需对这两个进行任何设置,即可使用。因此使用Vanna最简单的原型只需要五行代码:

import vanna from vanna.remote 
import VannaDefault 
vn = VannaDefault(model='model_name', api_key='api_key') 
vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite') 
vn.ask("What are the top 10 albums by sales?")

这里的OpenAI_Chat和ChromaDB_VectorStore是Vanna已经内置支持的LLM和VectorDB。

如果你需要支持非内置支持的LLM和vectorDB,则需要首先扩展出自己的LLM类与VectorDB类,

实现必要的方法(具体可参考官方文档),然后再扩展出自己的Vanna对象。

参考文献

[1] How accurate can AI generate SQL? (vanna.ai)

[2] https://github.com/vanna-ai/vanna

[3] https://vanna.ai/docs

[3] Vanna-ai: 本地部署OpenAI兼容大模型及向量数据库

[4] Vanna-ai :基于RAG的TextToSql实现方案

[5] Vanna 用 RAG的方法做Text2SQL系统

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

JVM: 堆上的数据存储

文章目录 一、对象在堆中的内存布局1、对象在堆中的内存布局 - 标记字段2、JOL打印内存布局 二、元数据指针 一、对象在堆中的内存布局 对象在堆中的内存布局,指的是对象在堆中存放时的各个组成部分,主要分为以下几个部分: 1、对象在堆中的…

真没想到BitLocker加密的系统碰上CrowdStrike蓝屏故障也能恢复如初!

网管小贾 / sysadm.cc 三声金钟响,六阵御鼓催。 百官列两扉,天子临朝威。 是日早朝,八宝金殿之中,天子端坐龙椅上。 群臣山呼:“万岁,万岁,万万岁……!” 天子面沉似水、不怒自威…

【数学建模】【优化算法】:【MATLAB】从【一维搜索】到】非线性方程】求解的综合解析

目录 第一章:一维搜索问题 黄金分割法 股票交易策略优化 总结: 第二章:线性规划 线性规划(Simplex 算法) 生产计划优化 总结: 第三章:无约束非线性优化问题 梯度下降法 神经网络训练…

elementUI 的el-date-picker日期,开始时间不能大于结束时间

需求描述:form表单里有开始日期和结束日期,要求开始日期不能大于结束日期,但是开始日期可以等于结束日期。 效果如下: 实现代码: <el-form ref="form" :model="form" :rules="rules" label-width="140px"><el-form-it…

Docker镜像拉取失败解决方案

文章目录 问题及分析解决方案1.先排查DNS2.修改源3.重启docker服务 问题解决 问题及分析 今天我用docker拉取镜像的时候报错 error pulling image configuration: download failed after attempts6: dial tcp xxx.xx.xxx.xx:xxx: i/o timeout 连接超时大概率以下两个问题 1.DN…

队列...

队列的定义 队列是一种操作受限的线性表,只允许表的一端在进行插入,而在表的另一端进行删除,其操作特征为先进先出. 队头:允许删除的一端 队尾:允许插入的一端 队列的基本操作 InitQueue(&Q) 初始化 isEmpty(Q) 判断空 EnQueue(&Q,x)入队 DeQueue(&Q,&…

基于北京市空气质量影响因素研究系统【城市可换爬虫获取、LSTM、Flask、Echarts、MySQL、TensorFlow】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主研究背景国内外研究现状研究目的研究意义关键技术理论介绍数据采集数据分析与大屏设计大屏相关性分析LSTM模型训练系统集成展示总结每文一语 有需要本项目的代码或文档以及全部资源&#xf…

【限免】频控阵雷达:概念、原理与应用【附MATLAB代码】

​微信公众号&#xff1a;EW Frontier QQ交流群&#xff1a;949444104 主要内容 PDA、FDA MATLAB代码 %---------------------------------------- %功能:FDA和相控阵天线方向图 %版本:ver1.0 %时间:2017.11.1 %--------------------------------------- clear all; clc; disp…

Python面试宝典第23题:分发糖果

题目 n 个孩子站成一排&#xff0c;给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求&#xff0c;给这些孩子分发糖果。 &#xff08;1&#xff09;每个孩子至少分配到 1 个糖果。 &#xff08;2&#xff09;相邻两个孩子评分更高的孩子会获得更多的糖果。 请…

【linux上快速安装python】

linux上安装python 1.下载必须的编译工具【前置条件】2. 下载python源码3.解压3.1 配置环境变量3.2 SSL证书生成4.配置安装5.配置软连接6. 给pip配置软连接7.使用pip安装gbase8sdeploy8. pip安装pyinstaller9.遇到问题 1.下载必须的编译工具【前置条件】 sudo yum install gcc…

苦学Opencv的第十四天:人脸检测和人脸识别

Python OpenCV入门到精通学习日记&#xff1a;人脸检测和人脸识别 前言 经过了十三天的不懈努力&#xff0c;我们终于也是来到了人脸检测和人脸识别啦&#xff01;相信大家也很激动吧。接下来我们开始吧&#xff01; 人脸识别是基于人的脸部特征信息进行身份识别的一种生物识…

一些数据结构面试题

常见时间复杂度代码 时间复杂度&#xff1a;执行时间和数据规模之间的增长关系 O(logn) while (i <n) {i i * 2; } O(n * logn)

丹摩智算:如何在云端开发一个AI应用——基于UNet的眼底血管分割案例

目录 0 写在前面1 云实例&#xff1a;配置选型与启动1.1 登录注册1.2 配置SSH密钥对1.3 创建实例1.4 登录云实例 2 云存储&#xff1a;数据集上传与下载3 云开发&#xff1a;眼底血管分割案例3.1 案例背景3.2 网络搭建3.3 网络训练3.4 模型测试 总结粉丝福利 0 写在前面 DAMOD…

PHP回收废品平台系统小程序源码

&#x1f30d;绿色行动&#xff0c;从“回收废品平台系统”开始&#xff01;&#x1f69a; &#x1f6aa;【家门口的环保站&#xff0c;废品不再无处安放】 你是否曾为家里的旧报纸、空瓶子、废旧电器等废品头疼不已&#xff0c;不知该如何处理&#xff1f;现在&#xff0c;“…

Vue3 加载条(LoadingBar)

效果如下图&#xff1a;在线预览 APIs LoadingBar 参数说明类型默认值必传containerClass加载条容器的类名stringundefinedfalsecontainerStyle加载条容器的样式CSSProperties{}falseloadingBarSize加载条大小&#xff0c;单位 pxnumber2falsecolorLoading加载中颜色string‘…

二进制部署k8s集群之cni网络插件flannel和calico工作原理

3、部署 CNI 网络组件 在 master01 节点上操作 上传flannel-v0.21.5.zip并解压 unzip flannel-v0.21.5.zipscp flannel*.tar 192.168.80.20:/opt/k8s/ scp flannel*.tar 192.168.80.30:/opt/k8s/ node两个节点操作 cd /opt/k8s/ docker load -i flannel.tar docker load -i …

外设购物平台

目 录 一、系统分析 二、系统设计 2.1 系统功能设计 2.2 数据库设计 三、系统实现 3.1 注册功能 3.2 登录功能 3.3 分页查询所有商品信息功能 3.4 分页条件&#xff08;精确、模糊&#xff09;查询商品信息功能 3.5 购物车功能 3.6 订单管理功能 四、项…

单细胞|MEBOCOST·细胞间代谢通讯

概述 在代谢活跃的细胞中&#xff0c;表达的代谢酶催化代谢反应生成许多代谢物。这些代谢物中的一些可以扩散到细胞外空间并作为信号分子发挥作用。某些细胞外代谢物可以与空间上邻近细胞的感应蛋白结合。我们将分泌代谢物的细胞称为发送细胞&#xff0c;而表达感应蛋白的细胞称…

借助 NGINX 对本地的 Kubernetes 服务进行自动化的 TCP 负载均衡

原文作者&#xff1a;Chris Akker - F5 技术解决方案架构师&#xff0c;Steve Wagner - F5 NGINX 解决方案架构师 原文链接&#xff1a;借助 NGINX 对本地的 Kubernetes 服务进行自动化的 TCP 负载均衡 转载来源&#xff1a;NGINX 中文官网 NGINX 唯一中文官方社区 &#xff0c…

苹果AI跳票,国产手机厂商们的机会终于来了

“Hi,I’m a Mac” “And I’m a PC” 如果你看过苹果在2006年发布的经典广告《Get a Mac》系列&#xff0c;也许会对这句广告语以及背后的PC和Mac之争印象深刻。 从最开始的《1984》&#xff0c;到之后的《Think Different》&#xff0c;乔布斯在他主导的66部商业广告中向大…