​​《Vanna实时增量训练实战:基于RAG的动态数据建模与私有化Text-to-SQL应用》​

​​《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应用》​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值