深入探索 Vanna:讓數據庫交互更智能

深入探索 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> 和…