Vanna AI 完全指南:如何把自然语言转SQL做成可上线的查询系统
【免费下载链接】vanna🤖 Chat with your SQL database 📊. Accurate Text-to-SQL Generation via LLMs using Agentic Retrieval 🔄.项目地址: https://gitcode.com/GitHub_Trending/va/vanna
Vanna AI 是一个开源的 Python 框架,核心工作只有一句话:把自然语言问题转成可执行的 SQL 并返回答案。它适合两类人——想让业务同事用大白话直接查数据库的开发者,以及需要给现有产品加一个"对话式取数"入口、又不想自己从零搭聊天界面和权限体系的小团队。
🚀 先跑通:一条命令装好,五分钟问出第一条数据
大多数 Text-to-SQL 方案卡在"演示能看、上线难搞"这一步。Vanna 的思路是先把最小闭环做短:装包、接数据库、注册工具、挂上服务,四件事做完就能问答。
安装只需一条命令:
pip install vanna跑通的最小路径在 notebooks/quickstart.ipynb 里:以 SQLite 为例,用SqliteRunner接上库文件,把RunSqlTool注册进ToolRegistry,再交给Agent,然后调用VannaFastAPIServer起服务。如果暂时没有 LLM 的 API Key,仓库还提供了离线样例 src/vanna/examples/mock_quickstart.py,用 Mock LLM 验证整个链路通不通,不花一分钱。
一个容易被忽略的起点建议:先拿一个你自己很熟的库(比如演示用的 Chinook)做第一批问题,把"问法 → 正确 SQL"的对照记下来。这批样本后面会直接决定生成质量,下文会解释为什么。
📐 原理:决定准确率的不是模型,是喂给模型什么上下文
Vanna 的官方测试论文(papers/ai-sql-accuracy-2023-08-17.md)做过一组对照实验:3 个 LLM × 3 种上下文策略 × 20 个问题,共 180 次生成。结论比较反直觉——
- 只给表结构(schema):总准确率约 3%。模型光靠字段名猜不出你的业务口径;
- 给少量固定 SQL 示例:明显提升,但各模型之间差距拉大,弱模型依然不稳;
- 按问题检索最相关的历史 SQL 示例:准确率跳到 80% 左右,在复杂上下文场景下可到 88% 以上。
这就是"Agentic Retrieval"在 Vanna 里的具体含义:用户提问时,系统先做相关性检索,把历史上被验证过正确的相似查询捞出来拼进 prompt,再交给 LLM 生成。它带来的实际影响是——模型选型是次要决策,样本积累是主要决策。团队里业务问得越多、存下的正确 SQL 越多,系统就越准,这是个正反馈循环。
架构上,2.0 版本把整条链路重写成 Agent 形态:请求进来后,UserResolver 先从请求里解出用户身份(Cookie、JWT、OAuth 均可,接你自己的认证系统),身份随后进系统提示词、工具执行和 SQL 过滤的每一个环节,结果以流式组件(表格、图表、摘要)推给前端。
📊 拿到手的不是文本,是流式结果
一次问答在<vanna-chat>组件里依次返回五样东西:实时进度、SQL 代码块(默认只对 admin 组可见)、可交互的数据表、Plotly 图表,以及一段自然语言摘要。全部走 SSE 流式推送,不用等整条 SQL 跑完才出内容。
前端集成成本是它比较突出的一个卖点:页面里引入一个<vanna-chat>标签并指向你的 SSE 端点即可,兼容 React、Vue 和纯 HTML,自带深浅两套主题和移动端适配。组件源码在 frontends/webcomponent/,想改交互可以自己编译。换句话说,"取数界面"这块通常要外包或养前端的活,它给你预置了。
🔐 权限、审计与配额:多用户场景的三个默认能力
给业务人员开放数据库查询,绕不开三个问题:谁能看到哪些行、每次查询有没有记录、资源消耗能不能控。Vanna 2.0 对这三点都是内置机制而非可选插件:
- 行级安全:工具层根据用户所属权限组自动过滤查询结果,同一张表,不同人看到的行不同;
- 审计日志:每个用户的每次查询都有独立记录,面向合规场景;
- 按用户配额:通过生命周期钩子在请求的关键节点挂检查逻辑,限流、日志、内容过滤都走同一套扩展点。
自定义能力也走明确的基类:继承Tool基类就能加新工具(比如发邮件、查外部接口),access_groups属性声明该工具的权限组,框架负责校验。LLM 调用外面还有一层 middleware 位置,缓存、成本统计这类需求不用动 Agent 主逻辑。
🧩 覆盖范围:模型与数据库都是"任选其一"
| 维度 | 内置支持 |
|---|---|
| LLM | OpenAI、Anthropic、Google Gemini、Azure OpenAI、AWS Bedrock、Mistral、Ollama、vLLM 等 |
| 数据库 | PostgreSQL、MySQL、SQLite、Snowflake、BigQuery、Redshift、Oracle、SQL Server、DuckDB、ClickHouse、Hive、Presto 等 |
| 向量存储(Agent 记忆) | ChromaDB、FAISS、Milvus、Qdrant、Pinecone、Weaviate、OpenSearch、Marqo、本地内存等 |
| 服务端 | FastAPI、Flask 两套路由,SSE 流式端点 |
集成代码都在 src/vanna/integrations/ 下按厂商分目录,选型时基本不需要胶水代码。用 Ollama 或 vLLM 跑本地模型也能接,适合对数据出域敏感的场景——代价是本地小模型的 SQL 准确率会明显低于云端旗舰模型,上面那组准确率数据里弱模型的表现可以当参照。
⚖️ 收尾判断:什么情况下值得引入 Vanna
适合:团队需要一个能对外提供、带权限和审计的取数入口,且愿意持续沉淀"问题—SQL"样本;或者已有认证体系,只差一个把自然语言接进去的后端。
需要先想清楚的代价:
- 准确率有下限依赖——上下文检索的样本库是冷启动阶段最弱的一环,前期问得少时,准确率会贴近"只给 schema"那档,建议上线前用业务真实问题建一个小评测集(仓库的 src/core/evaluation/ 提供了数据集、评估器和报告的完整骨架);
- 0.x 用户是重写而非升级——API 从
VannaBase方法变成了 Agent + 工具注册,旧代码可用LegacyVannaAdapter包一层先接上新 UI,再逐步迁移,具体步骤见 MIGRATION_GUIDE.md。
总评:Vanna 把"自然语言转 SQL"从 demo 做到生产之间最麻烦的三段——权限过滤、流式前端、样本闭环——都给了默认实现。它不替你解决业务口径模糊的问题,但把剩下的工程部分压缩到了几条配置和一次样本积累的周期。
【免费下载链接】vanna🤖 Chat with your SQL database 📊. Accurate Text-to-SQL Generation via LLMs using Agentic Retrieval 🔄.项目地址: https://gitcode.com/GitHub_Trending/va/vanna
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考