一、Vanna简介
Vanna是一个开源的、基于Python的RAG(检索增强生成)框架,专门用于SQL生成和相关功能。它能将自然语言问题自动转成SQL,并且还能直接跑在数据库上,自动生成可视化图表。其主要特点和优势包括:
- 易用性:允许非技术用户通过自然语言与数据库交互,无需编写复杂的SQL查询。
- 灵活性:可以处理多种类型的数据库和查询,适用于不同的应用场景。
- 准确性:Vanna的能力与提供的训练数据相关,更多的训练数据意味着在大型和复杂的数据集上有更好的准确性。
- 安全性:数据库内容不会直接发送给LLM,SQL执行发生在本地环境中。
- 自我学习:可以选择在成功执行的查询上“自动训练”,或让界面提示用户对结果提供反馈,使未来的结果更加准确。
二、环境准备
2.1 安装Vanna库
使用pip安装vanna库,根据不同的需求可以安装不同的扩展,例如连接Chromadb向量数据库、使用ollama模型、连接mysql数据库等:
# 安装基本的vanna库 pip install vanna # 安装带有chromadb、ollama、mysql扩展的vanna库 pip install 'vanna[chromadb,ollama,mysql]'
2.2 安装其他依赖库
如果需要连接mysql数据库,需要安装mysql-connector-python;如果使用Chromadb作为向量数据库,需要安装Chromadb:
pip install mysql-connector-python pip install ChromaDB
三、代码案例
3.1 基本使用示例
以下是一个简单的使用Vanna将自然语言转换为SQL查询并执行的示例:
import vanna as vn# 连接到SQLite数据库
vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite')# 添加示例查询,用于训练模型以提高准确性
vn.add_example_query("显示2023年销售额最高的产品", "SELECT product FROM sales WHERE YEAR(date) = 2023 ORDER BY amount DESC LIMIT 1")# 使用自然语言生成SQL查询
question = "显示2023年销售额最高的产品"
sql = vn.generate_sql(question)
print("生成的SQL查询:", sql)# 将生成的SQL查询发送到数据库并获取结果
results = vn.execute_query(sql)
print("查询结果:", results)
3.2 结合Streamlit构建交互式应用示例
Vanna可以与Streamlit结合,构建一个智能化的数据查询应用,让数据分析变得更加轻松和高效。以下是详细的配置和代码实现步骤:
3.2.1 安装与配置
首先,创建一个新的Python虚拟环境,然后安装必要的依赖包:
python3 -m venv venv source venv/bin/activate pip install -r requirements.txt
其中,requirements.txt
文件应该包含以下依赖:
streamlit vanna plotly
3.2.2 配置Vanna AI
在 vanna_calls.py
文件中,设置Vanna AI的配置,包括设置API密钥和选择合适的模型:
import vanna as vn import streamlit as st # 设置Vanna的API密钥和模型
def setup_vanna(): vn.api_key = st.secrets["vanna_api_key"] vn.set_model("gpt-3.5-turbo-16k") # 其他配置... return vn
3.2.3 构建Streamlit应用
在 app.py
文件中,创建Streamlit应用的核心逻辑,允许用户输入自然语言查询,然后生成SQL,执行查询,并展示结果和可视化:
import streamlit as st
import vanna_calls as vc
import plotly.graph_objects as go# 主函数
def main():st.title("Vanna AI智能数据查询助手")# 用户输入user_query = st.text_input("请输入你的数据查询问题:")if user_query:with st.spinner("正在生成SQL..."):# 生成SQL查询sql = vc.generate_sql(user_query)st.code(sql, language="sql")with st.spinner("执行查询..."):# 执行查询results = vc.execute_query(sql)st.dataframe(results)with st.spinner("生成可视化..."):# 生成可视化图表fig = vc.generate_visualization(results, user_query)st.plotly_chart(fig)if __name__ == "__main__":main()
3.2.4 实现核心功能
在 vanna_calls.py
中,实现生成SQL、执行查询和生成可视化图表的核心功能:
mport vanna as vn
import streamlit as st
import plotly.graph_objects as go
import pandas as pd# 获取数据库连接
def get_database_connection():# 这里需要根据实际数据库连接进行配置# 示例:连接到SQLite数据库import sqlite3conn = sqlite3.connect('https://vanna.ai/Chinook.sqlite')return conn# 生成SQL查询
def generate_sql(question):return vn.generate_sql(question)# 执行查询
def execute_query(sql):conn = get_database_connection()return pd.read_sql(sql, conn)# 生成可视化图表
def generate_visualization(df, question):plotly_code = vn.generate_plotly_code(question=question, df=df)fig = vn.get_plotly_figure(plotly_code=plotly_code, df=df)return fig