[AI/GPT/Chat2SQL/RAG] VannaAI
概述:VaanaAI
緣起
使用 AI 生成 SQL 的原因
- 數據倉庫和數據湖在企業中廣泛應用,但能夠精通 SQL 并理解企業數據結構的人很少。AI 可以幫助商業用戶使用自然語言查詢數據庫,生成 SQL 查詢,從而提高數據利用率。
簡介
- Vanna 是一個基于 MIT 許可的開源 Python RAG(檢索增強生成)框架,專注于 SQL 生成和相關功能。
它允許用戶在自己的數據上訓練一個 RAG “模型”,然后通過自然語言提問,生成在數據庫上運行的 SQL 查詢語句,并將查詢結果以表格和圖表的方式展示給用戶。
Vanna 的核心目標是簡化數據庫交互,讓用戶無需精通 SQL 即可從數據庫中提取有價值的信息。
- URL
- https://vanna.ai
+ https://github.com/vanna-ai/vanna20250228 1.2k fork / 13.5k star
開源協議: MIT
Demo
https://vanna.ai
探索過程
- 在官方文檔中,講述了他們探索如何利用不同的上下文策略和大型語言模型(LLM)來提高 SQL 生成的準確性。
從實驗中表明,提供合適的上下文信息可以顯著提高 LLM 生成 SQL 查詢的準確性,從約3%提升到約80%。
文章比較了多種 LLM,包括 Google Bison、GPT 3.5、GPT 4 ,并展示了結合模式定義、文檔和先前 SQL 查詢的相關性搜索策略。
| Accuracy | Bison | GPT3.5 | GPT 4 | Avg |
|---|---|---|---|---|
| Schema | 0% | 0% | 10% | 3% |
| Static | 34% | 61% | 74% | 56% |
| Contextual | 91% | 69% | 88% | 83% |
主要發現
- 提供適當的上下文至關重要,可以顯著提高 LLM 生成 SQL 的準確性。
- GPT 4 是生成 SQL 的最佳 LLM,但在提供足夠上下文時,Google 的 Bison 表現同樣優異。
- 三種上下文策略中,結合模式定義、文檔和先前 SQL 查詢的相關性搜索策略表現最佳。
原文 :《 AI SQL 準確性:測試不同的 LLMs + 上下文策略以最大限度地提高 SQL 生成準確性》
https://vanna.ai/blog/ai-sql-accuracy.html
VannaAI 的優勢
- 高準確性:通過 RAG 模型的語義檢索和上下文增強,大幅提高了 SQL 生成的準確性,尤其在復雜數據集上表現優異。
- 安全性與隱私:用戶的數據庫內容不會發送到 LLM 或向量數據庫,SQL 執行完全在本地環境中進行,確保數據安全。
- 自我學習:Vanna 可以在成功執行的查詢上自動訓練,用戶也可以通過提供反饋優化模型,逐步提高準確性。
- 支持任何 SQL 數據庫:Vanna 允許連接任何支持 Python 連接的 SQL 數據庫,極大提高了兼容性。
- 靈活的前端選擇:用戶可以選擇使用 Jupyter Notebook、Slackbot、Web 應用、Streamlit 應用或自定義前端與 Vanna 進行交互。
原理與架構
交互模式:Vanna + LLM/SQL Database/Vector Storage/Front-End
工作原理
How Vanna works
- Vanna的工作分為兩個簡單的步驟:
- 在你的數據上訓練一個RAG“模型”,(Train a RAG "model" on your data.)
- 然后問一些問題,這些問題將返回SQL查詢,這些查詢可以設置為自動在你的數據庫上運行。(Ask questions.)
訓練RAG模型
- 訓練 RAG 模型的關鍵在于收集并提供足夠的上下文信息,包括數據庫的結構、列描述、樣例查詢等。
Vanna 會將這些信息存儲在向量庫中,并在用戶提問時進行語義檢索,生成 SQL 語句。
訓練建議
主要因素
系統輸出準確性的主要決定因素是訓練數據的質量。最重要的訓練數據是已知正確的問題到 SQL 對。這些對包含了大量嵌入信息,有助于系統理解問題的上下文,特別是在問題模糊時。
使用 Jupyter Notebook
初次使用系統時,建議在 Jupyter Notebook 中進行,以便最大限度地控制訓練數據,并執行如提取數據庫模式等批量操作。
提示詞
- 初次運行時,在提問時嘗試提供一些“提示”以幫助系統理解問題的上下文。
例如,如果問題涉及特定表,可以在問題中包含表名。
SQL 語句
避免使用過于通用的 SQL 語句(如 SELECT * FROM my_table)。
最好使用包含列名的具體 SQL 語句(如 SELECT id, name, email FROM my_table)。
vn.train
vn.train 是一個包裝函數,允許你訓練系統(即 LLM 之上的檢索增強層)。可以通過以下方式調用:
DDL 語句
這些語句讓系統了解有哪些表、列和數據類型。
vn.train(ddl="CREATE TABLE my_table (id INT, name TEXT)")
文檔字符串(documention)
這些可以是任何關于數據庫、業務或行業的文檔,有助于 LLM 理解用戶問題的上下文。
vn.train(documentation="Our business defines XYZ as ABC")
SQL 語句
系統理解常用 SQL 查詢非常有幫助,有助于理解問題的上下文。
vn.train(sql="SELECT col1, col2, col3 FROM my_table")
問題-SQL 對
這是訓練系統最直接、最有幫助的方式,特別是當用戶提問含糊不清時。
vn.train(
question="What is the average age of our customers?",
sql="SELECT AVG(age) FROM customers"
)
問題-SQL 對包含大量嵌入信息,系統可以使用這些信息來理解問題的上下文。當用戶傾向于提出具有很多歧義的問題時,尤其如此。
訓練計劃
# The information schema query may need some tweaking depending on your database. This is a good starting point.
df_information_schema = vn.run_sql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS")
# This will break up the information schema into bite-sized chunks that can be referenced by the LLM
plan = vn.get_training_plan_generic(df_information_schema)
plan
# If you like the plan, then uncomment this and run it to train
vn.train(plan=plan)
訓練計劃基本上就是將數據庫信息架構分解成可供 LLM 參考的小塊。這是一種快速使用大量數據訓練系統的好方法。
- **更多詳細信息,請訪問 Vanna.AI 文檔
https://vanna.ai/docs/training-advice
生成 SQL 并返回結果
- 在用戶提問時,Vanna 通過
RAG模型檢索相關信息,生成Prompt并交給LLM生成SQL查詢。
生成的 SQL 查詢會在數據庫中執行,并將結果返回給用戶,以表格和圖表的形式展示。
例如:
vn.ask("What are the top 10 albums by sales?")
生成的Prompt部分內容如下:
You are a SQLite expert. Please help to generate a SQL query to answer the question. Your response should ONLY be based on the given context and follow the response guidelines and format instructions.
Response Guidelines
1. If the provided context is sufficient, please generate a valid SQL query without any explanations for the question.
2. If the provided context is almost sufficient but requires knowledge of a specific string in a particular column, please generate an intermediate SQL query to find the distinct strings in that column. Prepend the query with a comment saying intermediate_sql
3. If the provided context is insufficient, please explain why it can't be generated.
4. Please use the most relevant table(s).
5. If the question has been asked and answered before, please repeat the answer exactly as it was given before.
生成的sql如下:
SELECT
a.AlbumId, a.Title, SUM(il.Quantity) AS TotalSales
FROM Album a
JOIN Track t ON a.AlbumId = t.AlbumId
JOIN InvoiceLine il ON t.TrackId = il.TrackId
GROUP BY a.AlbumId, a.Title
ORDER BY TotalSales DESC
LIMIT 10;
查詢出來的結果如下:
繪制的圖表
核心模塊
RAG 模型
- RAG(Retrieval-Augmented Generation)模型是 Vanna 的核心技術,通過結合檢索和生成技術,提高 SQL 生成的準確性。
RAG 模型的訓練數據包括數據庫的 DDL 語句、表結構、元數據、樣例查詢和相關文檔。這些信息被嵌入到向量庫中,在生成 SQL 時提供上下文支持。
一句話總結:RAG(中文為檢索增強生成) = 檢索技術 + LLM 提示。
例如,我們向 LLM 提問一個問題(answer),RAG 從各種數據源檢索相關的信息,并將檢索到的信息和問題(answer)注入到 LLM 提示中,LLM 最后給出答案。
工作流程
下面這張圖片展示了大概的工作流程。
基本上,主要思路就是利用LLM來生成多個查詢,期望能夠通過這些查詢讓問題的各個方面在上下文中顯現出來。
之后你可以使用生成的查詢進行向量搜索(如本系列之前的部分所述),并且基于其在結果集中的顯示方式來對內容進行重新排序。
RAG架構
完整的RAG應用流程主要包含兩個階段:
數據準備階段:數據提取——>文本分割——>向量化(embedding)——>數據入庫
應用階段:用戶提問——>數據檢索(召回)——>注入Prompt——>LLM生成答案
關于RAG詳細內容請看鏈接(《一文讀懂:大模型RAG(檢索增強生成)》)
向量庫
- 向量庫存儲了從訓練數據中提取的向量表示,這些向量表示用于在生成 SQL 查詢時進行語義檢索。
向量庫的質量直接影響 SQL 生成的準確性,因此在訓練時盡可能提供豐富的上下文信息非常重要。
從前面的vanna工作流程圖中我們可以看到,向量庫的主要作用是:
將訓練數據按照DDL,document,sql問答對分別創建了三個collection,也就是三類數據將分別存儲和檢索。對于sql/question會將數據變成{"question": question,"sql": sql}json字符串存儲。
當用戶詢問的時候,問題會去向量庫匹配關聯度最高的DDL,document,sql問答對,形成prompt,發送給LLM,大語言模型會根據prompt的內容作為參考,生成對應的sql。
Vanna也是提供了多種向量庫可以根據自身需求配置
大語言模型(LLM)
- 大語言模型(如 GPT-4)負責根據檢索到的上下文生成 SQL 查詢。
Vanna 默認使用 OpenAI 的在線 LLM 服務,但用戶也可以配置自己的 LLM。
大語言模型通過解析用戶的自然語言問題,結合向量庫中檢索到的上下文信息,生成準確的 SQL 查詢。
- 在探索過程中,也講到了在開發過程中,工程師們也對不同大語言模型在不同語境下準確生成sql的情況做了統計,可以看出提供適當的上下文至關重要,可以顯著提高 LLM 生成 SQL 的準確性。
并且GPT 4 是生成 SQL 的最佳 LLM,所以在推薦中也是優先推薦OpenAI的GPT4.
Vanna也是提供了多種大語言模型可供選擇
大語言模型的資料太多了,感興趣的小伙伴可以自己去網上查閱
用戶界面
User Interfaces
- Jupyter Notebook
- vanna-ai/vanna-streamlit
- vanna-ai/vanna-flask
- vanna-ai/vanna-slack
支持的LLM大模型
- OpenAI
- Anthropic
- Gemini
- HuggingFace
- AWS Bedrock
- Ollama
- Qianwen
- Qianfan
- Zhipu
支持的向量存儲
Supported VectorStores
- AzureSearch
- Opensearch
- PgVector
- PineCone
- ChromaDB
- FAISS
- Marqo
- Milvus
- Qdrant
- Weaviate
- Oracle
支持的數據庫
- PostgreSQL
- MySQL
- PrestoDB
- Apache Hive
- ClickHouse
- Snowflake
- Oracle
- Microsoft SQL Server
- BigQuery
- SQLite
- DuckDB
安裝指南
安裝 on Python pip
- 安裝 python 環境
- 安裝 python 虛擬環境管理器 : conda
Miniforge: 開源版conda環境管理器 - 博客園/千千寰宇
- 創建 python 環境
conda create --name python3.12-ai python=3.12
- 安裝 vanna
pip install vanna
總結
- Vanna 是一個強大且靈活的開源工具,通過 RAG 技術簡化了與數據庫的交互過程,使得用戶無需掌握復雜的 SQL 語法,即可高效地從數據庫中提取信息。
- 其高擴展性和靈活配置的特點,使其在各種應用場景中都能發揮重要作用。
- 未來,Vanna 有望成為創建 AI 數據分析師的首選工具,通過不斷提高準確性、交互能力和自主性,進一步接近人類數據分析師的水平。
Y 推薦文獻
- VannaAI
- Documentation : > https://vanna.ai/docs
- https://vanna.ai/docs/training-advice
X 參考文獻
- VannaAI 介紹及使用 - 第一篇 - Zhihu
總結
以上是生活随笔為你收集整理的[AI/GPT/Chat2SQL/RAG] VannaAI的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python学习—基础数据结构之列表
- 下一篇: 3.递归猴子吃桃问题