当前位置:   article > 正文

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

langchain sqlchain

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

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

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

1.准备工作

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

  1. pip install langchain
  2. pip install openai
  3. pip install psycopg2

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

  1. from langchain import OpenAI, SQLDatabase
  2. 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文件中,以便更好地管理和保护密钥和密码。

  1. username = "database username"
  2. password = "database password"
  3. host = "local host or remote host address"
  4. port = "host port"
  5. mydatabase = "database name"

现在设置数据库的连接:

  1. pg_uri = f"postgresql+psycopg2://{username}:{password}@{host}:{port}/{mydatabase}"
  2. 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')

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

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

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

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

4.运行查询

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

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

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

  1. > Entering new  chain...
  2. Table names to use:
  3. ['zillow_rent''redfin_median_sale_price''redfin_new_listings''renthub_median_rent']
  4. > Entering new  chain...
  5. 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.
  6. The question:
  7. what is the average rent price in chicago in nov 2022 according to redfin?
  8. SQLQuery:SELECT AVG(metric_value) AS average_rent_price
  9. FROM renthub_median_rent
  10. WHERE location_name = 'Chicago' AND period_start >= '2022-11-01' AND period_end <= '2022-11-30' AND property_type = 'Apartment Building';
  11. SQLResult: [(2259.0,)]
  12. Answer:The average rent price in Chicago in November 2022 according to Redfin is $2,259.
  13. > Finished chain.

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

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

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

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

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

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号