使用LangChain SQLChain连接LLM和SQL数据库

大家好,近年来大型语言模型(LLMs)因在多个领域的文本生成能力受到广泛关注。然而,LLMs有时会产生错误或生成无意义的文本,这种现象常被称为“幻觉”。例如,询问ChatGPT法国是什么时候赠送给立陶宛维尔纽斯电视塔的,ChatGPT可能错误地会回答“在1980年”,这与事实不符,因为法国与维尔纽斯电视塔毫无关系。

为了减少LLM在特定领域产生此类错误信息(即“幻觉”),可以将其连接到一个包含准确结构化数据的SQL数据库。通过这种方式,LLM可以专门查询这个数据库,确保所提供的信息来自一个可靠的单一来源,从而提高回答的准确性。

本文将介绍如何通过将LLM与SQL数据库结合来提高信息的准确性。文章会展示如何利用LangChain框架和Python语言,将OpenAI的GPT-3.5模型与postgres数据库相接,以实现更精确的数据检索结果。

1.准备工作

首先安装所需的包,确保机器上已经安装了postgreSQL,并且有OpenAI账户。如果需要,创建一个新的Python虚拟环境:

pip install langchain
pip install openai
pip install psycopg2

创建一个名为main.py的文件,并导入以下内容:

from langchain import OpenAI, SQLDatabase
from langchain.chains import SQLDatabaseSequentialChain

SQLDatabaseSequentialChain是一个用于查询SQL数据库的链,根据LangChain的文档,链的工作方式如下:

  • 根据查询,确定要使用的表。

  • 根据这些表,调用普通的SQL数据库链。

对于较小的数据库,可以直接使用LangChain中的SQLDatabaseChain

2.连接数据库

在将数据库连接到LLM之前,先要获得一个要连接的数据库。

由于LangChain使用SQLAlchemy连接SQL数据库,所以可以使用SQLAlchemy支持的任何SQL方言,如MS SQL、MySQL、MariaDB、PostgreSQL、Oracle SQL、Databricks或SQLite。

在示例中,使用Dataherald的postgres real_estate数据库。

使用psycopg2连接postgres数据库的字符串如下:

"postgresql+psycopg2://username:password@host:port/mydatabase"

为了简单起见,我们在main.py文件中定义配置变量。也可以设置为环境变量在一个.env文件中,以便更好地管理和保护密钥和密码。

username = "database username"
password = "database password"
host = "local host or remote host address"
port = "host port"
mydatabase = "database name"

现在设置数据库的连接:

pg_uri = f"postgresql+psycopg2://{username}:{password}@{host}:{port}/{mydatabase}"
db = SQLDatabase.from_uri(pg_uri)

3.设置LLM

由于要使用GPT-3.5,我们将使用一个OpenAI API密钥:

OPENAI_API_KEY = "your OpenAI key"

使用langchain中的OpenAI,设置LLM:

llm = OpenAI(temperature=0, openai_api_key=OPENAI_API_KEY, model_name='gpt-3.5-turbo')

(可选)除了问题本身之外,这里还提供一些关于我们希望模型如何返回回答的指示:

PROMPT = """
Given an input question, first create a syntactically correct postgresql query to run,
then look at the results of the query and return the answer.
The question: {question}
"""

最后,可以将LLM和数据库连接起来:

db_chain = SQLDatabaseSequentialChain(llm=llm, database=db, verbose=True, top_k=3)

4.运行查询

现在已经把LLM和数据库连接起来,给LLM一个提示来回答:

question = "what is the average rent price in chicago in nov 2022 according to redfin?"
# 如果没有提示,请使用db_chain.run(question)
db_chain.run(PROMPT.format(question=question))

最后可以运行程序并观察结果:

> Entering new  chain...
Table names to use:
['zillow_rent', 'redfin_median_sale_price', 'redfin_new_listings', 'renthub_median_rent']
> Entering new  chain...
Given an input question, first create a syntactically correct postgresql query to run, then look at the results of the query and return the answer.

The question:
what is the average rent price in chicago in nov 2022 according to redfin?

SQLQuery:SELECT AVG(metric_value) AS average_rent_price
FROM renthub_median_rent
WHERE location_name = 'Chicago' AND period_start >= '2022-11-01' AND period_end <= '2022-11-30' AND property_type = 'Apartment Building';
SQLResult: [(2259.0,)]
Answer:The average rent price in Chicago in November 2022 according to Redfin is $2,259.
> Finished chain.

综上所述,我们已经实现了将LLM与数据库的连接,并能够依据数据库的信息获取LLM的答案。尽管如此,这个过程仍有其局限性:

首先,在运行数据库链查询时,示例问题提供了充足的信息,满足了LLM构建SQL查询的所有要求。但在实际情况中,人们提出的问题常常缺少关键细节,导致LLM难以从庞大的数据库中提取出所有必要的信息来形成完整的答案。

其次,对于更为复杂的问题,目前的LLM还无法构建出足够复杂的SQL查询来给出有效的回答。

虽然将LLM与数据库连接可以减少错误信息的产生,也就是所谓的“幻觉”现象,但这并不能完全消除和避免“幻觉”问题。

最后,使用更高级的LLM模型如GPT-4,虽然可以提高查询的准确性,但同时也会大大增加响应时间。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python慕遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值