Text2SQL工具:Vanna介紹與安裝
一、什么是Vanna
Vanna 是一個開源的 Python RAG(Retrieval-Augmented Generation,檢索增強(qiáng)生成)框架,用于將自然語言問題轉(zhuǎn)換為精確的 SQL 查詢,并在數(shù)據(jù)庫上執(zhí)行這些查詢以返回結(jié)果和可視化圖表。
比如你提問:查詢年齡25歲以上的人員清單。
Vanna就可以將其轉(zhuǎn)為sql語句。
二、Vanna的工作原理
1. 訓(xùn)練 RAG 模型
- 數(shù)據(jù)準(zhǔn)備:導(dǎo)入數(shù)據(jù)庫的元數(shù)據(jù)(如表結(jié)構(gòu) DDL 語句)、文檔(如業(yè)務(wù)術(shù)語解釋)和示例 SQL 查詢。
- 向量化存儲:將上述數(shù)據(jù)轉(zhuǎn)換為向量并存儲在本地向量數(shù)據(jù)庫(如 ChromaDB)中。
2. 生成 SQL
- 用戶輸入自然語言問題后,Vanna 從向量庫中檢索相關(guān)上下文,結(jié)合 LLM(如 GPT-4、Qwen、DeepSeek等)生成 SQL 語句。
- 生成的 SQL 可自動執(zhí)行并返回結(jié)果,支持?jǐn)?shù)據(jù)可視化(如圖表展示)
以下是Vanna的整體工作原理:
三、Vanna的環(huán)境配置
3.1 創(chuàng)建屬于vanna的虛擬環(huán)境
在這里選擇了python3.11.x的版本。
conda create -n my_vanna pythnotallow==3.11.9
3.2 安裝vanna環(huán)境依賴
pip install vanna[chromadb,mysql]
由于我們采用openai接口的方式使用vanna,因此需要安裝openai庫。
pip install openai
經(jīng)過以上配置,我們就可以通過vanna來生成sql了。
注意:以上通過pip安裝過程中涉及到其他依賴庫的安裝,因此建議通過在線方式進(jìn)行安裝。
涉及到的環(huán)境:
annotated-types 0.7.0
anyio 4.8.0
asgiref 3.8.1
attrs 25.1.0
backoff 2.2.1
bcrypt 4.2.1
blinker 1.9.0
build 1.2.2.post1
cachetools 5.5.1
certifi 2025.1.31
charset-normalizer 3.4.1
chroma-hnswlib 0.7.6
chromadb 0.6.3
click 8.1.8
colorama 0.4.6
coloredlogs 15.0.1
Deprecated 1.2.18
distro 1.9.0
durationpy 0.9
fastapi 0.115.8
filelock 3.17.0
flasgger 0.9.7.1
Flask 3.1.0
flask-sock 0.7.0
flatbuffers 25.2.10
fsspec 2025.2.0
google-auth 2.38.0
googleapis-common-protos 1.67.0
greenlet 3.1.1
grpcio 1.70.0
h11 0.14.0
httpcore 1.0.7
httptools 0.6.4
httpx 0.28.1
huggingface-hub 0.29.0
humanfriendly 10.0
idna 3.10
importlib_metadata 8.5.0
importlib_resources 6.5.2
itsdangerous 2.2.0
Jinja2 3.1.5
jiter 0.8.2
jsonschema 4.23.0
jsonschema-specifications 2024.10.1
kaleido 0.2.1
kubernetes 32.0.1
markdown-it-py 3.0.0
MarkupSafe 3.0.2
mdurl 0.1.2
mistune 3.1.2
mmh3 5.1.0
monotonic 1.6
mpmath 1.3.0
narwhals 1.27.1
numpy 2.2.3
oauthlib 3.2.2
onnxruntime 1.20.1
openai 1.63.2
opentelemetry-api 1.30.0
opentelemetry-exporter-otlp-proto-common 1.30.0
opentelemetry-exporter-otlp-proto-grpc 1.30.0
opentelemetry-instrumentation 0.51b0
opentelemetry-instrumentation-asgi 0.51b0
opentelemetry-instrumentation-fastapi 0.51b0
opentelemetry-proto 1.30.0
opentelemetry-sdk 1.30.0
opentelemetry-semantic-conventions 0.51b0
opentelemetry-util-http 0.51b0
orjson 3.10.15
overrides 7.7.0
packaging 24.2
pandas 2.2.3
pip 25.0
plotly 6.0.0
posthog 3.14.1
protobuf 5.29.3
pyasn1 0.6.1
pyasn1_modules 0.4.1
pydantic 2.10.6
pydantic_core 2.27.2
Pygments 2.19.1
PyMySQL 1.1.1
PyPika 0.48.9
pyproject_hooks 1.2.0
pyreadline3 3.5.4
python-dateutil 2.9.0.post0
python-dotenv 1.0.1
pytz 2025.1
PyYAML 6.0.2
referencing 0.36.2
requests 2.32.3
requests-oauthlib 2.0.0
rich 13.9.4
rpds-py 0.22.3
rsa 4.9
setuptools 75.8.0
shellingham 1.5.4
simple-websocket 1.1.0
six 1.17.0
sniffio 1.3.1
SQLAlchemy 2.0.38
sqlparse 0.5.3
starlette 0.45.3
sympy 1.13.3
tabulate 0.9.0
tenacity 9.0.0
tokenizers 0.21.0
tqdm 4.67.1
typer 0.15.1
typing_extensions 4.12.2
tzdata 2025.1
urllib3 2.3.0
uvicorn 0.34.0
vanna 0.7.6
watchfiles 1.0.4
websocket-client 1.8.0
websockets 15.0
Werkzeug 3.1.3
wheel 0.45.1
wrapt 1.17.2
wsproto 1.2.0
zipp 3.21.0
四、Vanna的環(huán)境配置
4.1 注冊vanna的API
官網(wǎng)地址如下:
https://vanna.ai/
僅需通過email就可以免費注冊,然后到個人中心去找到自己的api key。
注冊之后,每天享有100K的免費Token。
4.2 vanna在線測試
根據(jù)官網(wǎng)給的示例,我們只需要傳遞自己的apikey就可以進(jìn)行測試。
import vanna
from vanna.remote import VannaDefault
vn = VannaDefault(model='chinook', api_key='6474fcc9348a48feb0c997c707c2004b')
vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite')
vn.ask("What are the top 10 albums by sales?")
測試結(jié)果如下,可以看到利用vanna自己的服務(wù)器和數(shù)據(jù)庫能夠成功獲得sql語句與sql結(jié)果。(API已失效,自己可以免費申請)
4.3 vanna私有化測試
本地mysql數(shù)據(jù)庫的user表:
通過代碼測試,可以看到能夠成功提取年齡大于30歲的用戶。
圖片