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

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

时间:2024-04-02 20:59:12浏览次数:22  
标签:chain 数据库 question LangChain OpenAI 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,虽然可以提高查询的准确性,但同时也会大大增加响应时间。

 

标签:chain,数据库,question,LangChain,OpenAI,LLM,SQL
From: https://blog.csdn.net/csdn1561168266/article/details/137289841

相关文章

  • 《从0到1:CTFer成长之路》题目-SQL注入-2
    《从0到1:CTFer成长之路》题目SQL注入-2:题目类型:web题目描述:打开靶机,出现下面这种界面:我们访问login.php:我们再访问一下user.php:解题方法:这里我们知道login.php是一个后台管理系统的登陆界面,user.php显示的是一句话,看了一下user.php的源码并没有发现什么有用的信息,根据......
  • MySQL、Redis 和 Zookeeper 实现分布式锁方法及优缺点
    MySQL、Redis和Zookeeper都可以用来实现分布式锁,每种技术都有其特定的实现方法以及各自的优缺点。MySQL分布式锁实现方法在MySQL中实现分布式锁通常涉及到使用数据库表。可以创建一个专用的锁表,并利用行的唯一性(例如利用唯一索引)来实现锁机制。使用基于事务的 FORUP......
  • Flink Sql 的查询
    一、DataGen& Print        (1)创建数据生成器源表CREATETABLEsource(    idINT,    tsBIGINT,    vcINT)WITH(    'connector'='datagen',    'rows-per-second'='1',    'fields.id.kind'='ran......
  • docker下mysql连接数修改后不生效问题的解决
    使用容器的方式使用mysql,在创建mysql容器的时候,映射了配置文件的路径(我映射的路径是:/home/env/mysql/config/),当修改了路径中配置文件中的最大连接数后,重启容器后,发现参数是不生效的情况,你遇到过吗?先说结果:是权限的问题,777权限会被mysql认为是安全的问题,忽略这种文件。具体如下:......
  • 配置Linux上的MySQL
    MySQL数据库环境搭建和编程MySQL环境安装设置ubuntu环境安装mysql-server和mysql开发包,包括mysql头文件和动态库文件,命令如下:sudoapt-getinstallmysql-server=》安装最新版MySQL服务器sudoapt-getinstalllibmysqlclient-dev=》安装开发包ubuntu默认安装最新的mysq......
  • mysql基于时间的盲注,使用python爆破库名
    mysql基于时间的盲注使用python代码进行爆破库名importrequestsimporttimes=requests.session()#创建session对象后,才可以调用对应的方法发送请求。url='http://192.168.2.101/sqli-labs-master/Less-9/?id='flag=''i=0whileTrue:i=i+1low......
  • 【附源码】JAVA计算机毕业设计智慧点餐系统(springboot+mysql+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的快速发展和互联网的普及,人们的生活方式发生了深刻的变化。特别是在餐饮行业,传统的点餐方式已经无法满足现代消费者对于便捷性、个性化......
  • java计算机毕业设计(附源码)医院新型冠状病毒疫苗接种管理系统(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义在当今全球疫情的背景下,新型冠状病毒疫苗的接种成为了防控疫情的重要手段。然而,由于疫苗接种人群广泛,且接种过程复杂,需要记录的信息量大,因此,传统的人工管理方式已......
  • java计算机毕业设计(附源码)医院薪酬管理系统(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在现代医疗体系中,医院作为提供专业医疗服务的核心机构,其运营效率和服务质量直接影响着公众健康和社会福祉。医院薪酬管理系统是确保医疗人员得到合理报酬......
  • java计算机毕业设计(附源码)医院药品管理系统(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义在当今社会,随着医疗技术的不断发展和人们健康意识的提高,医院药品管理系统的重要性日益凸显。药品管理作为医疗服务的核心环节之一,对于确保患者用药安全、提高医疗......