连接数据库——结构化查询方法

110 阅读3分钟

像我们之前说的RAG,都是通过自然语言,去查询相似的文本,并且给出回答,但是对于编程语言,或者SQL语句,我们无法通过一句话去查询出对应的内容。例如数据库中存着小明同学的成绩,你当然可以直接传入查询 “查询小明同学成绩” ,大模型会根据文本相似度找出对应内容,然后加入prompt,在某些时候答案也许是正确的。但是对于数据库查询,我们不希望会出错,因此不能容忍自然语言可能出错的情况。当你想从一个数据库中提取信息或进行某种操作时,你需要使用这种特定的语言明确地告诉计算机你的要求。这不仅需要我们深入了解正在使用的技术,还需要对所操作的数据有充分的了解。

就比如数据库里的条目,而不是文本数据,如果要做embedding再相似度查询,那属于是脱裤子放屁了。这时候数据库即相当于一个工具,大模型生成查询语句,直接调用查询工具,查询的结果返回给模型。模型收到结果后,可以直接返回结构化数据,也可以用自然语言解析后回答问题。

# 导入langchain的实用工具和相关的模块
from langchain.utilities import SQLDatabase
from langchain.llms import OpenAI
from langchain_experimental.sql import SQLDatabaseChain

# 连接到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)

response = db_chain.run("哪种鲜花的存货数量最少?")
print(response)

response = db_chain.run("平均销售价格是多少?")
print(response)

response = db_chain.run("从法国进口的鲜花有多少种?")
print(response)

response = db_chain.run("哪种鲜花的销售量最高?")
print(response)

我们只需要导入SQLDatabaseChain,Langchain就可以自动根据我们传入的大模型和数据库,自从完成数据库的检索查询。

image.png

可以看到,查询首先将用户请求,转换为SQL查询语句,然后将查询结果返回到LLM,LLM最后给出正确答案。

这是一种从“告诉计算机要做什么”的编程范式向“告诉计算机我们想要什么”的范式的转变。

这样的转变使得更多非专业人士,也能使用自然语言进行数据库查询,提高了效率,并且LLM产生的错误也许会更低,当然前提是prompt要表达正确。

但是同时也有一些缺点,例如如果问题是模糊的,那么LLM也难以给出正确的答案。如果我们过度依赖大模型的决策,那么我们可能失去对数据的深入了解和结果的质疑。