使用LlamaIndex构建自然语言到SQL应用程序

2024年07月30日 由 alex 发表 240 0

简介

隨著大型語言模型的興起以及人工智能領域的進步,我們在工作方式以及與周遭數位世界互動的方式上,見證了新的發展與機會。在这篇文章中,我們將探討 LlamaIndex 的基本原理,這是一項突破性的技術,可協助使用 LLM 建立应用程式。


我們將學習設定專案環境和建立資料庫連線的過程,為使用 LlamaIndex 模組開發 NL2SQL 應用程式奠定基礎。從概念化到部署,我們將為你的自定義用例提供整合此創新解決方案的全面路線圖。


此外,我們將學習這種尖端技術與大型語言模型和資料庫管理系統相結合在現實世界行業方案中的各種用例。那麼,讓我們開始吧!


学习目标:

  1. 我們將學習 llama 索引的概念,以建立由 LLM 驅動的應用程式,例如檢索增強世代、NL2SQL 等。
  2. 透過逐步的工作流程開發自然語言至 SQL 應用程式,並在 streamlit 雲端進行部署
  3. NL2SQL 應用程式在各種現實世界中的使用案例


LlamaIndex 的基本原理

在本节中,我們將學習 LlamaIndex 函式庫中使用的元件和概念,以便為 RAG 和 NL2SQL 用例建立由 LLM 驅動的應用程式。


2


如何開始使用 LlamaIndex?

LlamaIndex 有许多不同的组件可用于 LLM 应用程序。大型语言模型需要与用户查询、向量存储、数据库和外部数据源进行交互。LlamaIndex 主要针对基于 LLM 的应用程序分为 3 个阶段:


1. 加载阶段

在此階段,資料會從外部 API 輸出、PDF 或資料庫載入。資料載入後,會被轉換成區塊,以便進行索引和儲存。在 llamaindex 中,這些資料塊也稱為節點,是資料的原子單位。


2. 索引階段

載入資料後,我們必須將資料向量化,並將每個向量儲存到 Vectorstore 或 Vectorindex。LLM 會產生每個句子的數字表示,稱為 embeddings。llamaindex 有許多元件,可以幫助將 chunks 嵌入向量表示。


3. 查詢階段

在此階段,检索器會根據查詢的上下文,從向量庫中擷取相關向量。相似性搜尋是以 LLM 為基礎的應用程式中最重要的概念之一,也是如何有效率且準確地擷取資料的關鍵。


使用基于 LLM 的应用程序中的上述阶段,我们可以开发基于 RAG 或 NL2SQL 的应用程序。Llamaindex 函数和工具有助于构建此类代理应用程序。在下一节中,我们将逐步指导你从自然语言到 SQL 的应用程序。


NL2SQL 应用程式的架构

在本节中,我们将了解自然语言到 SQL 应用程序的架构,以了解大型语言模型、数据库和用户查询如何相互作用,将自然语言查询转换为 SQL 查询,从而为用户查询提供答案。


NL2SQL 应用程式示意图


3


上图显示使用者查詢如何與資料庫和 GPT 模型互動,從資料庫表產生輸出。


应用程式的逐步工作流程


1. 用户上传CSV:

  • 该过程从用户上传包含表格形式的数据的 CSV 文件开始。此 CSV 文件旨在上传到 MySQL 数据库。上传的 CSV 将使用“CREATE TABLE…”和“INSERT INTO…”函数插入到 MySQL 数据库中。


2. 上傳至 MySQL 資料庫:

  • 上传的 CSV 数据经过处理后存储在 MySQL 数据库中。该数据库将作为用户查询的数据源。


3. 使用者上传示例:

  • 上传 CSV 后,用户可以选择上传镜头示例。这些示例用于增强自然语言理解并使提示生成更加稳健。


4. 上传示例:

  • 用户上传的示例被存储起来以供以后用于为 NL2SQL 查询引擎创建提示


5. 选择表格:

  • 然后提示用户从上传的 CSV 数据中选择一个表。该表将成为后续查询的目标。用户也可以根据应用程序的功能选择多个表。


6. 詢問查詢:

  • 用户使用自然语言对所选表提出查询。


7. NL2SQL 查詢引擎:

  • NL2SQL 查询引擎会根据用户的查询和所选表的信息来创建提示。此提示是使用“创建表”函数和表中的几个示例生成的。


8. 生成提示:

  • 提示被提交给 GPT 模型,GPT 模型是一种自然语言处理模型,能够根据提供的提示生成 SQL 查询。对于更详细的提示,我们可以使用少量的提示来激发 GPT 模型生成更好的 SQL 查询。


9. GPT 模型生成SQL:

  • GPT 模型根据提示生成 SQL 查询。此 SQL 查询旨在从选定的表中检索数据。


10. SQL数据科:

  • 生成的 SQL 查询被提交给 MySQL 数据库执行。数据库处理查询并返回结果集。


11. 执行查詢:

  • SQL数据库执行查询,并获取结果集(DB Result)。


12. 生成描述性答案:

  • 然后将获得的 DB 结果提交回 GPT 3.5/4 模型。这些模型根据执行的 SQL 查询的结果生成描述性答案。


13. GPT 模型回傳答案:

  • 描述性答案返回给用户,完成工作流程。用户将根据其原始自然语言查询收到可理解且信息丰富的响应。


現在我們已學習了 NL2SQL 應用程式的工作流程,讓我們以實作程式碼範例來瞭解如何建立此類應用程式。


设置环境并连接数据库

在本節中,我們將安裝專案所需的重要函式庫來設定環境,接著連接到 MySQL 資料庫來開發應用程式。


安裝库


!pip install pymysql
!pip install llama_index
!pip install --force-reinstall 'sqlalchemy<2.0.0'
!pip install llama-index-callbacks-aim
!pip install openai
!pip install sqlalchemy


安裝好所需的函式庫後,我們就可以使用「pymysql」和「sqlalchemy」連接資料庫到我們的環境。


数据库连接


# import logging modules to configure login parameters
import logging
import sys
import pymysql
logging.basicConfig(stream=sys.stdout, level=logging.INFO, force=True)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
from IPython.display import Markdown, display
# db credentials 
db_user = "your_username"
db_password = "your_password"
db_host = "your_host"
db_name = "your_name"
# create_engine, text classes from sqlalchemy
from sqlalchemy import create_engine, text
# Construct the connection string
connection_string = f"mysql+pymysql://{db_user}:{db_password}@{db_host}/{db_name}"
# Create an engine instance
engine = create_engine(connection_string)
# Test the connection using raw SQL
with engine.connect() as connection:
    result = connection.execute(text("show tables"))
    for row in result:
        print(row)
---------------------------------[Output]-------------------------------------
('Customers',)
('OrderDetails',)
('Orders',)
('info',)
('table_36370395d9314572970b325bee42817d',)
('table_59af3c5a5388482193f88093fc2eaa36',)


在上述代码中,首先必须使用可用的数据库证书连接 MySQL 数据库,然后创建连接数据库表的连接字符串对象。


Llamaindex SQL 数据库实例


from llama_index.core import SQLDatabase
# select tables to connect for application
tables = ['table_36370395d9314572970b325bee42817d', 'table_59af3c5a5388482193f88093fc2eaa36']
sql_database = SQLDatabase(engine, include_tables=tables, sample_rows_in_table_info=2)
sql_database


连接数据库后,我们使用 llamaindex 核心库中的 “SQLDatabase ”类获取所选表的表模式。


使用 llama 索引模块开发 NL2SQL 应用程序

我们首先要设置 OpenAI API 密钥并导入 OpenAI 库,以调用 GPT 模型将自然语言转换为 SQL 查询。OpenAI 为许多任务提供了广泛的 LLM。


import os
import openai
openai.api_key = "YOUR_OPENAI_KEY"


上述代码根据应用环境配置 OpenAI GPT 模型。现在,让我们创建 LLM 编码器函数,帮助将输入查询转换为编码向量。


import tiktoken
from llama_index.core.callbacks import CallbackManager, TokenCountingHandler
token_counter = TokenCountingHandler(
    tokenizer=tiktoken.encoding_for_model("gpt-3.5-turbo").encode
)
# callback manager for encoding input queries
callback_manager = CallbackManager([token_counter])


上面的代码使用回调管理器(CallbackManager)实例建立了一个回调机制来管理回调。其中一个回调是令牌计数处理程序(TokenCountingHandler)实例,它使用 tiktoken 模块中的令牌生成器,专门为 “gpt-3.5-turbo ”模型定制。这种设置很可能是更大的文本处理或分析管道的一部分。


设置 OpenAI LLM 服务上下文


from llama_index.core.indices.service_context import ServiceContext
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI
# llm instance usign OpenAI function 
llm = OpenAI(temperature=0.1, model="gpt-3.5-turbo")
# setting up service context for llm
service_context = ServiceContext.from_defaults(
  llm=llm,callback_manager=callback_manager
)


以上代码初始化了使用 OpenAI 的 GPT-3.5 模型所需的各种组件,并进行了特定设置。它创建了用于模型交互的 OpenAI 类实例,以及用于管理服务相关配置的 ServiceContext 实例,包括我们在前面代码中初始化的 OpenAI 模型实例和回调管理器。


创建 SQL 表节点映射


#creating SQL table node mapping 
from llama_index.core import VectorStoreIndex
from llama_index.core.objects import ObjectIndex, SQLTableNodeMapping, SQLTableSchema
import pandas as pd
# list all the tables from database and crate table schema for prompt to LLM
tables = list(sql_database._all_tables)
table_node_mapping = SQLTableNodeMapping(sql_database)
table_schema_objs = []
for table in tables:
    table_schema_objs.append((SQLTableSchema(table_name = table)))


上述代码从 SQL 数据库中检索表的信息,在 SQL 表和内部表示法之间创建映射,并为数据库中的每个表生成表模式。这些表模式可能用于与 llama_index 库提供的对象索引系统交互。


初始化 SQL 表查询检索引擎


from llama_index.core.indices.struct_store.sql_query import SQLTableRetrieverQueryEngine
# create a object index to store vectors 
obj_index = ObjectIndex.from_objects(
    table_schema_objs,
    table_node_mapping,
    VectorStoreIndex
)
# initializing query engine 
query_engine = SQLTableRetrieverQueryEngine(
    sql_database, obj_index.as_retriever(similarity_top_k=3), service_context=service_context
)
# Ask query to query engine and store it in a response variable
response = query_engine.query("How many people have previous work experience?")


上述代码会建立一个对象索引,初始化 SQL 表的查询引擎,然后使用提供的文本和服务上下文生成的 SQL 查询在 SQL 数据库中执行查询。查询的响应存储在响应变量中。这一过程可能涉及某种形式的自然语言处理和数据库交互,以便根据查询提供相关信息。然后可将结果答案反馈给用户。


结论

最后,我们了解了 llama 索引及其工作原理,如存储、索引和查询引擎。之后,我们深入学习了 NL2SQL 工作流程,并解释了从零开始开发应用程序的每个步骤。此外,我们还学习了如何使用实践代码示例实现 NL2SQL 应用程序,以及它在各种用例中的应用。



文章来源:https://medium.com/@avikumart_/building-natural-language-to-sql-applications-using-llamaindex-39280e90d52f
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消