SQL Assistant:Streamlit 中的文本到 SQL 应用程序

技术

在本文中,我们将探索 Vanna.ai 的应用,这是一个Python 库,专门用于训练能够处理自然语言问题并 生成 SQL 查询作为响应的 模型。此实现将集成到 ✨ Streamlit 应用程序中,创建一个 🤖 聊天机器人,方便提出问题并为返回的查询提供解释。

文本转 SQL 和 Vanna.ai

Text-to-SQL 是一款利用模型将自然语言查询转换为SQL查询的工具,旨在让用户轻松生成SQL查询并与数据库无缝交互。

Text-to-SQL可以通过使用Vanna.AI来实现,这是一个开源 🐍Python 库,允许使用数据库中的查询、DDL 和文档来训练 RAG 模型。

picture.image

Vanna.AI:输出可能性

以下是可以使用 Vanna 方法生成的可能输出,从而促进使用自然语言与数据库交互的多种方式。

| 输出

| 描述 | | 📄 SQL

| Vanna.AI 可以根据自然语言问题生成 SQL 查询。这些 SQL 查询可用于与数据库交互。 | | 📁 数据框

| 生成 SQL 查询后,Vanna.AI 可以在数据库中执行它,并将结果作为 pandas DataFrame 返回。 | | 📊 图表

| Vanna.AI 可以使用 Plotly 根据 SQL 查询的结果生成图表。 | | 后续问题

| Vanna.AI 可以根据生成的 SQL 查询生成后续问题。这些后续问题可以帮助用户优化查询或更详细地探索数据。 | | 🔍 解释查询 | Vanna.AI 可以为生成的 SQL 查询提供解释。这些解释可以帮助用户了解他们的自然语言问题如何解释为 SQL 查询。 |

Vanna.AI:特点

下表列出了Vanna.AI的主要功能,丰富了数据交互能力:

| 特征

| 描述 | | 🚀 模型训练

| 在训练过程中,在数据源上训练 RAG 模型,包括数据定义语言 (DDL) 语句、文档和 SQL 查询。 | | 🤖 用户查询处理

| 用户可以用自然语言提出问题,Vanna.AI 通过生成 SQL 查询进行响应。 | | 📚 文档

| Discord 上有大量的文档、专门的网站和支持社区,可以提供全面的帮助。 | | 🔌 数据库连接

| Vanna 允许连接到多个数据库,使用户不仅可以检索 SQL 查询,还可以通过建立到各自数据库的连接来执行它们。 | | 🤔 AI 生成的推荐问题

| 该框架包括生成人工智能驱动的问题的功能,为用户可以探索的其他查询提供建议。 |

🛠️ 简单实现

对于这个初始实现,我们将利用vanna.ai 提供的示例,使用 Chinook 数据库。该数据库包括与音乐商店相关的表格和数据,包括关于艺术家、专辑、曲目、客户、订单以及与在线音乐商店的管理相关的各个方面的信息。

安装 vanna-ai


        
            

          
 !pip install vanna
 
        
      

实施步骤

请按照以下步骤实现文本转 SQL 的简单示例:

API 密钥检索:要启动此示例,请通过在 https://vanna.ai/ 注册来获取 API 密钥。使用您注册的电子邮件获取密钥。

设置API密钥和模型: 配置获得的API密钥并指定要使用的模型,在本例中为预先存在的“chinook”模型

连接到数据库:利用 https://vanna.ai/Chinook.sqlite 上提供的 SQLite 文件建立与数据库的连接。

4.提出问题: 最后,提出一个自然语言问题以从数据库中提取特定信息。在此步骤中,结果包括 SQL 查询、查询执行的 DataFrame 以及代表性图表。该系统还根据数据集生成后续问题。


          
import vanna as vn
          
           
          
# STEP 01: This is a simple example of how to use the Vanna API
          
api_key = vn.get_api_key('your_email')
          
           
          
# Set the API key and the model
          
vn.set_api_key(api_key)
          
           
          
# STEP 02:  Set the model
          
vn.set_model('chinook')
          
           
          
# STEP 03:  Connect with the database
          
vn.connect_to_sqlite('https://vanna.ai/Chinook.sqlite')
          
           
          
# STEP 04:  Ask a question
          
vn.ask('What are the top 10 artists by sales?')
      

📃 sql query


          
SELECT a.name,
          
       sum(il.quantity) as totalsales
          
FROM   artist a
          
    INNER JOIN album al
          
        ON a.artistid = al.artistid
          
    INNER JOIN track t
          
        ON al.albumid = t.albumid
          
    INNER JOIN invoiceline il
          
        ON t.trackid = il.trackid
          
GROUP BY a.name
          
ORDER BY totalsales desc limit 10;
      

📊 plotly chart

picture.image

New Questions


          
AI-generated follow-up questions:
          
           
          
* Who is the artist with the highest sales?
          
* What are the total sales for each artist?
          
* Which genre has the highest sales?
          
* Can you provide a breakdown of sales by album?
          
* Which artist has the lowest sales?
          
* What is the average sales per artist?
          
* Can you provide a list of the top-selling albums?
          
* Which genre has the least sales?
          
* Can you provide a breakdown of sales by country?
          
* What is the total sales for each genre?
          
 
      

🧪 模型训练

要训练您自己的模型,请按照以下步骤操作:

1.登录您的帐户https://vanna.ai/并创建一个新模型。

接下来我们将定义如何训练模型。在下一个示例中,我们将使用 ddl(数据定义语言)、文档和查询。


          
# Check the models available in the account
          
vn.get_models()
          
['ecommerce-test', 'demo-tpc-h', 'tpc', 'chinook', 'thelook']
          
# Set the model
          
vn.set_model("ecommerce-test")
          
# Get the ddl for training the model
          
# Train the model with the ddl
          
ddl = """
          
CREATE TABLE if not exists stage.customers(
          
    customer_id           INT NOT NULL PRIMARY KEY,
          
    email_address         VARCHAR(50) NOT NULL,
          
    name                  VARCHAR(50) NOT NULL,
          
    business_type_id      INT NOT NULL,
          
    site_code             VARCHAR(10) NOT NULL,
          
    archived              BOOLEAN NOT NULL,
          
    is_key_account        BOOLEAN NOT NULL,
          
    date_updated          TIMESTAMP NOT NULL,
          
    date_created          TIMESTAMP NOT NULL,
          
    job_created_date  TIMESTAMP WITH TIME ZONE DEFAULT 
          
        CURRENT_TIMESTAMP,
          
    job_created_user  varchar(50) default null,
          
    job_updated_date  TIMESTAMP default null,
          
    job_updated_user  varchar(50) default null,
          
    CONSTRAINT fk_business_type_id FOREIGN KEY(business_type_id) REFERENCES stage.business_types (business_type_id)
          
);
          
"""
          
vn.train(ddl=ddl)
      

在我的存储库中,您可以找到所有脚本、文档和查询来训练模型并回答如下问题

picture.image


          
# Ask a question for generating the SQL
          
question  =  """What is the total count of new clients who registered between October 1, 2020, and 
          
January 1, 2022, and have made more than 10 purchases, each exceeding $20? Additionally,
          
 could you provide their email addresses, the number of purchases made, and the date of their
          
  most recent purchase?"""
          
           
          
print(vn.generate_sql(question=question))
          
SELECT COUNT(*) AS total_count,
          
       c.email_address,
          
       COUNT(o.order_id) AS num_purchases,
          
       MAX(o.order_date) AS most_recent_purchase_date
          
FROM Customers c
          
JOIN Orders o ON c.customer_id = o.customer_id        
          
WHERE c.registration_date >= '2020-10-01' AND c.registration_date <= '2022-01-01'
          
  AND o.order_value > 20
          
GROUP BY c.email_address
          
HAVING COUNT(o.order_id) > 10;
      

💬 Streamlit 聊天机器人

picture.image

描述

在本节中,我们将使用 ✨ Streamlit 的文本到 SQL 功能来实现 🤖 chatbot 应用程序。该应用程序将通过 Vanna.AI 和 ✨ Streamlit 的集成来开发,提供一个用户友好的界面,用于输入用户名、选择头像和发起 💬 聊天。

快速开始

1.克隆存储库

r0mymendez / 文本转 SQL

使用 vanna-ai 和 Streamlit 进行文本转 SQL

SQL Assistant:Streamlit 中的文本到 SQL 应用程序 🤖
✨ 什么是生成式人工智能?

Generative AI 是指一类人工智能系统,能够生成新的原创内容,例如图像、文本或其他形式的数据。

🧪 什么是LLM模式?

大型语言模型 (LLM) 是一种复杂的深度学习模型,在广泛的数据集上进行训练,以理解和生成自然语言文本。这些模型利用变压器架构,结合编码器从输入文本序列中提取细微差别的含义,并结合解码器来理解单词和短语之间复杂的关系。训练过程涉及数百万个数据输入,这是创建数百万个超参数来微调模型行为的基础。训练期间的大量计算需求由图形处理单元 (GPU) 有效处理,从而实现加速处理并增强模型生成上下文丰富且有意义的文本的能力。

🤖 文本转 SQL 和 Vanna.ai

添加您的 ddl 脚本、文档和 sql 查询 src\db

3.添加您的凭据src.streamlit\secrets.toml

执行应用程序

有关如何运行应用程序和添加凭据的详细说明可以在存储库的 README.md .

🤖 聊天机器人预览

该应用程序是用 Vanna.AI 和 ✨ Streamlit 制作的,您可以在下面看到它如何工作的视频,请记住所有解释都在 存储库 readme.md 的文件中。 请随意检查一下,如果您觉得有帮助,请给它一个星星! ⭐️

picture.image

picture.image

picture.image

原文链接: https://dev.to/r0mymendez/sql-assistant-text-to-sql-application-in-streamlit-464o

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
边缘云原生操作系统设计与思考
《火山引擎边缘云原生操作系统设计与思考》 徐广治 | 火山引擎边缘云资深架构师
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论