《Vanna实时增量训练实战:基于RAG的动态数据建模与私有化Text-to-SQL应用》
系统简介
Vanna 是一个开源的 AI 驱动工具,可将自然语言查询自动转换为 SQL 语句。主要功能包括:
- 非技术人员自助生成 SQL
- 支持主流数据库(PostgreSQL, MySQL, Snowflake 等)
- 基于机器学习的上下文理解
- 可定制的业务语义层
适用场景:
✅ 数据分析师快速验证查询
✅ 业务人员自助获取数据
✅ SQL 学习辅助工具
✅ 数据中台查询接口
核心特性
功能模块 | 描述 |
---|---|
NL2SQL 转换 | 将自然语言转换为可执行 SQL |
语法校验 | 自动检查生成 SQL 的语法正确性 |
查询优化建议 | 提供 SQL 性能优化提示 |
审计日志 | 记录所有查询操作历史 |
多数据库支持 | 支持 10+ 种主流数据库 |
API 接口 | 提供 RESTful API 集成能力 |
架构说明
部署要求
最低配置
- CPU: 2 Core
- 内存: 4GB
- 存储: 10GB
- Docker: 20.10+
- 网络: 可访问目标数据库
推荐生产配置
- CPU: 4 Core
- 内存: 8GB
- 存储: 50GB (SSD)
- Docker Swarm/Kubernetes 集群
快速部署指南
1. 服务器一键部署
本教程向量数据库使用chromadb,数据库采用pg
#一键启动
pip install vanna[chromadb,ollama,postgres]
该部分代码使用线上的大语音模型通义千问,需要获取获取通义千问模型的base_url和api_key,配置好以后直接启动py代码即可打开vanna内置的flask页面
from vanna.base import VannaBase
from vanna.chromadb import ChromaDB_VectorStore
from vanna.qianwen import QianWenAI_Chat
# 创建Vanna实例
class MyVanna(ChromaDB_VectorStore, QianWenAI_Chat):
def __init__(self, config=None):
ChromaDB_VectorStore.__init__(self, config=config)
QianWenAI_Chat.__init__(self, config=config)
# 配置参数
config = {
"api_key": "XXX通义千问的key",
"model": "qwen-plus 模型名"
}
# 实例化Vanna
vn = MyVanna(config=config)
# 连接pg数据库
vn.connect_to_postgres(
host="xxxx",
dbname="xxx", # 替换为你的数据库名称
user="xxx", # 替换为你的数据库用户名
password="xxx", # 替换为你的数据库密码
port=5432 # 数据库的运行端口,pg默认运行在5432端口
)
#训练
vn.train(documentation="请注意,在我们公司一般将1作为是,0作为否。")
# 启动Vanna的Flask应用
from vanna.flask import VannaFlaskApp
app = VannaFlaskApp(vn)
app.run()
2. Docker Compose 部署
文件结构
vanna-ai-stack/
├── docker-compose.yml
└── vanna/
├── Dockerfile
├── requirements.txt
└── app.py
创建 docker-compose.yml
(本教程使用的是本地的pg数据库 不在docker-compose进行设置):
version: '3.8'
services:
# ChromaDB 向量数据库
chromadb:
image: chromadb/chroma:latest
ports:
- "8000:8000"
volumes:
- chroma_data:/chroma/chroma
environment:
- ALLOW_RESET=TRUE
networks:
- vanna-net
# Ollama 服务(运行千问模型)
ollama:
image: ollama/ollama:latest
ports:
- "11434:11434"
volumes:
- ollama_models:/root/.ollama
networks:
- vanna-net
# Vanna AI 主服务
vanna:
build: ./vanna
ports:
- "8084:8084"
environment:
- FLASK_ENV=development
- FLASK_DEBUG=1
- CHROMA_URL=http://chromadb:8000
- OLLAMA_URL=http://ollama:11434
depends_on:
- chromadb
- ollama
networks:
- vanna-net
volumes:
pg_data:
chroma_data:
ollama_models:
networks:
vanna-net:
driver: bridge
创建 dockerfile
:
# vanna/Dockerfile
FROM python:3.10-slim
WORKDIR /app
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
libpq-dev \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# 设置环境变量:指定 Flask 应用入口
ENV FLASK_APP=app:flask_app
ENV FLASK_ENV=production
# 暴露端口
EXPOSE 8084
CMD ["python", "app.py"]
创建requirements.txt
(设置使用国内镜像源):
--index-url https://pypi.tuna.tsinghua.edu.cn/simple
--trusted-host pypi.tuna.tsinghua.edu.cn
vanna
chromadb
ollama
openai
pandas
numpy
sqlalchemy
psycopg2-binary
创建app.py
:
from vanna.base import VannaBase
from vanna.chromadb import ChromaDB_VectorStore
from vanna.qianwen import QianWenAI_Chat
# from vanna.flask import Flask
# 创建Vanna实例
class MyVanna(ChromaDB_VectorStore, QianWenAI_Chat):
def __init__(self, config=None):
ChromaDB_VectorStore.__init__(self, config=config)
QianWenAI_Chat.__init__(self, config=config)
# 配置参数
config = {
"api_key": "XXX通义千问的key",
"model": "qwen-plus 模型名"
}
# 实例化Vanna
vn = MyVanna(config=config)
# 连接MySQL数据库
vn.connect_to_postgres(
host="xxxx",
dbname="xxx", # 替换为你的数据库名称
user="xxx", # 替换为你的数据库用户名
password="xxx", # 替换为你的数据库密码
port=5432 # 数据库的运行端口,pg默认运行在5432端口
)
#训练
vn.train(documentation="请注意,在我们公司一般将1作为是,0作为否。")
# 启动Vanna的Flask应用
from vanna.flask import VannaFlaskApp
flask_app = VannaFlaskApp(
vn,
debug=False,
allow_llm_to_see_data=True,
title="数据库问答系统"
).run(host='0.0.0.0', port=8084)
if __name__ == "__main__":
flask_app.run(host='0.0.0.0', port=8084, debug=True)
启动服务:
清理镜像
docker-compose down -v
编译镜像
docker-compose build
运行镜像
docker-compose up -d
启动成功后会展示如下效果:
运行访问localhost:8084,就可以看到的vanna的前端操作界面了
:
生产环境建议
1. 安全加固
# 在 compose 文件中添加
environment:
- AUTH_ENABLED=true
- JWT_SECRET=your_jwt_secret
2. HTTPS 配置
使用 Nginx 反向代理:
server {
listen 443 ssl;
server_name vanna.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
}
}
常见问题
1.报错:“AttributeError: ‘Collection‘ object has no attribute ‘model_fields‘
因为chromadb版本问题,版本更新以后可能把这个属性给更新没了之类的,降下版本就可以了
pip uninstall chromadb
pip install chromadb==0.5.3
Flask 应用访问问题
访问http://localhost:8084无法打开页面。
可能是端口不一致、应用未完全启动或出错、防火墙或安全软件限制、网络连接问题、Flask 应用配置问题等原因导致。
确保vanna映射正确
查看 Docker 容器日志,获取更多报错信息。
检查系统防火墙和安全软件设置,允许对相应端口的访问。。
确保 Flask 应用host参数设置为0.0.0.0,检查路由等配置是否正确。
因为chromadb版本问题,版本更新以后可能把这个属性给更新没了之类的,降下版本就可以了
pip uninstall chromadb
pip install chromadb==0.5.3
`Flask 应用访问问题`访问http://localhost:8084无法打开页面。
可能是端口不一致、应用未完全启动或出错、防火墙或安全软件限制、网络连接问题、Flask 应用配置问题等原因导致。
确保vanna映射正确
查看 Docker 容器日志,获取更多报错信息。
检查系统防火墙和安全软件设置,允许对相应端口的访问。。
确保 Flask 应用host参数设置为0.0.0.0,检查路由等配置是否正确。
《Vanna实时增量训练实战:基于RAG的动态数据建模与私有化Text-to-SQL应用》