在本文中,我们将探索Vanna.ai的应用,这是一个Python 库,专门用于训练能够处理自然语言问题并生成 SQL 查询作为响应的模型。此实现将集成到 ✨Streamlit 应用程序中,创建一个 🤖 聊天机器人,方便提出问题并为返回的查询提供解释。
文本转 SQL 和 Vanna.ai
Text-to-SQL
是一款利用模型将自然语言查询转换为SQL查询的工具,旨在让用户轻松生成SQL查询并与数据库无缝交互。Text-to-SQL
可以通过使用Vanna.AI来实现,这是一个开源 🐍Python 库,允许使用数据库中的查询、DDL 和文档来训练 RAG 模型。
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 生成的推荐问题 | 该框架包括生成人工智能驱动的问题的功能,为用户可以探索的其他查询提供建议。 |
🛠️ 简单实现
!pip install vanna
请按照以下步骤实现文本转 SQL 的简单示例:
1.API 密钥检索:要启动此示例,请通过在https://vanna.ai/注册来获取 API 密钥。使用您注册的电子邮件获取密钥。
2.设置API密钥和模型:配置获得的API密钥并指定要使用的模型,在本例中为预先存在的“chinook”模型
3.连接到数据库:利用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
❓ 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/并创建一个新模型。
2.接下来我们将定义如何训练模型。在下一个示例中,我们将使用 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)
在我的存储库中,您可以找到所有脚本、文档和查询来训练模型并回答如下问题
# 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 聊天机器人
在本节中,我们将使用 ✨Streamlit 的文本到 SQL 功能来实现 🤖chatbot 应用程序。该应用程序将通过 Vanna.AI 和 ✨Streamlit 的集成来开发,提供一个用户友好的界面,用于输入用户名、选择头像和发起💬聊天。
1.克隆存储库
r0mymendez / 文本转 SQL
Generative AI
是指一类人工智能系统,能够生成新的原创内容,例如图像、文本或其他形式的数据。
大型语言模型 (LLM)是一种复杂的深度学习模型,在广泛的数据集上进行训练,以理解和生成自然语言文本。这些模型利用变压器架构,结合编码器从输入文本序列中提取细微差别的含义,并结合解码器来理解单词和短语之间复杂的关系。训练过程涉及数百万个数据输入,这是创建数百万个超参数来微调模型行为的基础。训练期间的大量计算需求由图形处理单元 (GPU) 有效处理,从而实现加速处理并增强模型生成上下文丰富且有意义的文本的能力。
2.添加您的 ddl 脚本、文档和 sql 查询src\db
3.添加您的凭据src.streamlit\secrets.toml
4.执行应用程序
有关如何运行应用程序和添加凭据的详细说明可以在存储库的README.md
.
该应用程序是用 Vanna.AI 和 ✨Streamlit 制作的,您可以在下面看到它如何工作的视频,请记住所有解释都在存储库readme.md
的文件中。 请随意检查一下,如果您觉得有帮助,请给它一个星星!⭐️
原文链接:https://dev.to/r0mymendez/sql-assistant-text-to-sql-application-in-streamlit-464o