[AI/GPT/Chat2SQL/RAG] VannaAI
概述:VaanaAI
緣起
使用 AI 生成 SQL 的原因
- 數(shù)據(jù)倉庫和數(shù)據(jù)湖在企業(yè)中廣泛應用,但能夠精通 SQL 并理解企業(yè)數(shù)據(jù)結構的人很少。AI 可以幫助商業(yè)用戶使用自然語言查詢數(shù)據(jù)庫,生成 SQL 查詢,從而提高數(shù)據(jù)利用率。
簡介
- Vanna 是一個基于 MIT 許可的開源 Python RAG(檢索增強生成)框架,專注于 SQL 生成和相關功能。
它允許用戶在自己的數(shù)據(jù)上訓練一個 RAG “模型”,然后通過自然語言提問,生成在數(shù)據(jù)庫上運行的 SQL 查詢語句,并將查詢結果以表格和圖表的方式展示給用戶。
Vanna 的核心目標是簡化數(shù)據(jù)庫交互,讓用戶無需精通 SQL 即可從數(shù)據(jù)庫中提取有價值的信息。
- URL
- https://vanna.ai
+ https://github.com/vanna-ai/vanna20250228 1.2k fork / 13.5k star
開源協(xié)議: 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% |
主要發(fā)現(xiàn)
- 提供適當?shù)纳舷挛?/strong>至關重要,可以顯著提高 LLM 生成 SQL 的準確性。
- GPT 4 是生成 SQL 的最佳 LLM,但在提供足夠上下文時,Google 的 Bison 表現(xiàn)同樣優(yōu)異。
- 三種上下文策略中,結合模式定義、文檔和先前 SQL 查詢的相關性搜索策略表現(xiàn)最佳。
原文 :《 AI SQL 準確性:測試不同的 LLMs + 上下文策略以最大限度地提高 SQL 生成準確性》
https://vanna.ai/blog/ai-sql-accuracy.html
VannaAI 的優(yōu)勢
- 高準確性:通過 RAG 模型的語義檢索和上下文增強,大幅提高了 SQL 生成的準確性,尤其在復雜數(shù)據(jù)集上表現(xiàn)優(yōu)異。
- 安全性與隱私:用戶的數(shù)據(jù)庫內容不會發(fā)送到 LLM 或向量數(shù)據(jù)庫,SQL 執(zhí)行完全在本地環(huán)境中進行,確保數(shù)據(jù)安全。
- 自我學習:Vanna 可以在成功執(zhí)行的查詢上自動訓練,用戶也可以通過提供反饋優(yōu)化模型,逐步提高準確性。
- 支持任何 SQL 數(shù)據(jù)庫:Vanna 允許連接任何支持 Python 連接的 SQL 數(shù)據(jù)庫,極大提高了兼容性。
- 靈活的前端選擇:用戶可以選擇使用 Jupyter Notebook、Slackbot、Web 應用、Streamlit 應用或自定義前端與 Vanna 進行交互。
原理與架構
交互模式:Vanna + LLM/SQL Database/Vector Storage/Front-End
工作原理
How Vanna works
- Vanna的工作分為兩個簡單的步驟:
- 在你的數(shù)據(jù)上訓練一個RAG“模型”,(Train a RAG "model" on your data.)
- 然后問一些問題,這些問題將返回SQL查詢,這些查詢可以設置為自動在你的數(shù)據(jù)庫上運行。(Ask questions.)
訓練RAG模型
- 訓練 RAG 模型的關鍵在于收集并提供足夠的上下文信息,包括數(shù)據(jù)庫的結構、列描述、樣例查詢等。
Vanna 會將這些信息存儲在向量庫中,并在用戶提問時進行語義檢索,生成 SQL 語句。
訓練建議
主要因素
系統(tǒng)輸出準確性的主要決定因素是訓練數(shù)據(jù)的質量。最重要的訓練數(shù)據(jù)是已知正確的問題到 SQL 對。這些對包含了大量嵌入信息,有助于系統(tǒng)理解問題的上下文,特別是在問題模糊時。
使用 Jupyter Notebook
初次使用系統(tǒng)時,建議在 Jupyter Notebook 中進行,以便最大限度地控制訓練數(shù)據(jù),并執(zhí)行如提取數(shù)據(jù)庫模式等批量操作。
提示詞
- 初次運行時,在提問時嘗試提供一些“提示”以幫助系統(tǒng)理解問題的上下文。
例如,如果問題涉及特定表,可以在問題中包含表名。
SQL 語句
避免使用過于通用的 SQL 語句(如 SELECT * FROM my_table)。
最好使用包含列名的具體 SQL 語句(如 SELECT id, name, email FROM my_table)。
vn.train
vn.train 是一個包裝函數(shù),允許你訓練系統(tǒng)(即 LLM 之上的檢索增強層)。可以通過以下方式調用:
DDL 語句
這些語句讓系統(tǒng)了解有哪些表、列和數(shù)據(jù)類型。
vn.train(ddl="CREATE TABLE my_table (id INT, name TEXT)")
文檔字符串(documention)
這些可以是任何關于數(shù)據(jù)庫、業(yè)務或行業(yè)的文檔,有助于 LLM 理解用戶問題的上下文。
vn.train(documentation="Our business defines XYZ as ABC")
SQL 語句
系統(tǒng)理解常用 SQL 查詢非常有幫助,有助于理解問題的上下文。
vn.train(sql="SELECT col1, col2, col3 FROM my_table")
問題-SQL 對
這是訓練系統(tǒng)最直接、最有幫助的方式,特別是當用戶提問含糊不清時。
vn.train(
question="What is the average age of our customers?",
sql="SELECT AVG(age) FROM customers"
)
問題-SQL 對包含大量嵌入信息,系統(tǒng)可以使用這些信息來理解問題的上下文。當用戶傾向于提出具有很多歧義的問題時,尤其如此。
訓練計劃
# 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)
訓練計劃基本上就是將數(shù)據(jù)庫信息架構分解成可供 LLM 參考的小塊。這是一種快速使用大量數(shù)據(jù)訓練系統(tǒng)的好方法。
- **更多詳細信息,請訪問 Vanna.AI 文檔
https://vanna.ai/docs/training-advice
生成 SQL 并返回結果
- 在用戶提問時,Vanna 通過
RAG模型檢索相關信息,生成Prompt并交給LLM生成SQL查詢。
生成的 SQL 查詢會在數(shù)據(jù)庫中執(zhí)行,并將結果返回給用戶,以表格和圖表的形式展示。
例如:
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 模型的訓練數(shù)據(jù)包括數(shù)據(jù)庫的 DDL 語句、表結構、元數(shù)據(jù)、樣例查詢和相關文檔。這些信息被嵌入到向量庫中,在生成 SQL 時提供上下文支持。
一句話總結:RAG(中文為檢索增強生成) = 檢索技術 + LLM 提示。
例如,我們向 LLM 提問一個問題(answer),RAG 從各種數(shù)據(jù)源檢索相關的信息,并將檢索到的信息和問題(answer)注入到 LLM 提示中,LLM 最后給出答案。
工作流程
下面這張圖片展示了大概的工作流程。
基本上,主要思路就是利用LLM來生成多個查詢,期望能夠通過這些查詢讓問題的各個方面在上下文中顯現(xiàn)出來。
之后你可以使用生成的查詢進行向量搜索(如本系列之前的部分所述),并且基于其在結果集中的顯示方式來對內容進行重新排序。
RAG架構
完整的RAG應用流程主要包含兩個階段:
數(shù)據(jù)準備階段:數(shù)據(jù)提取——>文本分割——>向量化(embedding)——>數(shù)據(jù)入庫
應用階段:用戶提問——>數(shù)據(jù)檢索(召回)——>注入Prompt——>LLM生成答案
關于RAG詳細內容請看鏈接(《一文讀懂:大模型RAG(檢索增強生成)》)
向量庫
- 向量庫存儲了從訓練數(shù)據(jù)中提取的向量表示,這些向量表示用于在生成 SQL 查詢時進行語義檢索。
向量庫的質量直接影響 SQL 生成的準確性,因此在訓練時盡可能提供豐富的上下文信息非常重要。
從前面的vanna工作流程圖中我們可以看到,向量庫的主要作用是:
將訓練數(shù)據(jù)按照DDL,document,sql問答對分別創(chuàng)建了三個collection,也就是三類數(shù)據(jù)將分別存儲和檢索。對于sql/question會將數(shù)據(jù)變成{"question": question,"sql": sql}json字符串存儲。
當用戶詢問的時候,問題會去向量庫匹配關聯(lián)度最高的DDL,document,sql問答對,形成prompt,發(fā)送給LLM,大語言模型會根據(jù)prompt的內容作為參考,生成對應的sql。
Vanna也是提供了多種向量庫可以根據(jù)自身需求配置
大語言模型(LLM)
- 大語言模型(如 GPT-4)負責根據(jù)檢索到的上下文生成 SQL 查詢。
Vanna 默認使用 OpenAI 的在線 LLM 服務,但用戶也可以配置自己的 LLM。
大語言模型通過解析用戶的自然語言問題,結合向量庫中檢索到的上下文信息,生成準確的 SQL 查詢。
- 在探索過程中,也講到了在開發(fā)過程中,工程師們也對不同大語言模型在不同語境下準確生成sql的情況做了統(tǒng)計,可以看出提供適當?shù)纳舷挛闹陵P重要,可以顯著提高 LLM 生成 SQL 的準確性。
并且GPT 4 是生成 SQL 的最佳 LLM,所以在推薦中也是優(yōu)先推薦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
支持的數(shù)據(jù)庫
- PostgreSQL
- MySQL
- PrestoDB
- Apache Hive
- ClickHouse
- Snowflake
- Oracle
- Microsoft SQL Server
- BigQuery
- SQLite
- DuckDB
安裝指南
安裝 on Python pip
- 安裝 python 環(huán)境
- 安裝 python 虛擬環(huán)境管理器 : conda
Miniforge: 開源版conda環(huán)境管理器 - 博客園/千千寰宇
- 創(chuàng)建 python 環(huán)境
conda create --name python3.12-ai python=3.12
- 安裝 vanna
pip install vanna
總結
- Vanna 是一個強大且靈活的開源工具,通過 RAG 技術簡化了與數(shù)據(jù)庫的交互過程,使得用戶無需掌握復雜的 SQL 語法,即可高效地從數(shù)據(jù)庫中提取信息。
- 其高擴展性和靈活配置的特點,使其在各種應用場景中都能發(fā)揮重要作用。
- 未來,Vanna 有望成為創(chuàng)建 AI 數(shù)據(jù)分析師的首選工具,通過不斷提高準確性、交互能力和自主性,進一步接近人類數(shù)據(jù)分析師的水平。
Y 推薦文獻
- VannaAI
- Documentation : > https://vanna.ai/docs
- https://vanna.ai/docs/training-advice
X 參考文獻
- VannaAI 介紹及使用 - 第一篇 - Zhihu
總結
以上是生活随笔為你收集整理的[AI/GPT/Chat2SQL/RAG] VannaAI的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python学习—基础数据结构之列表
- 下一篇: 3.递归猴子吃桃问题