• 使用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虚拟环境:

    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,虽然可以提高查询的准确性,但同时也会大大增加响应时间。

     

  • 相关阅读:
    代码随想录算法训练营第十七天 | LeetCode 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和
    sealos一键部署K8S环境(sealos3.0时代教程过时了,目前已经4.0了,请移步使用Sealos一键安装K8S)
    密码学【第一节:密码学概述】
    后端跨域问题的处理
    14.PyQt5应用程序主窗口QmainWindow详解
    flink redis connector需要防止包冲突
    SwiftUI 动态岛开发教程之什么是Dynamic Island,快速完整demo
    8月SCI&SSCI期刊目录已更新,警惕这7本期刊
    mysql关于如何彻底解决和理解幻读问题
    数据分析 | Pandas 200道练习题 进阶篇(2)
  • 原文地址:https://blog.csdn.net/csdn1561168266/article/details/137289841