Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation,检索增强生成)框架,用于将自然语言问题转换为精确的 SQL 查询,并在数据库上执行这些查询以返回结果和可视化图表。
比如你提问:查询年龄25岁以上的人员清单。
Vanna就可以将其转为sql语句。
数据准备:导入数据库的元数据(如表结构 DDL 语句)、文档(如业务术语解释)和示例 SQL 查询。
向量化存储:将上述数据转换为向量并存储在本地向量数据库(如 ChromaDB)中。
用户输入自然语言问题后,Vanna 从向量库中检索相关上下文,结合 LLM(如 GPT-4、Qwen、DeepSeek等)生成 SQL 语句。
生成的 SQL 可自动执行并返回结果,支持数据可视化(如图表展示)
以下是Vanna的整体工作原理:
在这里选择了python3.11.x的版本。
conda create -n my_vanna pythnotallow==3.11.9
pip install vanna[chromadb,mysql]
由于我们采用openai接口的方式使用vanna,因此需要安装openai库。
pip install openai
经过以上配置,我们就可以通过vanna来生成sql了。
注意:以上通过pip安装过程中涉及到其他依赖库的安装,因此建议通过在线方式进行安装。
涉及到的环境:
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
官网地址如下:
https://vanna.ai/
仅需通过email就可以免费注册,然后到个人中心去找到自己的api key。
注册之后,每天享有100K的免费Token。
根据官网给的示例,我们只需要传递自己的apikey就可以进行测试。
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?")
测试结果如下,可以看到利用vanna自己的服务器和数据库能够成功获得sql语句与sql结果。(API已失效,自己可以免费申请)
本地mysql数据库的user表:
通过代码测试,可以看到能够成功提取年龄大于30岁的用户。
图片