Vanna Text2SQL框架:用自然语言查询数据库的新方式
一、背景
在当今数字化时代,数据已经成为企业和组织的核心资产之一。然而,对于非技术用户来说,从数据库中提取信息往往是一个挑战,因为这通常需要编写复杂的SQL查询语句。幸运的是,随着人工智能和自然语言处理技术的发展,Text2SQL技术应运而生,它允许用户通过自然语言查询数据库。Vanna Text2SQL框架就是这样一个强大的工具,它不仅简化了数据库查询的过程,还提供了高效的数据检索和分析能力。本文将详细介绍Vanna框架的工作原理、核心组件以及如何在实际项目中应用它。
二、Vanna简介
Vanna是一个开源的Python RAG(检索增强生成)框架,专门用于SQL生成和相关功能。它基于人工智能技术,允许用户通过自然语言提问来查询数据库并获取结果。Vanna的核心优势在于其能够将自然语言问题转换为有效的SQL查询语句,并在指定的数据库上执行这些查询,从而为用户提供所需的数据。
2.1 工作原理
Vanna的工作流程可以分为以下几个关键步骤:
- 用户提出问题:用户在对话框中输入自然语言问题。
- 搜索和提示生成:系统将问题发送到搜索模块,该模块从数据库定义语言(DDL)、文档资料以及正确答案的历史记录中检索相关信息。这些信息存储在一个通用向量存储库中。
- 提示与大语言模型(LLM):根据搜索到的信息,系统生成一个提示(Prompt),并将其发送给任何可用的大语言模型进行进一步处理。
- SQL查询生成:LLM生成相应的SQL查询语句。系统可以处理复杂的数据结构,并将其转换为有效的SQL查询。
- 执行SQL查询:生成的SQL查询被发送至数据库执行引擎,在指定的数据库上执行,以获取所需的查询结果。
- 结果展示:结果可以通过Pandas DataFrame和Plotly以表格或图表的形式呈现出来。用户还可以查看由AI生成的新问题和后续问题建议,方便进一步深入探索数据。
- 校验和反馈循环:如果结果显示正确,则返回给用户;如果结果显示不正确,则进入手动干预阶段,用户可以手动重写查询语句。
2.2 核心组件
Vanna框架由几个核心组件构成,这些组件共同协作,实现了从自然语言问题到SQL查询的转换和执行。
- VannaBase:定义公共方法及接口。
- 大语言模型访问组件:继承VannaBase,用于与大语言模型进行交互。
- 向量数据库访问组件:继承VannaBase,用于在向量数据库中存储和管理向量数据。
三、综合应用
3.1 安装必要的模块
在开始使用Vanna之前,需要安装一些必要的Python模块。这些模块包括Vanna本身、sentence-transformers用于文本嵌入,以及pymilvus用于与Milvus向量数据库进行交互。
pip install vanna
pip install sentence-transformers
pip install pymilvus[model]
3.2 示例代码
以下是一个使用Vanna框架的示例代码,展示了如何结合Milvus向量数据库和OpenAI的聊天模型来实现Text2SQL功能。
from pymilvus import MilvusClient
from vanna.openai.openai_chat import OpenAI_Chat
from vanna.milvus.milvus_vector import Milvus_VectorStore
from openai import OpenAI
from pymilvus import modeldef pymilvus_embedding_function():"""创建并返回一个SentenceTransformerEmbeddingFunction实例。"""sentence_transformer_ef = model.dense.SentenceTransformerEmbeddingFunction(model_name='BAAI/bge-small-zh-v1.5', # 指定模型名称device='cpu' # 指定设备)return sentence_transformer_efclass MyVanna(Milvus_VectorStore, OpenAI_Chat):"""MyVanna类继承自Milvus_VectorStore和OpenAI_Chat,用于实现特定的矢量存储和聊天功能。"""def __init__(self, config=None):"""初始化MyVanna类。"""milvus_client = MilvusClient(uri="http://127.0.0.1:19530")config = {"embedding_function": pymilvus_embedding_function(),"milvus_client": milvus_client,"model": "deepseek-chat","temperature": 0.7,"dialect": "SQLLite"}client = OpenAI(api_key="your-api-key", base_url="https://api.deepseek.com/v1")Milvus_VectorStore.__init__(self, config=config)OpenAI_Chat.__init__(self, client=client, config=config)# 创建MyVanna类的实例
vn = MyVanna()
# 连接到SQLite数据库
vn.connect_to_sqlite("./chinook.sqlite")# 测试数据
obj = vn.ask("每位顾客在各流派上花费了多少?")
print(obj)
3.3 训练数据
为了使Vanna能够理解数据库的结构并生成准确的SQL查询,需要对其进行训练。训练过程包括以下几个步骤:
- 收集训练材料:收集数据库定义语言(DDL)、文档资料以及参考的SQL查询语句。
- 生成嵌入表示:使用这些材料生成嵌入表示(Embeddings),将文本数据转换为数值形式。
- 存储嵌入和元数据:将生成的嵌入表示及其相关元数据存储到一个矢量数据库中。
以下是一个简单的训练函数示例:
def train():"""训练模型以学习数据库表结构。"""# 获取sqlite数据库中所有的表结构信息tables = vn.query("SELECT type, sql FROM sqlite_master WHERE sql is not null")# 根据表结构信息进行训练for ddl in tables:vn.train(ddl=ddl)
四、结论
Vanna Text2SQL框架为数据库查询提供了一种创新且高效的方法。通过自然语言处理和大语言模型的强大能力,Vanna能够将自然语言问题转换为有效的SQL查询,并在指定的数据库上执行这些查询。这不仅降低了普通用户访问和查询数据库的技术门槛,还显著提升了查询效率和用户体验。Vanna框架的开源性质也使其具有高度的灵活性和可扩展性,开发者可以根据自己的需求进行定制和优化。无论是在商业智能、数据分析还是日常办公中,Vanna都能为用户提供强大的支持,帮助他们更轻松地从数据中获取洞察。