一、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 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
评论前必须登录!
注册