前言
当我们在做项目开发时,数据库设计是项目早期的核心工作之一。我们要考虑业务需要用到的表、关联、索引,并预想出未来核心需求或易产生瓶颈的SQL
。当这些事情做完,就可以喝杯咖啡,到前台摸鱼会儿了...
如果你是刚入门数据库学习,也许掌握并熟练使用结构化查询语言SQL
有些难度。然而在AIGC时代,我们拥有了一个全新的编程范式
, NLP和大模型作为编程助理,让我们可以快介入复杂数据库业务。我们只需要设计好相应的Prompt
,LLM
就能理解,并给出SQL
,让我们去执行。现在在github 上有挺多的TextToSQL的AIGC项目,大家去看看。
对于现在入门学编程的同学来说,AIGC是提升学习力的好工具。在学习每一项编程技能时,我们都可以去想想,去找找,AIGC优化学习路线或工作思路的方法。
AIGC 新的数据库查询范式
上图将是本文的核心,是AIGC重构传统数据库查询业务的流程图。
首先,数据库查询业务的开始端回归文本表达,这得益于LLM的自然语言处理能力。这非常重要,随着大模型能力的提升和Agent的产品力,未来与数据库交互,甚至管理,会由销售、经理等非技术人员来做,极大降低了门槛,AIGC也是通过这种方式进入一切行业。接着,LLM在理解了Question的数据需求后,生成SQL, 并通过LangChain等开发的SQL Agent交给数据库执行,执行结果再由LLM进行处理(比如output格式),最后,用户得到了结果。这就是现在非常流行的Agent概念,这里是SQL Agent,重构原来比较专业,复杂的数据库流程。
- SQL Agent
AI应用的开发,就是把之前的业务转成AI Agent来实现。简单非常多,将LLM能力发挥好。使用SQL Agent, 用户既不需要知道数据库的结构,也不需要会写SQL。我们只需要talk with 我们的SQL Agent, 就可以得到所需的结果。
创建数据表
假设我们想做一个老喻干货
的项目。我们选用SQLite,因为它是轻量级的磁盘文件数据库,没有复杂的服务器布署,非常适合初创项目使用。虽然SQLite是轻量级的,但它支持大部分SQL特性,如事务、触发器和视图等。因此,它非常适合我们需要保存数据但不需要大型数据库系统的移动应用或Web应用。
Python内置了sqlite3模块,可以直接使用。
python
# 导入sqlite3库, python 内置
import sqlite3
# 连接到数据库
conn = sqlite3.connect('DryGood.db')
cursor = conn.cursor()
# 执行SQL命令来创建Flowers表
cursor.execute('''
CREATE TABLE DryGoods (
ID INTEGER PRIMARY KEY,
Name TEXT NOT NULL,
Type TEXT NOT NULL,
Source TEXT NOT NULL,
PurchasePrice REAL,
SalePrice REAL
);
''')
# 插入5种干货的数据
dry_goods = [
('海带', 'DryFood', '辽宁', 5.2, 8.9),
('香菇', 'DryFood', '广东', 26.5, 33.2),
('木耳', 'DryFood', '山东', 34.6, 44.2)
]
for item in dry_goods:
cursor.execute('''
INSERT INTO DryGoods (Name, Type, Source, PurchasePrice, SalePrice)
VALUES (?, ?, ?, ?, ?);
''', item)
# 提交更改
conn.commit()
# 关闭数据库连接
conn.close()
首先,我们连接到数据库DryGood,接着创建了一个数据表,DryGoods, 包启ID、类型、产地、进价、货价等字段,还可以有其它的, 此处省略。接着准备了一些初始化数据,循环插入数据表。完成后,关闭数据库的连接。
LangChain来接管数据库
LangChain
数据库查询功能还处于实验阶段,我们需要安装langchain-experimental
,相应代码:
pip install langchain-experimental
好,神奇的一刻要开始了,LangChain
为我们准备了SQLDatabaseChain
来完成该工作。
ini
# SQLDatabase可以让我们连接数据库
from langchain.utilities import SQLDatabase
# 使用OpenAI大模型
from langchain.llms import OpenAI
# SQLDatabaseChain chain 任务
from langchain_experimental.sql import SQLDatabaseChain
# 连接到DryGood数据库
db = SQLDatabase.from_uri("sqlite:///DryGood.db")
# 创建llm 实例
llm = OpenAI(temperature=0, verbose=True)
# 创建SQLChain实例,目前还在实验阶段
db_chain = SQLDatabaseChain.from_llm(llm, db, api_key='' verbose=True)
# 运行与干货运营相关的问题
response = db_chain.run("有多少种不同的干货?")
print(response)
response = db_chain.run("平均销售价格是多少?")
print(response)
db_chain.run() 查询了一些与干货运营相关的问题,Chain会将这些自然语言转换成SQL语句,并查询数据库,拿到查询结果后,又转换成自然语言输出。下图看输出即可理解。
上Agent
除了通过SQLDatabaseChain
完成数据库LLM查询,LangChain还提供了SQL Agent也能完成。在早期,我是这样理解的,LangChain里的Chain是将某种具体任务和LLm结合的工作方式,当某些工作成为一个产品或业务场景使用比较频繁时,LangChain就会推出相应的Agent,来展现魔法。
相比较Chain, SQL Agent 有更强大的能力,比如它肯有更强的纠错能力,数据库操作出错时,它会重新生成并执行新的查询。
ini
from langchain.utilities import SQLDatabase
from langchain.llms import OpenAI
# sql agent
from langchain.agents import create_sql_agent
# 工具包,可以创建并执行查询 检索语法 等
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.agents.agent_types import AgentType
# 连接到FlowerShop数据库
db = SQLDatabase.from_uri("sqlite:///DryGood.db")
llm = OpenAI(temperature=0, verbose=True, openai_sdk='')
# 创建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查询
questions = [
"有多少种干货?",
"平均销售价格是多少?",
]
for question in questions:
response = agent_executor.run(question)
print(response)
输出以agent的感觉来了,让我想起来了AutoGen。
总结
LangChain
通过SQLDatabaseChain
,调用大模型,神奇地完成了从自然语言查询任务描述到自然语言的新型SQL查询范式。- LangChain Agent 实力强大, textToSQL, 可以开启这个场景的深度学习了。