在之前的数据库管理领域,所有的操作都要一板一眼,都要按照专业的结构化语法来完成,这就是结构化查询语言SQL,所有查询操作需要符合SQL语法格式。

这就是必须要先学习,再使用

但是伴随着LLM的兴起,带来了一个问题,是否可以通过日常的自然语言和计算机交流。不再使用复杂的SQL进行查询。

也就是由我们告诉计算机怎么做,改为告诉计算机,我们想要什么

具体到LLM的实现则为:

输入一个问题, 去年的销售总额为多少

LLM理解这个问题,并先去查询数据模型,然后生成SQL查询,例如

Select sum(sales) from logs where date >= ‘2023-01-01’ and < ‘2024-01-01’

LLM 利用Action执行这个sql

得到结果,LLM进行解析

LLM将结果转换为自然语言,返回给用户,比如 去年的销售总额为 1000000元

那么在LangChain之中,该如何实现这一套逻辑

首先我们确保数据已经准备好了,假设有一个准备好的商品表

create table Products ( ID INTEGER primary key,

Name text not null,

type text not null,

source text not null,

PurchasePrice real,

SalePrice real,

StockQuantity INTEGER,

SoldQuantity INTEGER,

ExpiryDate DATE,

Description text,

EntryDate DATE default CURRENT_DATE );

之后我们利用LangChain去实现这个功能

pip install langchain-experimental

# 连接到FlowerShop数据库(之前我们使用的是Chinook.db)

db = SQLDatabase.from_uri(“sqlite:///FlowerShop.db”)

# 创建OpenAI的低级语言模型(LLM)实例,这里我们设置温度为0,意味着模型输出会更加确定性

llm = OpenAI(temperature=0, verbose=True)

# 创建SQL数据库链实例,它允许我们使用LLM来查询SQL数据库

db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)

response = db_chain.run(“有多少种不同的鲜花?”)

print(response)

”’> Entering new SQLDatabaseChain chain…

有多少种不同的鲜花?

SQLQuery:SELECT COUNT(DISTINCT “Name”) FROM “Flowers”;

SQLResult: [(5,)]

Answer:有5种不同的鲜花。

> Finished chain.

有5种不同的鲜花。

‘’‘

除了最基本的Chain之外,还可以利用封装好的Agent进行调用

这样就可以利用RA框架进行相关的递归搜索

直接利用create_sql_agent函数就可以初始化代理,顺带初始化了SQLDatabaseToolkit这个工具箱

方便创建并执行查询,检查查询语法,检索数据表的描述

db = SQLDatabase.from_uri(“sqlite:///FlowerShop.db”)

llm = OpenAI(temperature=0, verbose=True)

# 创建SQL Agent

agent_executor = create_sql_agent(

llm=llm,

toolkit=SQLDatabaseToolkit(db=db, llm=llm),

verbose=True,

agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,

)

# 使用Agent执行SQL查询

response = agent_executor.run(“哪种鲜花存货多?”)

图片

可以看出来,其第一个Action为使用工具sql_db_list_tables查询所有的表格,之后再是进行sql查询,这样一步步的搜索得到结果。

这样我们总结一下今天的内容

主要是介绍了下数据库和llm的集成

其具有方便不具有专业数据库使用知识的人员对数据库及性能查询

可以利用大模型直接和数据进行交互

这也是将大模型和现在数据开发良好集成的一种方式。

发表评论

邮箱地址不会被公开。 必填项已用*标注