深入探索 Vanna:让数据库交互更智能

在数字化时代,与数据库进行高效交互是许多开发者、数据分析师和企业面临的挑战。传统的 SQL 查询编写不仅需要对数据库结构有深入的了解,还需要花费大量的时间和精力来调试和优化。Vanna,一个基于 Python 的开源工具,通过结合检索增强(Retrieval Augmentation)和大型语言模型(LLM),为这一问题提供了一个创新的解决方案。本文将深入探讨 Vanna 的工作原理、安装、配置、使用方法以及如何将其集成到 Flask 应用中,帮助你更高效地生成 SQL 查询并执行。

一、Vanna 工作原理

(一)核心概念

Vanna 的核心在于利用检索增强(Retrieval Augmentation)和大型语言模型(LLM)来生成准确的 SQL 查询。它的工作流程分为两个主要步骤:训练和提问。

  1. 训练阶段:在这个阶段,Vanna 会根据你提供的数据(如数据库的 DDL 语句、文档或 SQL 查询)构建一个参考语料库。这个语料库为后续的查询生成提供了上下文信息。Vanna 使用检索增强技术,通过检索语料库中的相关信息,帮助语言模型更好地理解问题的上下文,从而生成更准确的 SQL 查询。
  2. 提问阶段:在这个阶段,你可以用自然语言提出问题,Vanna 会利用参考语料库生成相应的 SQL 查询语句,这些查询可以直接在你的数据库上执行。

(二)工作流程

Vanna 的工作流程可以通过以下图示来更直观地理解:

Vanna 工作流程

  1. 数据输入:首先,你需要向 Vanna 提供数据库的结构信息(如 DDL 语句)、业务逻辑文档或示例 SQL 查询。这些数据将被存储在参考语料库中。
  2. 语料库构建:Vanna 会解析这些输入数据,构建一个结构化的语料库。这个语料库包含了数据库的表结构、字段信息、业务逻辑等关键信息。
  3. 自然语言问题:当你用自然语言提出问题时,Vanna 会通过检索增强技术从语料库中检索相关信息,帮助语言模型理解问题的上下文。
  4. SQL 查询生成:基于检索到的信息,Vanna 的语言模型会生成相应的 SQL 查询语句。
  5. 查询执行:生成的 SQL 查询可以直接在你的数据库上执行,返回结果。

二、安装 Vanna

(一)环境准备

在安装 Vanna 之前,确保你的开发环境已经安装了以下工具:

  • Python(推荐版本 3.8 及以上)
  • pip(Python 包管理器)

(二)安装步骤

打开终端或命令行工具,运行以下命令安装 Vanna:

pip install vanna

确保网络连接正常,以便能够从 PyPI 仓库下载并安装 Vanna 包。安装完成后,可以通过以下命令验证安装是否成功:

python -c "import vanna; print(vanna.__version__)"

如果安装成功,你将看到 Vanna 的版本号。

三、初始化 Vanna

(一)选择向量数据库和语言模型

Vanna 支持多种向量数据库和语言模型。在本文中,我们将使用 ChromaDB 作为向量数据库,使用 OpenAI 的语言模型。以下是初始化代码的详细说明:

from vanna.openai.openai_chat import OpenAI_Chat
from vanna.chromadb.chromadb_vector import ChromaDB_VectorStoreclass MyVanna(ChromaDB_VectorStore, OpenAI_Chat):def __init__(self, config=None):ChromaDB_VectorStore.__init__(self, config=config)OpenAI_Chat.__init__(self, config=config)vn = MyVanna(config={'api_key': 'your_api_key', 'model': 'gpt-3.5-turbo'})
  1. 导入模块:首先,导入 OpenAI_ChatChromaDB_VectorStore 模块。OpenAI_Chat 用于与 OpenAI 的语言模型进行交互,ChromaDB_VectorStore 用于管理向量数据库。
  2. 定义自定义类:定义一个名为 MyVanna 的类,继承自 ChromaDB_VectorStoreOpenAI_Chat。这样,MyVanna 类就具备了向量数据库和语言模型的功能。
  3. 初始化方法:在 MyVanna 类的 __init__ 方法中,分别调用父类的初始化方法,并传递配置参数。
  4. 配置参数:在初始化 MyVanna 对象时,提供一个配置字典,其中包含 OpenAI API 的密钥和所使用的模型名称。api_key 是你的 OpenAI API 密钥,model 是你选择的语言模型(如 gpt-3.5-turbo)。

(二)配置参数说明

  • api_key:这是你的 OpenAI API 密钥,用于访问 OpenAI 的语言模型。你可以在 OpenAI 的官方网站上创建一个账户并获取你的 API 密钥。
  • model:这是你选择的语言模型。Vanna 支持多种 OpenAI 模型,如 gpt-3.5-turbogpt-4 等。不同的模型在性能和成本上有所不同,你可以根据需求选择合适的模型。

四、连接数据库

(一)支持的数据库类型

Vanna 支持多种类型的数据库,包括 SQLite 和 MySQL。以下是连接到 SQLite 和 MySQL 数据库的详细步骤:

(二)连接到 SQLite 数据库

SQLite 是一种轻量级的数据库,适合小型项目和开发环境。以下是连接到 SQLite 数据库的代码示例:

vn.connect_to_sqlite('path_to_your_sqlite_db')

'path_to_your_sqlite_db' 替换为你的 SQLite 数据库文件的实际路径。例如,如果你的数据库文件名为 example.db,并且位于当前目录下,代码应如下所示:

vn.connect_to_sqlite('example.db')

(三)连接到 MySQL 数据库

MySQL 是一种广泛使用的数据库管理系统,适合大型项目和生产环境。以下是连接到 MySQL 数据库的代码示例:

vn.connect_to_mysql(host='localhost', dbname='your_db_name', user='your_username', password='your_password', port=3306)

在连接 MySQL 数据库时,需要提供以下参数:

  • host:数据库服务器的主机地址。如果是本地数据库,通常为 'localhost'
  • dbname:数据库的名称。
  • user:数据库的用户名。
  • password:数据库的密码。
  • port:数据库服务器的端口号。MySQL 的默认端口号为 3306

例如,如果你的数据库服务器运行在本地,数据库名称为 mydatabase,用户名为 root,密码为 password,代码应如下所示:

vn.connect_to_mysql(host='localhost', dbname='mydatabase', user='root', password='password', port=3306)

五、训练 Vanna

(一)训练的重要性

训练是 Vanna 工作流程中的关键步骤。通过训练,Vanna 可以学习到数据库的结构和业务逻辑,从而生成更准确的 SQL 查询。Vanna 提供了多种训练方式,包括使用 DDL 语句、文档和 SQL 查询进行训练。

(二)使用 DDL 语句进行训练

DDL(Data Definition Language)语句用于定义数据库的结构。通过使用 DDL 语句训练 Vanna,你可以让 Vanna 了解数据库表的结构,包括字段名称、数据类型和约束等信息。以下是使用 DDL 语句训练 Vanna 的代码示例:

vn.train(ddl="""
CREATE TABLE `goods` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(150) NOT NULL,`cate_name` varchar(40) NOT NULL,`brand_name` varchar(40) NOT NULL,`price` decimal(10,3) NOT NULL DEFAULT '0.000',`is_show` bit(1) NOT NULL DEFAULT b'1',`is_saleoff` bit(1) NOT NULL DEFAULT b'0',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;
""")

在这个示例中,我们定义了一个名为 goods 的表,包含了商品的 ID、名称、分类名称、品牌名称、价格、是否显示和是否促销等字段。

(三)使用文档进行训练

除了 DDL 语句,你还可以通过文档向 Vanna 介绍数据库中的业务逻辑。文档可以包含表的字段描述、字段值的范围、业务规则等信息。以下是使用文档训练 Vanna 的代码示例:

vn.train(documentation="""
goods表中的字段cate_name为电脑类型,包括:笔记本、游戏本、超极本、平板电脑、台式机、服务器/工作站、笔记本配件。
goods表中的字段brand_name为品牌名字,包括:华硕、联想、索尼、戴尔、苹果等。
goods表中的字段name为电子产品具体型号,例如:ipad air 9.7英寸平板电脑。
""")

在这个示例中,我们通过文档向 Vanna 介绍了 goods 表中字段的业务逻辑,包括 cate_namebrand_namename 字段的具体含义和可能的值。

(四)使用 SQL 查询进行训练

你还可以直接使用 SQL 查询语句对 Vanna 进行训练。通过这种方式,Vanna 可以学习到特定的查询模式和业务逻辑。以下是使用 SQL 查询进行训练的代码示例:

vn.train(sql="SELECT AVG(price) AS avg_price FROM goods WHERE brand_name = '华硕' AND cate_name = '笔记本';")

在这个示例中,我们通过一个 SQL 查询语句,让 Vanna 学习如何计算华硕品牌笔记本的平均价格。

(五)训练方法总结

  • vn.train(ddl=...):使用 DDL 语句训练 Vanna,让其了解数据库表的结构。
  • vn.train(documentation=...):使用文档训练 Vanna,向其介绍数据库中的业务逻辑。
  • vn.train(sql=...):使用 SQL 查询语句训练 Vanna,让其学习特定的查询模式和业务逻辑。

通过多种训练方法,你可以让 Vanna 全面了解你的数据库结构和业务逻辑,从而生成更准确的 SQL 查询。

六、使用 Vanna 提问

(一)提问流程

训练完成后,你就可以使用自然语言向 Vanna 提问了。Vanna 会根据之前训练过程中学到的信息,生成相应的 SQL 查询语句,并返回结果。以下是提问的代码示例:

vn.ask("华硕品牌的笔记本的平均价格是多少?")

在这个示例中,我们用自然语言提出了一个问题,Vanna 会生成相应的 SQL 查询语句,并返回结果。

(二)提问示例

以下是一些常见的提问示例及其生成的 SQL 查询语句:

  1. 查询平均价格

    • 问题:华硕品牌的笔记本的平均价格是多少?
    • 生成的 SQL 查询
      SELECT AVG(price) AS avg_price FROM goods WHERE brand_name = '华硕' AND cate_name = '笔记本';
      
  2. 查询特定品牌的产品数量

    • 问题:联想品牌的笔记本有多少种?
    • 生成的 SQL 查询
      SELECT COUNT(*) AS num_products FROM goods WHERE brand_name = '联想' AND cate_name = '笔记本';
      
  3. 查询特定价格范围内的产品

    • 问题:价格在 5000 到 10000 元之间的笔记本有哪些?
    • 生成的 SQL 查询
      SELECT * FROM goods WHERE cate_name = '笔记本' AND price BETWEEN 5000 AND 10000;
      
  4. 查询特定品牌和分类的产品

    • 问题:苹果品牌的平板电脑有哪些?
    • 生成的 SQL 查询
      SELECT * FROM goods WHERE brand_name = '苹果' AND cate_name = '平板电脑';
      

(三)提问技巧

  • 明确问题:尽量使用简洁明了的语言表达问题,避免模糊或歧义。
  • 提供上下文:如果问题涉及特定的业务逻辑或数据范围,可以在问题中明确说明。
  • 逐步提问:对于复杂的问题,可以先提出简单的问题,逐步细化和扩展。

七、将 Vanna 集成到 Flask 应用中

(一)Flask 应用的优势

Flask 是一个轻量级的 Python Web 框架,适合快速开发和部署 Web 应用。将 Vanna 集成到 Flask 应用中,可以方便地在 Web 环境中使用 Vanna,提供一个用户友好的界面,让非技术用户也能轻松地与数据库进行交互。

(二)集成步骤

以下是将 Vanna 集成到 Flask 应用中的详细步骤:

  1. 安装 Flask
    如果你还没有安装 Flask,可以通过以下命令安装:

    pip install flask
    
  2. 创建 Flask 应用
    创建一个 Flask 应用,并将 Vanna 集成到其中。以下是完整的代码示例:

    from flask import Flask, request, render_template_string
    from vanna.flask import VannaFlaskAppapp = Flask(__name__)# 初始化 Vanna
    vn = MyVanna(config={'api_key': 'your_api_key', 'model': 'gpt-3.5-turbo'})# 连接到数据库
    vn.connect_to_mysql(host='localhost', dbname='mydatabase', user='root', password='password', port=3306)# 训练 Vanna
    vn.train(ddl="""
    CREATE TABLE `goods` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(150) NOT NULL,`cate_name` varchar(40) NOT NULL,`brand_name` varchar(40) NOT NULL,`price` decimal(10,3) NOT NULL DEFAULT '0.000',`is_show` bit(1) NOT NULL DEFAULT b'1',`is_saleoff` bit(1) NOT NULL DEFAULT b'0',PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;
    """)
    vn.train(documentation="""
    goods表中的字段cate_name为电脑类型,包括:笔记本、游戏本、超极本、平板电脑、台式机、服务器/工作站、笔记本配件。
    goods表中的字段brand_name为品牌名字,包括:华硕、联想、索尼、戴尔、苹果等。
    goods表中的字段name为电子产品具体型号,例如:ipad air 9.7英寸平板电脑。
    """)# 创建 VannaFlaskApp 实例
    vanna_app = VannaFlaskApp(vn)# 定义路由
    @app.route('/', methods=['GET', 'POST'])
    def index():if request.method == 'POST':question = request.form['question']response = vanna_app.ask(question)return render_template_string('''<form method="post"><label for="question">问题:</label><input type="text" id="question" name="question" value="{{ question }}"><button type="submit">提交</button></form><h2>结果:</h2><p>{{ response }}</p>''', question=question, response=response)return render_template_string('''<form method="post"><label for="question">问题:</label><input type="text" id="question" name="question"><button type="submit">提交</button></form>''')if __name__ == '__main__':app.run(debug=True)
    
  3. 运行 Flask 应用
    运行 Flask 应用后,访问 http://localhost:5000 即可使用 Vanna 的 Web 界面。在 Web 界面中,你可以方便地输入问题并查看生成的 SQL 查询和执行结果。

(三)Flask 应用的用户界面

通过 Flask 应用,你可以为用户提供一个简单的 Web 界面,让他们能够方便地与 Vanna 进行交互。用户可以在表单中输入问题,点击提交后,页面会显示生成的 SQL 查询和执行结果。

八、总结

Vanna 作为一个基于 Python 的工具,通过检索增强和大型语言模型,为生成 SQL 查询提供了一个高效、便捷的解决方案。它支持多种数据库类型和训练方式,能够满足不同场景下的需求。通过将 Vanna 集成到 Flask 应用中,还可以方便地在 Web 环境中使用,提供一个用户友好的界面。

希望本文的详细介绍能够帮助你更好地了解和使用 Vanna,提高你的数据库交互效率。更多详细信息,可以参考 Vanna 的官方文档。如果你在使用过程中遇到任何问题,欢迎在社区中寻求帮助或提出建议。

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

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

相关文章

C#上位机之网口通信与协议!

文章目录前言一、网口通信概念二、使用网口通信准备三、使用步骤前言 C#上位机之网口通信与协议&#xff01; 一、网口通信概念 定义 &#xff1a;Socket 可以理解为一个通信端点&#xff0c;它提供了应用程序与网络之间的接口&#xff0c;使得应用程序能够在网络上发送和接收…

Android Studio 创建类时如何自动添加类注释

打开IDEA或AS&#xff0c;点击菜单栏File——Settings——Editor——File and Code Templates。 点击右边Tab页的Includes&#xff0c;选择File Header&#xff0c;修改类头模版&#xff0c;如图&#xff1a; 记得选中Project&#xff0c;否则默认是整个AS都会进行设置

C++11:shared_ptr的设计哲学(原理+源码):内存安全和性能的架构权衡

0.简介 在C编程世界中&#xff0c;内存管理是一把双刃剑&#xff0c;手动管理带来了极致的内存控制能力&#xff0c;但也带来了像内存泄漏&#xff0c;野指针等问题&#xff1b;自动垃圾回收虽然安全&#xff0c;但却会带来一定的性能损耗。本文将介绍C11引入shared_ptr&#…

Mysql EXPLAIN 执行计划

EXPLAIN SELECT SQl。。。。界面filtered储引擎返回的数据在经过服务器层 WHERE 条件过滤后&#xff0c;剩余数据占总行数的百分比估计值rows * filtered/100 越接近100%效率越高rowspossible_keys 可能选择的索引key最终决定选择的行partitions问了哪些分区select_type查询…

力扣刷题记录【1】146.LRU缓存

前言&#xff1a; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&…

西门子S7-1200 PLC主流通信方法及应用

一、通信基础 1. 网络术语与设备 - 关键设备&#xff1a;交换机、路由器、网关等。 - 物理接口&#xff1a;RS-485&#xff08;支持多点通信&#xff09;、RS-232C&#xff08;点对点串行通信&#xff09;。 2. OSI参考模型 - 核心框架&#xff1a;理解协议分层&…

MySQL实现任意级子目录的主要方案以及区别

常见的实现方案及区别 1. 邻接表&#xff08;Adjacency List&#xff09; 方案描述&#xff1a; 每条记录存储一个节点的父节点ID。 表结构大致&#xff1a; id INT PRIMARY KEY, name VARCHAR(...), parent_id INT -- 指向父节点的ID&#xff0c;根节点为NULL或0优点&…

Linux网络socket套接字(完)(5)

文章目录前言一、多进程版的Tcp网络程序捕捉SIGCHLD信号让孙子进程提供服务二、多线程版的Tcp网络程序三、线程池版的Tcp网络程序四、Tcp协议通讯流程通讯流程总览三次握手的过程数据传输的过程四次挥手的过程总结前言 结束喽&#xff0c;至少这个Tcp套接字有关内容要结束了~  …

Web3 Study Log 003

Web3 Study Log 003 2025-7-5 这几天各种各样的琐事&#xff0c;处理完了&#xff0c;真的烦&#xff0c;估计能消停一段时间了… 今天终于能够坐下来好好学习&#xff0c;今天学习了chainlink的使用&#xff0c;能够获取 ETH/USD 实时价格&#xff0c;然后写了一个简单的众…

Kotlin:2.1.20 的新特性

一、概述 The Kotlin 2.1.20 release is here! Here are the main highlights: Kotlin 2.1.20发布了&#xff0c;主要亮点如下&#xff1a; K2 compiler updates: updates to the new kapt and Lombok pluginsKotlin Multiplatform: new DSL to replace Gradle’s Application …

设计模式 | 观察者模式

观察者模式&#xff08;Observer Pattern&#xff09;是行为型设计模式中的事件通知专家&#xff0c;它定义了对象间一种一对多的依赖关系&#xff0c;当一个对象状态改变时&#xff0c;所有依赖它的对象都会自动收到通知并更新。这种模式实现了发布-订阅机制&#xff0c;是事件…

Apache Struts2 远程命令执行漏洞(S2-052)

一、漏洞概述 S2-052 是 Apache Struts2 框架中一个高危的远程代码执行漏洞&#xff08;CVE-2017-9805&#xff09;&#xff0c;由安全研究人员于 2017 年发现并公开。该漏洞源于 Struts2 的 REST 插件在使用 XStream 组件处理 XML 反序列化时&#xff0c;未对用户输入的 XML 数…

RS触发器Multisim电路仿真——硬件工程师笔记

目录 1 RS触发器基础知识 1.1 工作原理 1.2 电路结构 1.3 特点 1.4 应用 1.5 设计考虑 1.6 总结 2 与非门实现基本RS触发器 2.1 电路结构 2.2 工作原理 2.3 特点 2.4 总结 3 或非门实现基本RS触发器 3.1 电路结构 3.2 工作原理 3.3 特点 3.4 总结 4 与非门实…

提示技术系列(12)——程序辅助语言模型

什么是提示技术&#xff1f; 提示技术是实现提示工程目标的具体技术手段&#xff0c;是提示工程中的“工具库”。 什么又是提示工程&#xff1f; 提示工程是指通过设计、优化和迭代输入到大语言模型&#xff08;LLM&#xff09;的提示&#xff08;Prompt&#xff09;&#xff…

明远智睿H618:开启多场景智慧生活新时代

在数字化浪潮的推动下&#xff0c;智能设备正深刻地改变着我们的生活方式。明远智睿H618以其强大的功能和卓越的性能&#xff0c;在家庭娱乐、商业展示、教育培训和智能家居控制等多个领域展现出巨大的应用潜力&#xff0c;开启了多场景智慧生活的新时代。 家庭娱乐&#xff1…

探秘展销编辑器:相较于传统展销的卓越优势与甄选指南​

在竞争激烈的商业环境中&#xff0c;企业期望通过展销活动提升品牌知名度、推广产品和拓展市场&#xff0c;但传统展销方式存在诸多难题。一是场地限制&#xff0c;优质场地稀缺、租金贵、档期紧&#xff0c;场地空间和布局也不一定合适;二是展示形式单一&#xff0c;多为静态展…

第31篇:块设备与字符设备管理深度解析(基于OpenEuler 24.03)

块设备与字符设备管理深度解析&#xff08;基于OpenEuler 24.03&#xff09; 文章目录 块设备与字符设备管理深度解析&#xff08;基于OpenEuler 24.03&#xff09;一、设备基础概念体系1.1 块设备的核心特性与分类1.2 字符设备的流式数据模型1.3 设备标识系统&#xff1a;主设…

Django Channels WebSocket实时通信实战:从聊天功能到消息推送

引言 在Web开发中&#xff0c;实时通信功能&#xff08;如在线聊天、实时通知、数据推送&#xff09;已成为许多应用的核心需求。传统的HTTP协议由于其请求-响应模式的限制&#xff0c;无法高效实现实时通信。WebSocket作为一种全双工通信协议&#xff0c;为实时Web应用提供了…

day52 神经网络调参指南

目录 随机种子 内参的初始化 神经网络调参指南 参数的分类 调参顺序 初始化参数 batchsize的选择 学习率调整 激活函数的选择 损失函数的选择 模型架构中的参数 正则化系数 其他补充 随机种子 import torch import torch.nn as nn# 定义简单的线性模型&#xf…

.NET9 实现斐波那契数列(FibonacciSequence)性能测试

在 .NET 平台上实现 斐波那契数列 并使用 BenchmarkDotNet 进行性能测试&#xff0c;是评估不同算法实现方式性能表现的一种高效且标准化的方法。通过该方式&#xff0c;可以对比递归、迭代、记忆化递归以及结合高性能优化技术&#xff08;如 Span<T>、Memory<T> 和…