Vanna是一个开源的、基于Python的RAG(检索增强生成)框架,专门用于SQL生成和相关功能。它能将自然语言问题自动转成SQL,并且还能直接跑在数据库上,自动生成可视化图表。其主要特点和优势包括:
使用pip安装vanna库,根据不同的需求可以安装不同的扩展,例如连接Chromadb向量数据库、使用ollama模型、连接mysql数据库等:
# 安装基本的vanna库 pip install vanna # 安装带有chromadb、ollama、mysql扩展的vanna库 pip install 'vanna[chromadb,ollama,mysql]'
如果需要连接mysql数据库,需要安装mysql-connector-python;如果使用Chromadb作为向量数据库,需要安装Chromadb:
pip install mysql-connector-python pip install ChromaDB
以下是一个简单的使用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)
Vanna可以与Streamlit结合,构建一个智能化的数据查询应用,让数据分析变得更加轻松和高效。以下是详细的配置和代码实现步骤:
首先,创建一个新的Python虚拟环境,然后安装必要的依赖包:
python3 -m venv venv source venv/bin/activate pip install -r requirements.txt
其中,requirements.txt
文件应该包含以下依赖:
streamlit vanna plotly
在 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
在 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()
在 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 sqlite3
conn = 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