
Harshad Suryawanshi • 2023-12-17
使用 LlamaIndex、GPT3.5 和 Streamlit 将自然语言转化为电子商务领域的 SQL 和洞察
在充满活力的 AI 和数据分析领域,弥合复杂数据查询与非技术用户之间的差距是一个颠覆性的改变。我的最新项目 Na2SQL 展示了这一令人兴奋的进展。该应用程序利用 LlamaIndex 和 OpenAI 的 GPT-3.5 的强大功能,允许用户,无论他们是否了解 SQL,都能使用简单的自然语言从数据库中获取有价值的见解。
功能
- 直观的自然语言查询: 此应用程序的核心能力在于其理解和处理自然语言查询的能力。用户可以用简单的英语提问,并收到 SQL 查询和洞察,无需任何 SQL 经验。
- 高级数据处理: 该应用程序不仅生成 SQL 查询,它还能执行这些查询并分析结果,提供有意义的洞察,使其成为一个强大的数据分析工具。
- 用户友好的 Streamlit 界面: 我选择 Streamlit 是因为它在创建交互式 Web 应用方面的简洁性和高效性。应用程序的界面直观明了,确保流畅的用户体验。
- 数据库查看器: 左侧侧边栏中的交互式数据库查看器允许用户探索数据库结构,增强他们对数据的理解和交互。
技术栈
该项目和谐地整合了多种先进技术
- OpenAI 的 GPT-3.5: 应用程序的核心是 GPT-3.5,它使应用程序能够理解自然语言查询并将其转化为有效的 SQL 查询。此外,它还会结合用户的查询和 SQL 输出生成最终分析,从而提供全面且相关的响应。
- LlamaIndex: LlamaIndex 的 SQLTableQueryEngine 是应用程序的关键组成部分。这个强大的工具将自然语言查询转化为 SQL,处理这些查询的执行,并在使用 GPT 3.5 进行后续分析中发挥重要作用。它的集成确保了从用户输入到数据库洞察的平稳过渡,最终产生有意义的最终分析,涵盖整个自然语言转 SQL 再到执行的过程。
- LlamaIndex 的 Streamlit LlamaPack: 使用 LlamaIndex 的 Streamlit LlamaPack,我们快速搭建了一个功能齐全的 Streamlit UI。这个框架显著简化了 UI 开发过程,从而实现快速部署并提升用户体验。
- SQLite 数据库: 该应用程序与一个模拟的 SQLite 电子商务数据库交互,展示了其处理真实世界数据的能力。
代码深入分析
应用程序的核心是 app.py
脚本,它实现了自然语言处理和 SQL 查询生成之间的无缝交互。
这段代码是在 Llama Hub 上提供的 Streamlit chatbot LlamaPack 的演进版本,进一步定制以满足电子商务数据分析的特定需求。让我们深入了解 app.py
脚本的一些关键部分
1. 初始导入和设置
脚本首先导入必要的模块,如 Streamlit、用于数据库交互的 SQLAlchemy、用于语言模型服务的 LlamaIndex 以及其他基本库。
import streamlit as st
from sqlalchemy import create_engine, inspect
from typing import Dict, Any
from llama_index import (
VectorStoreIndex,
ServiceContext,
download_loader,
)
from llama_index.llama_pack.base import BaseLlamaPack
from llama_index.llms import OpenAI
import openai
import os
import pandas as pd
2. StreamlitChatPack 类
StreamlitChatPack
类扩展了基础的 LlamaPack,设置了应用程序功能所需的页面和模块。
class StreamlitChatPack(BaseLlamaPack):
def __init__(
self,
page: str = "Natural Language to SQL Query",
run_from_main: bool = False,
**kwargs: Any,
) -> None:
"""Init params."""
self.page = page
# ... other methods ...
3. run
方法
这个方法是神奇发生的地方。它设置了 Streamlit 页面配置并初始化了聊天功能。
def run(self, *args: Any, **kwargs: Any) -> Any:
"""Run the pipeline."""
import streamlit as st
st.set_page_config(
page_title=f"{self.page}",
layout="centered",
initial_sidebar_state="auto",
menu_items=None,
)
# ... rest of the run method ...
4. 侧边栏中的数据库模式查看器
一个实用的功能是位于侧边栏的数据库模式查看器。这个查看器作为一个参考工具,允许用户查看数据库表的结构和内容,增强他们对查询数据的理解。
# Sidebar for database schema viewer
st.sidebar.markdown("## Database Schema Viewer")
# Create an inspector object
inspector = inspect(engine)
# Get list of tables in the database
table_names = inspector.get_table_names()
# Sidebar selection for tables
selected_table = st.sidebar.selectbox("Select a Table", table_names)
db_file = 'ecommerce_platform1.db'
conn = sqlite3.connect(db_file)
# Display the selected table
if selected_table:
df = get_table_data(selected_table, conn)
st.sidebar.text(f"Data for table '{selected_table}':")
st.sidebar.dataframe(df)
# Close the connection
conn.close()
5. 数据库交互和 LLM 集成
代码的这部分从磁盘加载数据库,并初始化 LLM和服务上下文以供 Llamaindex 使用。我在这里使用了 GPT3.5,但你可以轻松地将其替换为你选择的任何其他 LLM。
# Function to load database and LLM
def load_db_llm():
engine = create_engine("sqlite:///ecommerce_platform1.db")
sql_database = SQLDatabase(engine) # Include all tables
llm2 = OpenAI(temperature=0.1, model="gpt-3.5-turbo-1106")
service_context = ServiceContext.from_defaults(llm=llm2)
return sql_database, service_context, engine
sql_database, service_context, engine = load_db_llm()
6. 初始化 NLSQLTableQueryEngine
应用程序最重要的方面之一是 NLSQLTableQueryEngine
的初始化。这是应用程序设置引擎的地方,该引擎负责将自然语言查询转换为 SQL 查询,执行它们并在 GPT 3.5 的帮助下生成最终响应。
# Initializing the query engine
if "query_engine" not in st.session_state:
st.session_state["query_engine"] = NLSQLTableQueryEngine(
sql_database=sql_database,
synthesize_response=True,
service_context=service_context
)
7. 用户交互和结果显示
脚本提供了一个交互式界面,供用户输入自然语言查询,然后将其翻译成 SQL 查询并执行。
应用程序最后显示 SQL 查询和响应,提供一个信息丰富且引人入胜的用户体验
if prompt := st.chat_input(
"Enter your natural language query about the database"
): # Prompt for user input and save to chat history
with st.chat_message("user"):
st.write(prompt)
add_to_message_history("user", prompt)
# If last message is not from assistant, generate a new response
if st.session_state["messages"][-1]["role"] != "assistant":
with st.spinner():
with st.chat_message("assistant"):
response = st.session_state["query_engine"].query("User Question:"+prompt+". ")
sql_query = f"```sql\n{response.metadata['sql_query']}\n```\n**Response:**\n{response.response}\n"
response_container = st.empty()
response_container.write(sql_query)
add_to_message_history("assistant", sql_query)
总结
这个应用程序不仅仅是一个工具;它是使数据分析更容易被更广泛受众接触到的一个步骤。它体现了 AI 在简化复杂数据交互方面的潜力。我邀请你探索这个应用程序,见证它的能力,并与我一起迈向一个更具包容性的数据驱动的未来。