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