简介
隨著大型語言模型的興起以及人工智能領域的進步,我們在工作方式以及與周遭數位世界互動的方式上,見證了新的發展與機會。在这篇文章中,我們將探討 LlamaIndex 的基本原理,這是一項突破性的技術,可協助使用 LLM 建立应用程式。
我們將學習設定專案環境和建立資料庫連線的過程,為使用 LlamaIndex 模組開發 NL2SQL 應用程式奠定基礎。從概念化到部署,我們將為你的自定義用例提供整合此創新解決方案的全面路線圖。
此外,我們將學習這種尖端技術與大型語言模型和資料庫管理系統相結合在現實世界行業方案中的各種用例。那麼,讓我們開始吧!
学习目标:
LlamaIndex 的基本原理
在本节中,我們將學習 LlamaIndex 函式庫中使用的元件和概念,以便為 RAG 和 NL2SQL 用例建立由 LLM 驅動的應用程式。
如何開始使用 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 应用程式示意图
上图显示使用者查詢如何與資料庫和 GPT 模型互動,從資料庫表產生輸出。
应用程式的逐步工作流程
1. 用户上传CSV:
2. 上傳至 MySQL 資料庫:
3. 使用者上传示例:
4. 上传示例:
5. 选择表格:
6. 詢問查詢:
7. NL2SQL 查詢引擎:
8. 生成提示:
9. GPT 模型生成SQL:
10. SQL数据科:
11. 执行查詢:
12. 生成描述性答案:
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 应用程序,以及它在各种用例中的应用。